逃避背面双引号和双引号? (即。\“”)

时间:2014-08-08 21:48:21

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

我有以下代码:

<?
    $string="< input type=button value='Open' onclick='document.location.href=\"".format_URL("phpfolder",$sesion)."objects/construct.php?id_object=$id_object\"' >";
    mysql_query( "insert into db (code) values ('$string')" );
?>

当使用$string=mysql_real_escape_string($string);转义时,结果为

$string=\"< input type=button value=\'Open\' onclick=\'document.location.href=\"\".format_URL(\"phpfolder\",$sesion).\"objects/construct.php?id_object=$id_object\"\' >\";

它应该是这样的:

$string=\"< input type=button value=\'Open\' onclick=\'document.location.href=\\\"\".format_URL(\"phpfolder\",$sesion).\"objects/construct.php?id_object=$id_object\\\"\' >\";

为什么mysql_real_escape_string()不能识别它必须转义\""的第一个反斜杠才能将其转换为\\\"\"

这是PHP中的错误吗?

我试图应用诸如addslashes,html_entities,str_replace,preg_replace等函数。没有任何工作正常,或者我使用它错了。

该怎么做?

2 个答案:

答案 0 :(得分:0)

不要使用 mysql _ * 功能。只需使用准备好的语句,你就不会遇到这个问题。以下是PDO中的一个示例:

$stmt = $pdoObject->prepare('INSERT INTO MyTable (code) VALUES (:code)');

$stmt->bindParam(':code', $string, PDO::PARAM_STR);

if ($stmt->execute()) {
   echo 'Success';
} else {
   echo 'Failure';
}

就这么简单。更清洁&amp;更安全的代码。

现在主要问题是将整个html / js保存到表中。你的桌子在大小方面会变得非常快。为什么不把基本的ID或属性保存到表格中?通过从表中检索来构建该HTML。

你应该只保存$session&amp; $id_object进入你的桌子。使用这两个变量,您可以在之后构建html。

答案 1 :(得分:0)

反斜杠在转移到$ string变量时转出双引号。

<?php

$string = "< input type=button value='Open' onclick='document.location.href=\"".'url_output'."objects/construct.php?id_object=id_object\"' >";

echo $string;

输出:

< input type=button value='Open' onclick='document.location.href="url_outputobjects/construct.php?id_object=id_object"' >

因此,当它作为mysql_real_escape_string的参数给出时,反斜杠就不会开始了。

双引号位于字符串文字的双引号分隔符中,因此前面的反斜杠就是转义赋值运算符的双引号。

简化示例:

<?php

$string = "This is a \"string literal\"";

echo $string;

输出:

This is a "string literal"