【问题标题】:phpinfo says MySQLnd is the active driver or am i confusedphpinfo 说 MySQLnd 是活动驱动程序还是我很困惑
【发布时间】:2014-03-20 08:05:19
【问题描述】:

当我尝试使用 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()..

任何帮助将不胜感激。提前致谢。

【问题讨论】:

标签: php mysql pdo phpinfo mysqlnd


【解决方案1】:

检查mysqli_fetch_all 并不能真正描述您是否使用mysqlnd。相反,它表示您启用了mysqli extension

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

mysql 扩展、mysqli 扩展和 PDO MySQL driver 都可以单独配置为使用 libmysqlclient 或 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 drivermysqli_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_fetch_all 手册页吗?
  • @YourCommonSense “没有任何回应表明您没有编译/启用/安装 mysqli,并且可能正在使用较旧的 mysql 扩展。” ... 是的。我的意思是,检查 mysqli_fetch_all 将检查是否为 mysqli 启用了 mysqlnd,但它实际上并没有检查是否在 PHP 可用的所有 MySQL 客户端实现上启用了 mysqld..
【解决方案2】:

在 phpinfo 或代码中检查 mysqlnd 驱动程序本身是没有意义的。

检查其他 API 也没有意义。您必须检查如果需要 API 是基于 mysqlnd,而不是其他的。所以,如果你需要 PDO,检查 mysqli 是没有意义的。

要检查 PDO,您必须首先拥有一个 PDO 对象,如错误消息所示

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2013-09-05
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多