How to know if MySQLnd is the active driver?
PhpMysqlMysqlndPhp Problem Overview
Maybe it's an obvious question, but I want to be sure.
How can i know if it MySQLnd is the active driver?
I'm runing PHP 5.3 and MySQL 5.1.37. In phpinfo() mysqlnd is listed but only with this I can't be sure if I'm using MySQLnd or the old driver...
Extract of phpinfo() output
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 $
I'm using PDO, and PDO driver says mysql...
Php Solutions
Solution 1 - Php
> Warning! This method is unreliable and does not work since PHP 8.1
If you are accessing via mysqli
, this should do the trick:
<?php
$mysqlnd = function_exists('mysqli_fetch_all');
if ($mysqlnd) {
echo 'mysqlnd enabled!';
}
To detect if its the active PDO
driver, create your MySQL PDO object then:
if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) {
echo 'PDO MySQLnd enabled!';
}
Solution 2 - Php
Checking for mysqli_fetch_all
does not really describe wether you are using mysqlnd
. Rather, it says that you have the mysqli extension enabled.
MySQLi is simply an updated version of the mysql
extension that was provided in earlier versions of PHP.
> The mysql
extension, the mysqli
extension and the PDO MySQL driver
can each be individually configured to use either
> libmysqlclient or mysqlnd
This code:
<?php
$mysqlnd = function_exists('mysqli_fetch_all');
if ($mysqlnd) {
echo 'mysqlnd enabled!';
}
not echoing nothing suggests that you don't have mysqli compiled/enabled/installed, and might be using the older mysql
extension.
A better way to check for mysqli with mysqlnd vs mysql with libmysqlclient is to do this:
<?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>";
}
This works because mysqlnd provides three additional functions that work only when mysqlnd is used as the driver.
Finally, the PDO check needs to have the $pdo
variable defined first.
$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>';
}
?>
Solution 3 - Php
The driver (libmysql or mysqlnd) is choosen at compile-time, and each one of those two can be specified independatly for mysql, mysqli, and pdo_mysql.
Here are the three configure options that correspond to 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]
In your case, the "Client API version" is "mysqlnd 5.0.5-dev" for both mysql, mysqli, and pdo_mysql.
So it seems you ahre using mysqlnd in either three cases.
In the case of PDO, you have the MySQL driver installed -- and that one is compiled based on mysqlnd.
Solution 4 - Php
This is what I was looking for
<?php
if (extension_loaded('mysqlnd')) {
}
?>
Solution 5 - Php
Maybe check if these settings exist? phpinfo() renders them differently from other ini settings for some reason. Works for 5.4, not sure about 5.3.
ini_get('mysqlnd.debug') !== false
Solution 6 - Php
phpinfo() in the beginning lists the "Configure Command" used to compile PHP.
As they state in other answers mysqlnd is 1 (the default) of 2 choices during the php install/compile process.
My phpinfo Configure Command for 7.0.33 is:
'./configure' '--prefix=/opt/php70' '--with-libdir=lib64' '--enable-bcmath' '--enable-calendar' '--enable-dbase' '--enable-exif' '--enable-ftp' '--enable-gd-native-ttf' '--enable-intl' '--enable-libxml' '--enable-mbstring' '--enable-pdo' '--enable-soap' '--enable-sockets' '--enable-sqlite-utf8' '--enable-wddx' '--enable-zip' '--with-bz2' '--with-curl' '--with-freetype-dir' '--with-gd' '--with-gettext' '--with-gmp' '--with-imap' '--with-imap-ssl' '--with-jpeg-dir=/usr' '--with-kerberos' '--with-mcrypt' '--with-mhash' '--with-mssql' '--with-mysql=/usr' '--with-mysql-sock=/var/lib/mysql/mysql.sock' '--with-mysqli=/usr/bin/mysql_config' '--with-openssl' '--with-pdo-mysql=/usr' '--with-pdo-pgsql=/usr' '--with-pgsql=/usr' '--with-pdo-sqlite' '--with-png-dir' '--with-pspell' '--with-sqlite' '--with-system-tzdata' '--with-tidy' '--with-unixODBC' '--with-xmlrpc' '--with-xsl' '--with-zlib'
Note --with-mysqli=/usr/bin/mysql_config' '
and --enable-mysqlnd' ' (Not in this one but a readout on a 5.6 php build)
--with-mysqli= is pointing to a directory meaning it is using libmysqlclient If it was mysqlnd instead then it is using the native driver.
For more info on this <http://php.net/manual/en/mysqlinfo.library.choosing.php>
(I know this is way old however this knowledge would have saved me hours of tech support debate and I seen this first.)