我正在运行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的文本');
答案 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可以使用的。