gpt4 book ai didi

php - Slim Framework - PDO 对象已创建但似乎不在范围内

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:13 24 4
gpt4 key购买 nike

当我尝试测试我的代码时出现此错误。

Call to a member function prepare() on a non-object in ........

下面是我的代码:

ConnectionStrings.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);

?>

Authentication.php (Related part)

<?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 中,您不会在函数范围内自动使用全局变量(更多信息请参见 variable scope)。在函数内部,需要定义 $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 为此使用 Pimple):

      // Store $pdo in DI container.
    $container = $app->getContainer();
    $container['database'] = $pdo;
    ...
    // Then inside route controller:
    $pdo = $this->get('database');

关于php - Slim Framework - PDO 对象已创建但似乎不在范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38278867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com