【问题标题】:Why is mysqli_query() breaking? [mysqli_query(): Couldn't fetch mysqli]为什么 mysqli_query() 会中断? [mysqli_query(): 无法获取 mysqli]
【发布时间】:2016-09-07 02:33:33
【问题描述】:

Mysqli_query 包含在我的代码中的以下封装函数中:

function QueryDatabase($query){
error_log("Database Line 134: " . memory_get_usage(true));
$QueryResult = NULL;

    switch($this->RDBType){
        case 'MySQL':
            error_log('MySQLi link IS Valid?:'); error_log(boolval($this->link));
            error_log(get_class($this->link));
            error_log("Database Line 139: " . memory_get_usage(true));
            error_log("Performing Query: '" . $query . "'");
            $QueryResult = mysqli_query($this->link, $query);
            error_log("Result: " . gettype($QueryResult));
            error_log("Database Line 141: " . memory_get_usage(true));
            break;
        case 'PostGreSQL':
        default:
            break;
    }
error_log("Database Line 147: " . memory_get_usage(true));  
return $QueryResult;
}

PHP 错误日志如下所示:

[11-May-2016 17:04:00 Europe/Berlin] 数据库行 134: 262144

[11-May-2016 17:04:00 Europe/Berlin] MySQLi 链接是否有效?:

[2016 年 5 月 11 日 17:04:00 欧洲/柏林] 1

[11-May-2016 17:04:00 Europe/Berlin] mysqli

[11-May-2016 17:04:00 Europe/Berlin] 数据库行 139: 262144

[11-May-2016 17:04:00 Europe/Berlin] 执行查询:'SELECT * FROM 扫描 INNER JOIN 地块 关于 scans.scansId = landlot.scansId INNER JOIN区 在 scans.scansid = 区.scansId INNER JOIN 街道名称 在 scans.scansid = streetname.scansId WHERE Lot = 1;'

[11-May-2016 17:04:00 Europe/Berlin] PHP 警告:mysqli_query(): 无法获取 mysqli I:\xampp\htdocs\GLS_DBSearchProject\Database.php 在第 145 行

[11-May-2016 17:04:00 Europe/Berlin] 结果:NULL

[11-May-2016 17:04:00 Europe/Berlin] 数据库行 141: 262144

[11-May-2016 17:04:00 Europe/Berlin] 数据库行 147: 262144

[11-May-2016 17:04:00 Europe/Berlin] PHP 通知:尝试获取 非对象的属性 我:\xampp\htdocs\GLS_DBSearchProject\DatabaseSearch.php 在第 86 行

[11-May-2016 17:04:00 Europe/Berlin] 数据库行 134: 262144

[11-May-2016 17:04:00 Europe/Berlin] MySQLi 链接是否有效?:

[2016 年 5 月 11 日 17:04:00 欧洲/柏林] 1

[11-May-2016 17:04:00 Europe/Berlin] mysqli

[11-May-2016 17:04:00 Europe/Berlin] 数据库行 139: 262144

[11-May-2016 17:04:00 Europe/Berlin] 执行查询:'SELECT * FROM 扫描 INNER JOIN 地块 关于 scans.scansId = landlot.scansId INNER JOIN区 在 scans.scansid = 区.scansId INNER JOIN 街道名称 on scans.scansid = streetname.scansId WHERE Lot = 1 LIMIT 10 OFFSET 0;'

[11-May-2016 17:04:00 Europe/Berlin] PHP 警告:mysqli_query(): 无法获取 mysqli I:\xampp\htdocs\GLS_DBSearchProject\Database.php 在第 145 行

[11-May-2016 17:04:00 Europe/Berlin] 结果:NULL

[11-May-2016 17:04:00 Europe/Berlin] 数据库行 141: 262144

[11-May-2016 17:04:00 Europe/Berlin] 数据库行 147: 262144

[11-May-2016 17:04:00 Europe/Berlin] PHP 致命错误:调用 非对象上的成员函数 fetch_assoc() I:\xampp\htdocs\GLS_DBSearchProject\DatabaseSearch.php 在第 126 行

我真的很困惑为什么 mysqli_query 无法返回结果。我在整个项目中多次使用了我的 QueryDatabase() 函数,直到现在都没有遇到任何问题。我有一个 PHPUnit 测试,显示我的 QueryDatabase() 函数似乎工作正常,所有其他迹象都表明在 mysqli_query() 函数调用期间发生了问题。

我已广泛检查以确保数据库链接($this->link 中包含的 mysqli 对象)有效并指向适当的数据库。我还通过手动将其复制并粘贴到 mysql 查询浏览器中来检查以确保我的查询按预期工作。

如果我的查询有效并且我的数据库链接有效,为什么 mysqli_query() 会失败?

编辑:我从未关闭任何数据库连接。所以数据库连接不应该被关闭

【问题讨论】:

  • 列名区分大小写? scans.scansIdscans.scansid
  • @MarkBaker 查询工作正常——我得到相同的结果——无论查询浏览器中的大小写如何。但是我需要花一点时间在代码中对此进行测试,因为我的查询是按程序生成的。
  • 这段代码非常令人担忧。 mysqli 最重要的特性之一是准备好的语句,看起来这只是接受原始查询并盲目地执行它们。如果你想要 MySQL 和 Postgres use PDO 之间的可移植性。如果您想要更高级别的数据库层,请使用像 DoctrinePropel 这样的 ORM。

标签: php mysql debugging mysqli


【解决方案1】:

您的日志没有任何问题。

一个活动的 mysqli 实例并不意味着有一个活动的 mysql 连接。与 PDO 不同,您可以关闭 mysql 连接,但可以使用 mysqli 对象。所以错误信息说:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli('localhost','root','','test');
$conn->query("SELECT 1");
$conn->close();
var_dump(get_class($conn));
$conn->query("SELECT 1");

会给你预期的输出:

字符串(6)“mysqli”
警告:mysqli::query(): Couldn't fetch mysqli in mysqli.php on line 10

你必须找到你的代码关闭连接的地方并修复它。

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 2018-09-14
    • 2014-09-18
    • 2023-03-29
    • 2016-09-04
    • 1970-01-01
    相关资源
    最近更新 更多