2009-09-25 16 views
51

多分それは明らかな質問ですが、私は確信しています。MySQLndがアクティブドライバであるかどうかを知る方法?

MySQLndがアクティブなドライバであるかどうかをどのように知ることができますか?

私はPHP 5.3とMySQL 5.1.37を実行しています。 phpinfoで ()mysqlndがリストされているが、私はMySQLndや古いドライバを使用している場合のみ、これで私は確認することはできません...私は「

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 $ 

のphpinfo()の出力の

エキスPDOドライバを使用しています。

+1

探していたものであるはい "PDOドライバ" 行は "mysqlの" と言うが、その下には、「クライアントAPIバージョンを語る** mysqlnd ** 5.0.5- dev - 081106 - $改訂:1.3.2.27 $ "........ – Pacerier

答えて

54

これはトリックを行う必要がありますthese settingsが存在する場合

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

ありがとうございます。最後にいくつかの心の平和 –

+2

私は同様の問題を抱えているようですが、getAttribute関数を使用しようとすると、次のようなエラーが発生します。非オブジェクト上のメンバ関数getAttribute()を呼び出します。 mysqlndは有効になっているようですが、私は 'get_result()'を使用することはできません。 –

+0

この関数は、 'mysqli'自体が利用できない場合に偽陰性を与えるので、十分に堅牢ではありません。より良いバージョンについては、http://stackoverflow.com/a/22499259/632951を参照してください。 – Pacerier

8

ドライバ(libmysqlまたはmysqlnd)はコンパイル時に選択され、mysql、mysqli、およびpdo_mysqlに対してこれらの2つのそれぞれを独立して指定できます。

--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の、そして:ここでは

はmysqlndに対応する3つのconfigureオプションですpdo_mysql。

したがって、3つのケースでmysqlndを使用しているようです。

PDOの場合、MySQLドライバがインストールされており、そのドライバはmysqlndに基づいてコンパイルされています。

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

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

を検出するためであれば、そのアクティブPDOドライバ、そしてあなたのMySQL PDOオブジェクトを作成します:

+1

申し訳ありませんが、私はあなたの最後の文を理解していません。 "MySQLドライバがインストールされています - それはmysqlndに基づいてコンパイルされています。"それはmysqlndを使用しているかどうかを示していますか? 私はDebianを使用しています。私はコンパイルしてapt-getを使う可能性を失いたくはありません。 –

+0

PDOは "ドライバ"を使用しています:SQLite用、Postgre用、mssql用、そして、MySQLの場合、そのドライバはlibmysqlまたはmysqlnd;を使用するようにコンパイルできます。あなたのケースでは、 "mysqlnd"と書かれています –

+0

@PascalMARTIN、キーの右側にある値(PDOドライバのphpinfoの出力)は決して** mysqli **になることはできません** mysql **(postgre、sqlliteなど)? – Pacerier

2

はたぶんチェック! phpinfo()は何らかの理由で他のini設定とは異なるレンダリングを行います。 5.4については動作しますが、5.3については不明です。あなたがmysqlndを使用している天気を本当に説明していませんmysqli_fetch_allの確認

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

。むしろ、あなたは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拡張子を使用している場合がありますことを示唆しています。 libmysqlclientのでmysqlの対mysqlndと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'を'。= 'から'=' ..まだ動作しているだけでエラーが発生します –

+0

Thanks @ J-Dizzle。これは今修正されました:) – timgws

+0

これは完璧に感謝しました!改良された書式設定:) – emotality

7

これは私が

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

mysql(i)/ pdo_mysqlによって 'mysqlnd'がロードされていても使用されていない可能性があります – Artefacto

関連する問題