当我尝试使用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()。
非常感谢任何帮助。提前谢谢。
答案 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 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!';
}
答案 1 :(得分:0)
在phpinfo或代码中检查mysqlnd驱动程序本身是没有意义的。
检查其他API也没有意义。你必须检查如果需要API 是基于mysqlnd,而不是其他的。所以,如果你需要PDO,检查mysqli是没有意义的。
要检查PDO,您必须先拥有PDO对象,显示错误消息。