我正在将我的应用程序从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相关的错误。
任何解决此问题的方法。
答案 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()
可以使用它。