【问题标题】:Call to a member function on a non-object when using MySQLi使用 MySQLi 时调用非对象上的成员函数
【发布时间】:2013-12-01 04:27:22
【问题描述】:

我一直在做一个相对简单的项目,为了使它更容易,我决定使用this PHP 类来简化数据库连接。但是,我遇到了一些问题。

<?php
require 'Slim/Slim.php';
require_once('lib/db.php');

\Slim\Slim::registerAutoloader();

$app = new \Slim\Slim();
$db = new MysqliDb('127.0.0.1', 'root', '', 'url_shortener');

$app->get('/u/:url', function ($url) {
    $urls = $db
        ->where('short', $url)
        ->get('urls');
    //require('views/u.php');
    print_r($urls);
});

当我导航到 /u/1 时,我收到以下错误:

Fatal error: Call to a member function where() on a non-object in [my site index]

任何想法如何解决这个问题?

【问题讨论】:

    标签: php database mysqli


    【解决方案1】:

    $db 变量在您声明的匿名函数中不可用。您假设它是一个对象,但由于它没有定义,它是NULL(在函数内部)。使用闭包,要访问函数范围之外的变量,您可以使用 use 关键字授予函数权限。

    $app->get('/u/:url', function ($url) use ($db) { ... }
    

    现在$db 在函数范围内可用,您可以随意使用它。

    【讨论】:

    • 太棒了,正是我想要的。
    • @BenedictLewis:很高兴能帮上忙。干杯! :)
    • 另一个快速的问题,现在它可以输出Array ( [0] =&gt; Array ( [id] =&gt; 1 [short] =&gt; 1 [long] =&gt; [ "http://www.getbootstrap.com", "http://www.reddit.com", "http://www.bbc.com/news", "http://www.google.com" ] ) )。我现在要做的只是打印出“long”下的 URL。我试过print_r($urls['long'])print_r($urls-&gt;long),但它不起作用。正确的语法是什么?
    • @BenedictLewis:echo $urls[0]['long']; 应该这样做。此外,如果将 print_r() 包装在 &lt;pre&gt; 标记中,您可以获得数组的格式化输出,如下所示:echo '&lt;pre&gt;' . print_r($urls, true) . '&lt;/pre&gt;';
    【解决方案2】:

    你需要在你的闭包中导入 $db:

    $app->get('/u/:url', function ($url) use ($db) { ... }
    

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      相关资源
      最近更新 更多