2014-02-19 56 views
2

當我嘗試使用getAttribute函數我得到這個錯誤:調用一個非對象的成員函數getAttribute()。它似乎是啓用mysqlnd,但我不能使用get_result(),任何想法?phpinfo說MySQLnd是活動的驅動程序或我困惑

最近這真的很困擾我。在另一篇文章@inspire回答正確,但不適合我。你可以發現,這裏:How to know if MySQLnd is the active driver?

當我贊同這一點:

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

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

無任何響應,那麼顯然即使我的phpinfo()說,這是啓用它不啓用?

要檢測其活動PDO驅動程序,創建你的MySQL PDO對象,然後:

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

當我嘗試這方面,我得到調用非對象的成員函數的getAttribute()..

任何幫助將不勝感激。提前致謝。

+1

可能重複的[如何知道MySQLnd是否是主動驅動程序?](http://stackoverflow.com/questions/1475701/how-to-know-if-mysqlnd-is-the-active-driver) – thaJeztah

回答

1

檢查是否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編譯/允許/ MySQLnd安裝有別。 PHP內部的其他客戶端,如舊的MySQL或MySQL PDO驅動程序可能仍然使用mysqld。

一種更好的方式與mysqlnd VS與MySQL的的libmysqlclient檢查mysqli的是要做到這一點:

<?php 
$hasMySQL = false; 
$hasMySQLi = false; 
$withMySQLnd = false; 

if (function_exists('mysql_connect')) { 
    $hasMySQL = true; 
    $sentence.= "(Deprecated) MySQL <b>is installed</b> "; 
} else 
    $sentence.= "(Deprecated) MySQL <b>is not</b> installed "; 

if (function_exists('mysqli_connect')) { 
    $hasMySQLi = true; 
    $sentence.= "and the new (improved) MySQL <b>is installed</b>. "; 
} else 
    $sentence.= "and the new (improved) MySQL <b>is not installed</b>. "; 

if (function_exists('mysqli_fetch_all')) { 
    $withMySQLnd = true; 
    $sentence.= "This server is using MySQLnd as the driver."; 
} else 
    $sentence.= "This server is using libmysqlclient as the driver."; 

echo $sentence; 

這工作,因爲mysqlnd provides three additional functions that work only when mysqlnd is used as the drivermysqli_fetch_all是這些函數中的一個,但是,最好不僅檢查只顯示mysqli是否已被編譯爲mysqlnd的函數,還要檢查是否顯示mysqli是否已編譯。

這將允許您向客戶端呈現更好的錯誤消息。

最後,PDO檢查需要首先定義$pdo變量。

$db = new PDO('mysql:host=localhost;dbname=<SOMEDB>', '<USERNAME>', 'PASSWORD'); 
if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) { 
    echo 'PDO MySQLnd enabled!'; 
} 
+1

當然你在發佈權威性聲明之前已經閱讀了mysql_fetch_all手冊頁? –

+0

@YourCommonSense「不回顯任何內容表明您沒有編譯/啓用/安裝mysqli,並且可能使用較舊的mysql擴展名。」 ...是的。我的意思是說,檢查mysqli_fetch_all將檢查是否爲mysqli啓用了mysqlnd,但實際上並沒有檢查在PHP提供的所有MySQL客戶端實現上是否啓用了mysqld。 – timgws

0

在phpinfo或代碼中檢查mysqlnd驅動本身沒有意義。

檢查其他API沒有意義。如果需要,您必須檢查API基於mysqlnd,而不是其他。所以,如果你需要PDO,檢查mysqli是沒有意義的。

要檢查PDO,您必須首先有一個PDO對象,,因爲錯誤消息建議