Php 使用MySQLi时对非对象的成员函数的调用

Php 使用MySQLi时对非对象的成员函数的调用,php,database,mysqli,Php,Database,Mysqli,我一直在做一个相对简单的项目,为了让它更简单,我决定使用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->ge

我一直在做一个相对简单的项目,为了让它更简单,我决定使用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);
});

有没有办法解决这个问题?

您需要在闭包中导入$db:

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

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

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

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

太棒了,正是我想要的。@BenedictLewis:很高兴能提供帮助。干杯!:)还有一个快速的问题,现在它可以输出
Array([0]=>Array([id]=>1[short]=>1[long]=>http://www.getbootstrap.com", "http://www.reddit.com", "http://www.bbc.com/news", "http://www.google.com“])
。我现在要做的就是在“long”下打印URL。我试过
print\r($url['long'])
print\r($url->long)
,但都不起作用。正确的语法是什么?@BenedictLewis:
echo$url[0]['long']应该这样做。此外,如果将
print\r()
包装在
标记中,则可以获得数组的格式化输出,如:
echo'。打印($URL,true)。“”
$app->get('/u/:url', function ($url) use ($db) { ... }