2009-09-25 76 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

相關問題