每当我尝试发布包含撇号的内容时,我都会收到以下错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near...
例如,当我试图发布/使用INSERT之类的“我正在努力工作”时。它给我一个错误。如果我写“我正在努力工作”,一切都很有用。
代码是:
$sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) VALUES ('".$_POST[content]."', '".$user_id."', '".time()."')";
任何想法如何解决?
答案 0 :(得分:4)
那是因为你使用撇号来显示MySQL的字段的每个值的开始和结束。如果你把撇号放在字符串的中间,那么数据库突然认为你试图在三个表字段中放入四个值,或者某些东西。
看起来你正在使用PHP在数据库中插入数据,所以我将给你几个用PHP提供的方法处理这个问题的例子。
快速修复它以使用mysql_real_escape_string():
$sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`)
VALUES ('" . mysql_real_escape_string($_POST['content']) . "',
'" . mysql_real_escape_string($user_id) . "',
".time().")";
更好的方法是使用prepared statements:
$db = // your mysqli() connection
$sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`)
VALUES (?, ?, ?)";
if ($stmt = $db->prepare($sql))
{
$stmt->bind_param("ssi", $_POST['content'], $user_id, time());
$stmt->execute();
$stmt->close();
}
P.S。你不需要在time()周围使用单引号 - 这是一个数字,按原样插入是安全的。
答案 1 :(得分:2)
插入的值中的引号是关闭INSERT语句中值的引号,因为您使用的是动态生成的SQL。
最佳解决方案是使用参数化SQL来防止此问题并且更安全(防止SQL注入)。否则,您需要解析/保护所提供的值 - 例如逃避所有单引号,这样他们就不会破坏声明。
答案 2 :(得分:1)
如果公众可以以任何方式访问它,请立即将其删除,然后继续阅读SQL注入攻击。最好的解决方法是使用参数化查询,但必须使用某种转义机制,因为文本中的引号被解释为SQL命令的一部分,而不是文本的一部分。
考虑一下如果您提交评论会发生什么:
', 'No-one', time()); DROP TABLE tb_table; //
你的SQL:
$sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) VALUES ('".$_POST[content]."', '".$user_id."', '".time()."')"
然后扩展为字符串:
INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) VALUES ('', 'No-one', now()); DROP TABLE tb_table; //', 'user', 'time')"