2010-03-30 114 views
0

我在PHP中編寫了一個腳本,用於從MySQL數據庫讀取數據。我是PHP新手,我一直在使用PDO庫。我一直在使用WAMP服務器2在Windows機器上開發,並且一直運行良好。但是,當我將腳本上傳到將要使用的LINUX服務器時,在運行腳本時出現以下錯誤。調用未定義的函數查詢() - 在PHP中使用PDO

Fatal error: Call to undefined function query() 

這是錯誤是發生了線......

foreach($dbconn->query($sql) as $row) 

變量$ dbconn首先在我的dblogin.php規定包括我下面的清單文件。

<?php 
// Login info for the database 
$db_hostname = 'localhost'; 
$db_database = 'MY_DATABASE_NAME'; 
$db_username = 'MY_DATABASE_USER'; 
$db_password = 'MY_DATABASE_PASSWORD'; 
$dsn = 'mysql:host=' . $db_hostname . ';dbname=' . $db_database . ';'; 

try 
{ 
    $dbconn = new PDO($dsn, $db_username, $db_password); 
    $dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch (PDOException $e) 
{ 
    echo 'Error connecting to database: ' . $e->getMessage(); 
} 
?> 

發生錯誤我定義爲一個超全局變量這樣的數據庫連接的功能裏面...

global $dbconn; 

我有點困惑,發生了什麼事,因爲所有的運作良好我的開發機器。我想知道是否安裝了PDO庫,但是我認爲它是默認安裝的,作爲PHP v5的一部分。

腳本運行在Ubuntu(5.0.51a-3ubuntu5.4)機器上,PHP版本是5.2.4。謝謝你的任何建議。我真的迷失了這一點。

回答

0

始終,但始終與您的生產平臺在同一平臺上開發。盡力反映服務器軟件的版本(PHP,MySQL等)。安裝之間總會有區別,尤其是在不同的操作系統平臺處理事物的方式上。在每臺服務器上使用舊的'phpinfo()'腳本來比較差異(如果有的話)。

無論如何,即使Win和Linux平臺都具有完全相同的所有版本,您是否檢查過您的配置?換句話說,DSN中的MySQL主機名是本地MySQL主機(鏈接到Win開發平臺)還是Ubuntu服務器使用的實際主機?或者在兩種情況下它們都是「本地主機」?仔細檢查一下。另外,你是否已經鏡像了兩臺服務器上的所有數據?

你知道Ubuntu服務器有PDO嗎?你基本上說你認爲他們是一樣的。不要假設,驗證。

由於sobedai提到,看看var_dump($dbconn)的輸出,檢查它實際上是一個PDO對象,然後從那裏開始。

這是一個典型的PDO部署對我來說:

// 'logger' is a custom error logging function with email alerts 
try { 
    $dbh= new PDO(dsn); 
    if (is_a($dbh, "PDO")) { 
     $sql= 'SELECT field FROM table'; 
     $stmt= $dbh->query($sql); 
     if (is_a($stmt, "PDOStatement")) { 
      // handle resultset 
     } 
     else { 
      // weirdness, log it 
      logger("Error with statement: {$sql}" .$dbh->errorCode()); 
     } 
    } 
    else { 
     // some weirdness, log it 
     logger('Error making connection: '. $dbh->errorCode()); 
    } 
} 
catch (PDOException $e) { 
    logger('PDOException caught in '.__FILE__.' : '. $e->getMessage()); 
} 
catch (Exception $e) { 
    logger('General Exception caught in '.__FILE__.' : '. $e->getMessage()); 
} 

注意我使用PDO ::的errorCode在那裏,引用SQL-92 state codes

另外,儘可能參照the manual

+0

你說得很好。一旦發生這種情況,我就會因爲不在我要部署的服務器上開發而自責。我將使用您的代碼作爲我未來功能的模板。我想我需要添加更好的錯誤記錄。對我來說最困難的事情是試圖找出文件系統中的東西(比如日誌)。從Windows開始。再次感謝。 – webworm 2010-03-30 19:22:53

0

通常當發生這種情況時,您嘗試引用的對象實際上並不是一個類的實例。

由於您一直在WAMP上開發並在LAMP上測試,所以立即想到包含路徑。

檢查您的LAMP堆棧中的php包含路徑是否正確。 檢查是否安裝了所有必需的庫(只需執行一個快速的phpinfo()頁面,或者您可以在命令行中使用php -i)。

最後但並非最 - DO:

echo var_dump($dbconn); 

確認它的確是你認爲它是對象。

+0

非常感謝您花時間回答。我添加了你提到的var_dump代碼,並顯示「object(PDO)#1(0){}」。令我驚訝的是我的腳本的其餘部分沒有錯誤地執行。我不明白!再次感謝關於PATHS的建議。 – webworm 2010-03-30 19:20:58

相關問題