Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP mysql_real_escape_字符串或PDO替代_Php_Mysql_Database_Pdo_Mysql Real Escape String - Fatal编程技术网

PHP mysql_real_escape_字符串或PDO替代

PHP mysql_real_escape_字符串或PDO替代,php,mysql,database,pdo,mysql-real-escape-string,Php,Mysql,Database,Pdo,Mysql Real Escape String,我正在尝试将许多旧的PHP mysql prodecural函数(如mysql\u query,mysql\u real\u escape\u string等)迁移到PDO中,只需最少的努力。我不想重写所有旧的DB函数。原因是它是一个相当旧的应用程序,我正在开发一个新的模块,并希望在其中使用PDO 所以现在我将这些旧函数移植到PDO方法中-我将\u port移植到我的旧函数中,所以我使用mysql\u query\u port,mysql\u fetch\u array\u port,mysql

我正在尝试将许多旧的PHP mysql prodecural函数(如
mysql\u query
mysql\u real\u escape\u string
等)迁移到PDO中,只需最少的努力。我不想重写所有旧的DB函数。原因是它是一个相当旧的应用程序,我正在开发一个新的模块,并希望在其中使用PDO

所以现在我将这些旧函数移植到PDO方法中-我将
\u port
移植到我的旧函数中,所以我使用
mysql\u query\u port
mysql\u fetch\u array\u port
mysql\u rows\u port
mysql\u real\u escape\u string\u 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\u real\u escape\u string
-我没有mysql连接时无法使用它。因此,请帮助我决定要做什么(或在我的代码中找到一个bug):

  • 在脚本开头初始化
    mysql\u pconnect()
    ,这样我仍然可以使用
    mysql\u real\u escape\u string
    (我不会通过该连接进行任何查询)
  • 写一些备选方案。函数说这个函数“将反斜杠前置到以下字符:\x00、\n、\r、\、'、“和\x1a.”,所以我想到了这个:

  • 您认为呢?

    mysql\u real\u escape\u string需要连接,因为其输出取决于连接字符集


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

    Hmm,MySQL PDO驱动程序是否实现了PDO::quote?您最好在PDO中使用准备好的语句,而不是试图找出如何转义语句。无论是在代码可读性还是应用程序安全性方面。科尔宾:是的,它实现了。但它也会在str周围加引号如果我从PDO::quote()结果中删除第一个和最后一个字符,我可以得到与mysql\u real\u escape\u string()相同的结果.我说得对吗?Aurimas:我同意你的看法,这不是一个好方法。但是,对我来说,使用5000行db函数似乎是一场噩梦。知道应用程序将在一年左右的时间内被重写为Scala和Cassandra。那么,你建议不要将一个PDO和一个mysql_连接在一起吗?我希望我可以手动同步字符集。@koubic:havin在我看来,一个专用的mysql连接只是为了使用它来存储字符集有点过分了。如果你不愿意使用预先准备好的语句(这是
    PDO
    )只想假装它是
    php:mysql
    ,只需实现您自己的
    real\u escape\u string
    。如果您不使用多字节字符集,就只需对这七个特殊字符进行转义即可。@koubic有一个专用的mysql连接,只需将其用作字符集的存储,这和机械转义一样毫无意义将mysql_*替换为pdo*,将pdo变成同样的程序混乱。同时使用两个非意义将有点太多。谢谢。我很想在新模块中使用pdo,但不愿意将所有现有代码重写为pdo,然后测试应用程序中的每个功能。我将使用pdo::quote并剪切第一个和最后一个字符作为替换mysql\u real\u escape\u string的原生版本。每次我对旧代码做一些修改,我都会将其重写为PDO。因此,旧代码最终会消失。@koubic用裸PDO API方法调用重写裸mysql API函数调用仍然毫无意义。
    function mysql_real_escape_string_port($string) {
        return addcslashes ($string, "\x00\n\r\\'\"\x1a");
    }