phpinfo说MySQLnd是活跃的驱动程序还是我很困惑

时间:2014-02-19 19:01:53

标签: php mysql pdo phpinfo 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()。

非常感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分: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。

使用libmysqlclient通过mysqlnd vs mysql检查mysqli的更好方法是:

<?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!';
}

答案 1 :(得分:0)

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

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

要检查PDO,您必须先拥有PDO对象,显示错误消息