Php 在多行查询中执行Mysql\u real\u escape\u字符串时出现Mysql错误

Php 在多行查询中执行Mysql\u real\u escape\u字符串时出现Mysql错误,php,mysql,mysql-real-escape-string,Php,Mysql,Mysql Real Escape String,当我遇到如下问题时: SELECT * FROM aii_images WHERE id=34 还有mysql\u real\u escape\u字符串我得到: Something is wrong in your syntax near '\n FROM aii_images 如果不使用mysql\u real\u escape\u字符串,就不会有这样的问题 有什么好办法可以解决吗? Str_replace或类似函数不是选项-我的查询有时包含“\n”和大量文本

当我遇到如下问题时:

SELECT *
FROM aii_images
WHERE id=34
还有mysql\u real\u escape\u字符串我得到:

Something is wrong in your syntax near '\n                FROM aii_images
如果不使用mysql\u real\u escape\u字符串,就不会有这样的问题

有什么好办法可以解决吗?
Str_replace或类似函数不是选项-我的查询有时包含“\n”和大量文本。Str\u replace会杀死我的服务器。

使用
mysql\u real\u escape\u string()

$strStatement = "
    SELECT
        *
    FROM
        aii_images
    WHERE
        id = '" . mysql_real_escape_string( $strId ) . "';";

仅对值使用
mysql\u real\u escape\u string()
,而不是对整个语句使用

$strStatement = "
    SELECT
        *
    FROM
        aii_images
    WHERE
        id = '" . mysql_real_escape_string( $strId ) . "';";

首先,你不应该逃避整个查询;只是要插入的字段。(见@Raisch的答案)

第二,建议不要再使用
mysql\u xxx
函数——PHP手册非常清楚地说明了这一点:

相反,您应该使用
mysqli_xxx
函数或PDO库。有关更多信息和这两个库的手册页面的更多链接,请参见上面的链接


如果您使用的是这两个库中的任何一个,您都可以使用“Prepared Statements”技术,这样您就不必再次手动转义字符串。这是一种更好的技术,会使整个问题变得多余。

首先,你不应该逃避整个查询;只是要插入的字段。(见@Raisch的答案)

第二,建议不要再使用
mysql\u xxx
函数——PHP手册非常清楚地说明了这一点:

相反,您应该使用
mysqli_xxx
函数或PDO库。有关更多信息和这两个库的手册页面的更多链接,请参见上面的链接


如果您使用的是这两个库中的任何一个,您都可以使用“Prepared Statements”技术,这样您就不必再次手动转义字符串。这是一种更好的技术,并且会使整个问题变得多余。

您能发布比sql查询更多的内容吗?很高兴看到它的实现
mysql\u real\u escape\u string()
用于要转义的值,而不是用于整个查询。想想准备好的语句(->)在
SELECT*
之后是否点击了
Enter
?是否可以发布不仅仅是sql查询的内容?很高兴看到它的实现
mysql\u real\u escape\u string()
用于要转义的值,而不是用于整个查询。想想准备好的语句(->)在
SELECT*
之后是否点击了
Enter
?请注意,在本例中,如果
$strId
确实包含需要转义的恶意值,则查询中的值周围缺少引号将导致SQL错误。这会阻止黑客攻击,但也会破坏你的代码。你需要在它周围加上引号才能完全保护它。Thx,我想我必须这样做。我认为可以在每个查询中“转义字符串”。@SDC您的权利,我忘记了它们,因为我使用了
PDO::quote()
,不需要引号。我在回答中加上引号。我真可耻-D@Raisch-我想这就引出了真正的答案,那就是“使用PDO,而不是mysql_xxx函数”。(见我的答案)@SDC-我同意这一点@user1410263-将
PDO
与准备好的语句一起使用=>请参阅:注意,在本例中,如果
$strId
确实包含需要转义的恶意值,则查询中的值缺少引号将导致SQL错误。这会阻止黑客攻击,但也会破坏你的代码。你需要在它周围加上引号才能完全保护它。Thx,我想我必须这样做。我认为可以在每个查询中“转义字符串”。@SDC您的权利,我忘记了它们,因为我使用了
PDO::quote()
,不需要引号。我在回答中加上引号。我真可耻-D@Raisch-我想这就引出了真正的答案,那就是“使用PDO,而不是mysql_xxx函数”。(见我的答案)@SDC-我同意这一点@user1410263-对准备好的语句使用
PDO
=>请参见: