mysql - phpinfo 说 MySQLnd 是活跃的驱动程序或者我很困惑

标签 mysql pdo php mysqlnd

当我尝试使用 getAttribute 函数时出现此错误:调用非对象上的成员函数 getAttribute()。 mysqlnd 似乎已启用,但我也无法使用 get_result(),知道吗?

这件事最近一直困扰着我。在另一篇文章中@inspire 回答正确但对我不起作用。你可以在这里找到:How to know if MySQLnd is the active driver?

当我回应这个时:

<?php
$mysqlnd = function_exists('mysqli_fetch_all');

if ($mysqlnd) {
    echo 'mysqlnd enabled!';
}

什么也没有发生,所以显然它没有启用,即使我的 phpinfo() 说它已启用?

要检测它是否是事件的 PDO 驱动程序,然后创建您的 MySQL PDO 对象:

if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) {
    echo 'PDO MySQLnd enabled!';
}

当我尝试这个时,我调用了非对象上的成员函数 getAttribute()..

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

检查 mysqli_fetch_all 并不能真正描述您是否正在使用 mysqlnd。相反,它说你有 mysqli extension启用。

MySQLi 只是 PHP 早期版本中提供的 mysql 扩展的更新版本。

The mysql extension, the mysqli extension and the PDO MySQL driver can each be individually configured to use either libmysqlclient or mysqlnd

这段代码:

<?php
$mysqlnd = function_exists('mysqli_fetch_all');

if ($mysqlnd) {
    echo 'mysqlnd enabled!';
}

没有回显表明您没有使用 MySQLnd 编译/启用/安装 mysqli。 PHP 中的其他客户端,例如较旧的 mysql 或 MySQL PDO 驱动程序可能仍在使用 mysqld。

使用 mysqlnd 检查 mysqli 与使用 libmysqlclient 检查 mysql 的更好方法是:

<?php
$hasMySQL = false;
$hasMySQLi = false;
$withMySQLnd = false;

if (function_exists('mysql_connect')) {
    $hasMySQL = true;
    $sentence.= "(Deprecated) MySQL <b>is installed</b> ";
} else 
    $sentence.= "(Deprecated) MySQL <b>is not</b> installed ";

if (function_exists('mysqli_connect')) {
    $hasMySQLi = true;
    $sentence.= "and the new (improved) MySQL <b>is installed</b>. ";
} else
    $sentence.= "and the new (improved) MySQL <b>is not installed</b>. ";

if (function_exists('mysqli_fetch_all')) {
    $withMySQLnd = true;
    $sentence.= "This server is using MySQLnd as the driver.";
} else
    $sentence.= "This server is using libmysqlclient as the driver.";

echo $sentence;

这是有效的,因为 mysqlnd provides three additional functions that work only when mysqlnd is used as the driver . mysqli_fetch_all 是这些函数之一,但是,最好不仅检查仅显示 mysqli 是否已使用 mysqlnd 编译的函数,还检查显示 mysqli 是否已编译的函数。

这将使您能够向客户呈现更好的错误消息。

最后,PDO 检查需要先定义$pdo 变量。

$db = new PDO('mysql:host=localhost;dbname=<SOMEDB>', '<USERNAME>', 'PASSWORD');
if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) {
    echo 'PDO MySQLnd enabled!';
}

关于mysql - phpinfo 说 MySQLnd 是活跃的驱动程序或者我很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21889865/

相关文章:

mysql - 主键会导致mysql死锁吗?

mysql - SQL - 从具有相同 D.O.B 的不同表的两列中查找行的命令

php - mysql 获取关联数组为空错误

PHP - PDO 引用可以安全地避免 SQL 注入(inject)吗?

javascript - 授权的 JavaScript 来源

php - SQL从两个表中获取值

php - 使用 PHP 将动态菜单数据从 MySQL 数据库存储到 json 中

Mysql 连接 4 个有空行的表

javascript - 创建特定格式的 JSON 数据

php - 当图像超过 6 个时,我需要换行,我该怎么做?