【发布时间】:2012-04-27 09:49:47
【问题描述】:
我正在尝试以最少的努力将许多旧的 PHP mysql 程序函数(如 mysql_query、mysql_real_escape_string 等)迁移到 PDO。我不想重写每一个旧的数据库函数。原因是它是一个相当旧的应用程序,我正在开发一个新模块并希望在那里使用 PDO。
所以现在我将这些旧函数移植到 PDO 方法中 - 我将 _port 附加到我的旧函数中,因此我使用 mysql_query_port、mysql_fetch_array_port、mysql_num_rows_port 和 mysql_real_escape_string_port。
前三个效果不错:
function mysql_query_port($query) {
$db = Database::instance();
$statement = $db->prepare($query);
if (!$statement->execute())
return false;
return $statement;
}
function mysql_fetch_array_port(PDOStatement $statement) {
return $statement->fetch();
}
function mysql_num_rows_port(PDOStatement $statement) {
return $statement->rowCount();
}
问题在于mysql_real_escape_string - 当我没有 mysql 连接时,我无法使用它。所以请帮我决定要做什么(或在我的代码中找到错误):
- 在脚本开头初始化
mysql_pconnect(),这样我仍然可以使用mysql_real_escape_string(我不会通过该连接进行任何查询)。 - 写一些替代方案。 manual 说这个函数“为以下字符添加反斜杠:\x00、\n、\r、\、'、”和 \x1a。”,所以我想出了这个:
.
function mysql_real_escape_string_port($string) {
return addcslashes ($string, "\x00\n\r\\'\"\x1a");
}
你怎么看?
【问题讨论】:
-
嗯,MySQL PDO驱动是否实现了PDO::quote?
-
您最好将准备好的语句与 PDO 一起使用,而不是试图弄清楚如何转义语句。在代码可读性和应用程序安全性方面。
-
Corbin:是的,确实如此。但它也会在 mysql_escape_string() 没有的字符串文字周围加上引号。
-
好吧,如果我从 PDO::quote() 结果中删除第一个和最后一个字符,我可以得到与 mysql_real_escape_string() 相同的结果。我说的对吗?
-
Aurimas:我同意你的观点,这不是一个好方法。但是通过 5000 行 db 函数对我来说似乎是一场噩梦。知道应用程序将在一年左右的时间里重写为 Scala 和 Cassandra。
标签: php mysql database pdo mysql-real-escape-string