2014-10-01 110 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