使用撇号时出现SQL错误

时间:2010-02-05 09:53:03

标签: sql mysql

每当我尝试发布包含撇号的内容时,我都会收到以下错误:

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()."')";

任何想法如何解决?

3 个答案:

答案 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')"