How to know if MySQLnd is the active driver?

PhpMysqlMysqlnd

Php 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.)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionThe DisintegratorView Question on Stackoverflow
Solution 1 - PhpInspireView Answer on Stackoverflow
Solution 2 - PhpTim GroeneveldView Answer on Stackoverflow
Solution 3 - PhpPascal MARTINView Answer on Stackoverflow
Solution 4 - Phpmikeytown2View Answer on Stackoverflow
Solution 5 - PhpBad HabitView Answer on Stackoverflow
Solution 6 - PhpJSGView Answer on Stackoverflow