2009-09-25 77 views
51

也许这是一个明显的问题,但我想确定。如何知道MySQLnd是否为主动驱动程序?

我怎么知道它是否MySQLnd是主动驱动程序?

我运行PHP 5.3和MySQL 5.1.37。 在phpinfo()函数mysqlnd上市,但只有这个,如果我使用MySQLnd还是老司机,我不能肯定......

提取的phpinfo()输出

mysql 
MySQL Support enabled 
Active Persistent Links  0 
Active Links 0 
Client API version mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

mysqli 
MysqlI Support enabled 
Client API library version mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 
Active Persistent Links  0 
Inactive Persistent Links 0 
Active Links 26 

mysqlnd 
mysqlnd enabled 
Version  mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

PDO 
PDO support enabled 
PDO drivers  mysql 

pdo_mysql 
PDO Driver for MySQL enabled 
Client API version mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

我的m使用PDO,PDO驱动程序说mysql ...

+1

是在 “PDO驱动程序” 行说: “MySQL的”,但低于它说:“客户端API版本** ** mysqlnd 5.0.5- dev - 081106 - $ Revision:1.3.2.27 $“........ – Pacerier 2014-10-18 08:17:10

回答

54

这应该做的伎俩:

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

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

要检测其活动PDO驱动程序,创建你的MySQL PDO对象,然后:

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

谢谢。最后一些安心 – 2009-09-25 08:40:06

+2

它看起来像我有一个类似的问题,当我尝试使用getAttribute函数我得到这个错误:调用一个非对象的成员函数getAttribute()。它似乎是启用mysqlnd,但我不能使用'get_result()',任何想法? – 2014-02-19 18:45:08

+0

这个函数不够健壮,因为如果'mysqli'本身不可用,它会给出一个错误的否定结果。请参阅http://stackoverflow.com/a/22499259/632951以获得更好的版本。 – Pacerier 2014-10-18 08:44:17

8

在编译时选择驱动程序(libmysql或mysqlnd),并且可以为mysql,mysqli和pdo_mysql独立指定这两者中的每一个。

这里是对应于mysqlnd三个配置选项:

--with-mysql[=DIR]  Include MySQL support. DIR is the MySQL base 
          directory. If mysqlnd is passed as DIR, 
          the MySQL native driver will be used [/usr/local] 
    --with-mysqli[=FILE] Include MySQLi support. FILE is the path 
          to mysql_config. If mysqlnd is passed as FILE, 
          the MySQL native driver will be used [mysql_config] 
    --with-pdo-mysql[=DIR] PDO: MySQL support. DIR is the MySQL base directoy 
           If mysqlnd is passed as DIR, the MySQL native 
           native driver will be used [/usr/local] 


在你的情况下, “客户端API版本” 是 “mysqlnd 5.0.5-dev的” 两个MySQL中,mysqli的,并PDO_MYSQL。

因此,看起来你在使用mysqlnd的情况下有三种情况。

在PDO的情况下,您安装了MySQL驱动程序 - 并且该驱动程序是基于mysqlnd编译的。

+1

对不起,我没有理解你的最后一句话。 “安装了MySQL驱动程序 - 并且该驱动程序是基于mysqlnd编译的。”这意味着它使用mysqlnd或不? 顺便说一句我正在使用debian,我不想编译并丢失使用apt-get的可能性 – 2009-09-25 07:07:04

+0

PDO使用的是“drivers”:一个用于SQLite,一个用于Postgre,一个用于mssql,一个用于MySQL,.. 。对于MySQL,该驱动程序可以编译为使用libmysql或mysqlnd ;;在你的情况下,它说“mysqlnd” – 2009-09-25 10:11:27

+0

@PascalMARTIN,你是说,键“PDO驱动程序”(在他的phpinfo输出)右侧的值永远不能** mysqli **,只能是** mysql **(,postgre,sqllite等)? – Pacerier 2015-06-29 08:50:01

2

也许检查是否存在these settings?由于某种原因,phpinfo()使它们与其他ini设置不同。适用于5.4,不确定约5.3。

ini_get('mysqlnd.debug') !== false 
26

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

不附和没有迹象表明你没有的mysqli编译/启动/安装,并且可能使用的是旧mysql扩展。

一种更好的方式与mysqlnd VS与MySQL的的libmysqlclient检查mysqli的是要做到这一点:

<?php 
if (function_exists('mysql_connect')) { 
    echo "- MySQL <b>is installed</b>.<br>"; 
} else { 
    echo "- MySQL <b>is not</b> installed.<br>"; 
} 

if (function_exists('mysqli_connect')) { 
    echo "- MySQLi <b>is installed</b>.<br>"; 
} else { 
    echo "- MySQLi <b>is not installed</b>.<br>"; 
} 

if (function_exists('mysqli_get_client_stats')) { 
    echo "- MySQLnd driver is being used.<br>"; 
} else { 
    echo "- libmysqlclient driver is being used.<br>"; 
} 

这工作,因为mysqlnd provides three additional functions that work only when mysqlnd is used as the driver

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

$dbHost = "localhost"; 
$dbUser = "root"; 
$dbPass = "password"; 
$dbName = "database"; 

$pdo = new PDO('mysql:host='.$dbHost.';dbname='.$dbName, $dbUser, $dbPass); 
if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) { 
    echo '- PDO MySQLnd <b>is enabled</b>.<br>'; 
} else { 
    echo '- PDO MySQLnd <b>is not enabled</b>.<br>'; 
} 
?> 
+0

未定义的变量:在第8行中的C:\ Dev \ Billing \ checkmysqlnd.php中的句子。或者需要在上面放置'$ sentence =“”'或将第一个'if/else'从'。='更改为'='..仍然有效只是抛出错误 – 2014-09-17 17:11:48

+0

谢谢@ J-Dizzle。这是现在修复:) – timgws 2014-09-18 01:02:10

+0

这完美谢谢工作!改进的格式:) – emotality 2016-02-25 05:53:37

7

这就是我一直在寻找

<?php 
if (extension_loaded('mysqlnd')) { 
} 
?> 
+0

'mysqlnd'可能会被加载但尚未被mysql(i)/ pdo_mysql – Artefacto 2018-01-24 17:23:38

相关问题