【问题标题】:PHP mysql_real_escape_string or alternative with PDOPHP mysql_real_escape_string 或 PDO 的替代方案
【发布时间】:2012-04-27 09:49:47
【问题描述】:

我正在尝试以最少的努力将许多旧的 PHP mysql 程序函数(如 mysql_querymysql_real_escape_string 等)迁移到 PDO。我不想重写每一个旧的数据库函数。原因是它是一个相当旧的应用程序,我正在开发一个新模块并希望在那里使用 PDO。

所以现在我将这些旧函数移植到 PDO 方法中 - 我将 _port 附加到我的旧函数中,因此我使用 mysql_query_portmysql_fetch_array_portmysql_num_rows_portmysql_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 连接时,我无法使用它。所以请帮我决定要做什么(或在我的代码中找到错误):

  1. 在脚本开头初始化mysql_pconnect(),这样我仍然可以使用mysql_real_escape_string(我不会通过该连接进行任何查询)。
  2. 写一些替代方案。 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


【解决方案1】:

mysql_real_escape_string 需要连接,因为它的输出取决于连接字符集。

如果您能够手动同步字符集(或者如果您从不更改它),您可以编写自己的实现。

【讨论】:

  • 那么您是否建议不要将一个 PDO 和一个 mysql_pconnect 放在一起?我希望我可以手动同步字符集。
  • @koubic:在我看来,拥有一个专用的 mysql 连接只是为了使用它来存储字符集,这有点矫枉过正。如果您不愿意使用准备好的语句(PDO 用于)并且只想假装它是php:mysql,只需实现您自己的real_escape_string。如果您不使用多字节字符集,那么就像转义这七个特殊字符一样简单。
  • @koubic 拥有一个专用的 mysql 连接只是为了将其用作字符集的存储,这与将 mysql_* 机械替换为 pdo* 相同,将 PDO 变成相同的程序混乱。同时说两句废话有点过分了。
  • 谢谢。我热衷于在新模块中使用 PDO,但不愿意将所有现有代码重写为 PDO,然后测试应用程序中的每一个功能。我将使用 PDO::quote 并剪切第一个和最后一个字符作为mysql_real_escape_string 的替代品。每次我对旧代码进行一些修改时,我都会将其重写为 PDO。所以最终,旧代码会消亡。
  • @koubic 用裸 PDO API 方法调用重写裸 mysql API 函数调用仍然没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2011-04-15
  • 2014-03-09
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多