瘦框架 - 已创建PDO对象,但似乎不在范围内


Slim Framework - PDO object created but seems not inside the scope

当我尝试测试我的代码时,我收到此错误。

在 ..... 中的非对象上调用成员函数 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');