为什么mysqli_real_escape_string在我的字符串

时间:2017-11-29 23:09:06

标签: php mysql mysqli

我正在运行php 5.5.9

我正在将以下文本发布到一个php脚本中,该脚本会将其插入到mysql表的字段中。

  

这变得非常令人讨厌',为什么会这样?

我使用以下代码将POSTed数据分配给变量(加上调试代码。)

$ITEMDESC2 = $_POST['ITEMDESC'];
$ITEMDESC = mysqli_real_escape_string($conn1, $ITEMDESC2);

error_log("ITEMDESC: $ITEMDESC  ITEMDESC2: $ITEMDESC2");

以下内容出现在我的apache日志文件中:

   ITEMDESC:这变得非常令人讨厌\\',为什么会这样   ITEMDESC2:这变得非常麻烦,为什么会这样呢

为什么$ITEMDESC使用双反斜杠而不是单反斜杠进行转义?

我已经读过这可能是由magic_quotes引起的,但据我所知,它们已在PHP 5.4中删除了

欢迎任何有关此事的见解。

编辑:根据要求添加更完整,实用的示例。

<?php 
$conn1 = new mysqli('localhost', 'USER', 'PASSWORD', 'DB') 
or die ('Cannot connect to db');

$ITEMDESC = "This is Bob's Text";
$ITEMDESC2 = mysqli_real_escape_string($conn1, $ITEMDESC);
$SQL = "insert into table (description) values ('{$ITEMDESC2}');";

echo "<br>ITEMDESC: {$ITEMDESC}";
echo "<br>ITEMDESC2: {$ITEMDESC2}";
echo "<br>SQL: {$SQL}";

error_log("ITEMDESC: {$ITEMDESC}");
error_log("ITEMDESC2: {$ITEMDESC2}");
error_log("SQL: {$SQL}");
?>

apache2错误日志包含:

  

ITEMDESC:这是Bob的文字
  ITEMDESC2:这是Bob \\的文字
  SQL:插入表(描述)值('这是Bob \\的文本');

浏览器输出(屏幕上):

  

ITEMDESC:这是Bob的文字
  ITEMDESC2:这是Bob的文字
  SQL:插入表(描述)值('这是Bob的文本');

1 个答案:

答案 0 :(得分:3)

您应该将代码迁移到prepared statements。这样可以避免这个奇怪的问题并提供更好的安全性。

$stmt = mysqli_prepare($link, 'INSERT INTO FooBar(description) VALUES (?)');
mysqli_stmt_bind_param($stmt, 's', $_POST['ITEMDESC']);
mysqli_stmt_execute($stmt);

虽然,我个人更喜欢使用PDO,因为它可以选择使用命名参数,这使得SQL更具可读性,并且界面是PSR-2可以使用的。