2014-10-01 148 views
0

我正在將我的應用程序從Mysql擴展移動到PHP PDO。 我正面臨一個奇怪的問題。 在我的開發環境中,我有db服務器[MySQL]和web服務器都在單個系統中,在測試環境中web和db服務器在不同的系統中。mysql_real_escape_string沒有顯示錯誤

以下測試代碼在開發環境中完美運行,並在測試環境中失敗。

require "class.DB.php" ; 

    class DbMaster extends DB 
    { 
     public function __construct() 
     { 
      $this->Host  = "192.168.1.00"; 
      $this->Database = 'test_database'; 
      $this->User  = "root"; 
      $this->Password = "12345"; 
     } 
    } 

    // Creates the instance 
    $db = new DbMaster(); 

    $table = mysql_real_escape_string('persons'); 
    $result_array = $db->query("SELECT Id, Age FROM $table WHERE Id >= :Id", array("Id" => 1)); 

    foreach ($result_array as $rec) 
    { 
     echo '<br>'.$rec["Id"].' -> '.$rec['Age']; 

    } 

在dev中,mysql_real_escape_string應該失敗,因爲沒有mysql_connect()。

但是,mysql_real_escape_string在有本地運行的mysql服務器時工作。爲了在開發環境中測試,我停止了本地mysql並連接到遠程數據庫。然後,我得到了以下錯誤:

Warning: mysql_real_escape_string(): A link to the server could not be established 
與我現有的開發設置[Web和數據庫服務器一起]

所以,我無法看到的PDO相關的錯誤。

任何方式來解決這個問題。

+3

看到[mysql_real_escape_string文檔](http://php.net/manual/en/function.mysql-real-escape-string.php)中的紅色矩形?請按照警告並使用[mysqli_real_escape_string()](http://php.net/manual/en/mysqli.real-escape-string.php)或[PDO escaping - quote()](http:// php .net/manual/en/pdo.quote.php): – Kleskowy 2014-10-01 10:47:54

+0

爲什麼你需要轉義表名?它(或者它會)來自用戶輸入嗎? – HeatherEMSL 2014-10-01 10:56:27

+0

不是一個直接的答案,但是當您使用準備好的語句時,您不需要手動清理這些數據 - 這是使用較新的數據庫功能的主要原因之一 – Steve 2014-10-01 11:05:54

回答

2

mysql_real_escape_string()如果不存在連接,則嘗試打開到服務器的連接,連接到mysql_connect()mysql_connect()的缺省值是「localhost」和「root」,沒有密碼。

如果您的開發環境中有一個沒有密碼的root帳戶(這是一個非常常見的設置),這可以毫無問題地工作,因爲可以建立連接。

另一方面,在實況環境中,root用戶希望有一個密碼設置,所以這個調用將失敗。

在這種情況下,mysql_real_escape_string()將返回false而不是您的轉義值。

解決方案:使用功能的mysqli或PDO等價物。或者使用mysql_connect()打開一個額外的連接,並使用有效的憑證,因此mysql_real_escape_string()可以使用它。

+0

非常感謝。我剛在開發環境中停止了mysql。這很好.. .. – GBhat 2014-10-08 14:31:31