【问题标题】:Slim Framework - PDO object created but seems not inside the scopeSlim Framework - 创建了 PDO 对象但似乎不在范围内
【发布时间】:2016-07-09 05:57:16
【问题描述】:

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

在........中的非对象上调用成员函数prepare()

以下是我的代码:

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(相关部分)

<?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 mysql pdo slim


    【解决方案1】:

    在 PHP 中,您不会在函数范围内自动使用全局变量(更多信息请参阅variable scope)。在函数内部,需要定义 $pdo 或以某种方式使其可用。我想到了几种方法:

    • 在函数 start 中使用 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');
      

    【讨论】:

    • 谢谢兄弟。它有助于! :)
    • 我已经尝试了上面的每一种方法......但我仍然收到错误 500:内部服务器错误..有什么线索吗?嗯……
    • 这可能是从解析错误到缺少 Slim 参数的任何情况。你能分享你的代码吗,例如我phpfiddle.org?
    猜你喜欢
    • 2013-04-26
    • 2018-02-13
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多