编辑:我已经检查过,我的托管服务'mysql数据库设置为:
Language: English (en-utf-8)
MySQL charset: UTF-8 Unicode (utf8)
下面的'userItem'变量来自表单上用户输入的文本字符串。
当我输入“这是A的用户项目”时 - 我在其上使用 mysql_real_escape_string - 这是保存到数据库的内容:
"this is A\'s user item"
BAD。使用我的测试字符串保存了一个backslsh。
如果我注释掉 mysql_real_escape_string($ userItem)并在查询字符串中使用 $ userItem - 这就是存储在数据库中的内容:
"this is A's user item"
GOOD !!没有反斜杠。
但让我们面对现实,出于安全原因,我真的想使用 mysql_real_escape_string - 我一直认为在保存之前在字符串上使用mysql_real_escape_string更安全他们到数据库。
问题:当我检索我的文本字符串“这是A的用户项”并在浏览器中显示它时 - 它在字符串中有斜杠。并且它让用户感到惊讶 - 他们没有输入“这是用户项目”,他们输入了 “这是A的用户项”
以下是代码:
$newItemInsertQuery = "INSERT INTO " . Dbases::$USERITEMS_TABLE
. " VALUES "
. "('"
. mysql_real_escape_string( $loggedInUser ) . "', '"
//. mysql_real_escape_string($userItem) . "', '" COMMENTED OUT due to extraneous backslash
. $userItem . "', '"
. mysql_real_escape_string($description) . "', '"
. mysql_real_escape_string($itemImage) . "', '"
. mysql_real_escape_string($userSubfolder) . "')";
$result = mysql_query($newItemInsertQuery);
我怀疑以下内容;
我希望在数据库插入之前对字符串使用mysql_real_escape_string是一件好事。
但我不知道必须采取的其他措施
答案 0 :(得分:2)
我高度建议通过mysqli
或PDO
使用参数化查询(两者都内置于PHP)。
mysql_real_escape_string()
充其量是权宜之计。使用参数化查询既不那么麻烦(避免这样的问题),也更安全 - 加上很多东西它也可以更有效。
它还可以更准确地说明传入和传入数据库的数据,因为它不需要执行任何类型的转义。
答案 1 :(得分:0)
在将字符串保存到数据库之前对字符串使用mysql_real_escape_string更安全。
它不是“更安全” 实际上这是一个严格规则。
但是你的问题不是来自这个功能,而是来自破坏你的数据的其他一些代码或设置。
所以,我们这里有两个问题。
对于第一个,请回显最终查询
echo $newItemInsertQuery;
并在此处发布您的内容
感谢您发帖 现在让我们看看 由于语法错误,您发布的查询将永远不会被执行。
INSERT INTO useritems VALUES('b@b.com','b' s第4项','第4项','','')
请参阅强调部分:此处您的字符串文字已关闭,未遵循正确的语法关键字。
使用此
更改您的查询调用$result = mysql_query($newItemInsertQuery) or trigger_error(mysql_error()." ".$query);
exit;
并查看
答案 2 :(得分:0)
我相信我已经找到了额外反斜杠的来源,也是一个解决方案。我会在这里发布,然后回来发布我目前正在处理的解决方案。
提交表单的 input type =“text”字段,然后在PHP的服务器端从$ _POST数组中提取带有撇号的文本字符串并通过方式显示一个 echo 斜杠 ALREADY IN THE TEXT STRING ,如下所示:
“这就是它的样子”
我无法在我的网站目录中使用我的.htaccess文件来使用该行关闭'魔术引号'
php_flag magic_quotes_gpc关闭
因为1and1托管服务器显示错误(请参阅我对此的评论)并且不会运行我的网站。
我有一个解决方案,一旦证明我会发回。
我已经测试了以下代码并且它可以工作 - 在我的表单上,我输入字符串“b的第6项”,并且在提交表单时,此代码处理表单的POST:
$itemName = $_POST['theItemname'];
echo $itemName;
if (get_magic_quotes_gpc())
{
$stripped = stripslashes($itemName);
echo "<br /> This is itemName string after stripping: " . $stripped;
}
输出结果为:
b\'s 6th item
This is itemName string after stripping: b's 6th item
我已阅读下面的评论,并会查看所有选项。现在,我现在需要一个解决方案,上面避免调用stripslashes()除非'魔术引号'打开 - 它的工作原理。
我会准备好回复并尝试找到更优雅的方式!谢谢大家。