当我尝试测试我的代码时,我收到此错误。
在 ..... 中的非对象上调用成员函数 prepare()
以下是我的代码:
连接字符串.php
<?php
$config = require dirname(__FILE__).'../../Configs/Local.php';
$host = '127.0.0.1';
$db = 'CWW_SecurityDB';
$user = $config['db']['user'];
$pass = $config['db']['password'];
$charset = 'utf8';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);
?>
身份验证.php(相关部分)
<?php
use 'Psr'Http'Message'ServerRequestInterface as Request;
use 'Psr'Http'Message'ResponseInterface as Response;
require dirname(__FILE__).'../../../ConnectionStrings.php';
$app -> group('/authentication', function(){
$this -> Get('/login',
function($request, $response, $args)
{
$Username = $request->getQueryParams()['Username'];
$Password = $request->getQueryParams()['Password'];
$sql = 'CALL SEC.usp_GetSecurityUsers(:Username)';
$stmt = $pdo -> prepare($sql);
$stmt -> bindParam(':Username', $Username, PDO::PARAM_STR);
$stmt -> execute();
.
.
. (just a try out on the codes)
问题应该出在行 $stmt = $pdo -> prepare($sql);。但是,几个小时后我真的想不通。我读过其他一些类似问题的帖子,表明$pdo超出了范围。但是在这种情况下,我的$pdo究竟是如何超出范围的?有人可以启发我吗?提前谢谢你们:)
在 PHP 中,函数作用域中没有自动可用的全局变量(更多关于变量作用域)。在函数内部,需要定义或以某种方式提供$pdo。我想到了几种方法:
- 在函数启动中使用
global $pdo;
- 非常老派,通常不会是 php 专业人士的首选方式。 - 用
$GLOBALS['pdo']
替换$pdo
- 几乎相同的事情,有点像 PHP3 风格的:) -
将$pdo传递到闭包的范围:
$app->group('/authentication', function() use ($pdo) { $this->Get('/login', function($request, $response, $args) use ($pdo) {
-
通过依赖容器获取$pdo(Slim3使用Pipple
):// Store $pdo in DI container. $container = $app->getContainer(); $container['database'] = $pdo; ... // Then inside route controller: $pdo = $this->get('database');