mysql_real_escape_string没有显示错误

时间:2014-10-01 10:42:53

标签: php mysql pdo mysql-real-escape-string

我正在将我的应用程序从Mysql扩展转移到PHP PDO。 我面临一个奇怪的问题。 在我的开发环境中,我有数据库服务器[MySQL]和Web服务器都在单一系统中,在测试环境中,Web和数据库服务器位于不同的系统中。

以下测试代码在开发环境中运行良好,在测试环境中失败。

    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服务器时,mysql_real_escape_string可以正常工作。为了在开发环境中测试这个,我停止了本地mysql并连接到远程数据库。然后我收到以下错误:

Warning: mysql_real_escape_string(): A link to the server could not be established 

因此,通过我现有的开发设置[Web和数据库服务器一起],我无法看到与PDO相关的错误。

任何解决此问题的方法。

1 个答案:

答案 0 :(得分: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()可以使用它。