使用撇号时出现SQL错误

使用撇号时出现SQL错误,sql,mysql,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... 例如,当我试图发布/使用插入诸如“我正在努力工作”之类的内容时,这会给我带来一个错误。如果我写下“我正在努力工作”,一切都是美好的 代码是: $sql="INSERT I

每当我试图发布带有撇号的内容时,都会出现以下错误:

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...
例如,当我试图发布/使用插入诸如“我正在努力工作”之类的内容时,这会给我带来一个错误。如果我写下“我正在努力工作”,一切都是美好的

代码是:

 $sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) VALUES ('".$_POST[content]."', '".$user_id."', '".time()."')";

您知道如何修复它吗?

插入的值中的引号将关闭INSERT语句中围绕该值的引号,因为您使用的是动态生成的SQL


最好的解决方案是使用参数化SQL,这将防止此问题并更安全(防止SQL注入)。否则,您需要解析/确保提供的值的安全性-例如,转义所有单引号,这样它们就不会破坏语句。

这是因为您使用撇号来显示MySQL字段的每个值的开始和结束位置。如果你把撇号放在字符串的中间,突然数据库认为你试图在三个表字段中放入四个值,或者一些这样的事情。 看起来您正在使用PHP在数据库中插入数据,所以我将给您举几个例子,用PHP提供的方法来处理这个问题

解决此问题的快捷方法是:

更好的方法是使用:


另外,您不需要在time()前后使用单引号-这是一个数字,按原样插入是安全的。

如果公众可以以任何方式访问它,请立即将其取下,然后阅读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')"

您应该使用
mysql\u real\u escape\u string
mysql\u escape\u string
中断某些连接字符集和设置。谢谢,我的错。我把密码修好了。我已经有一段时间没有像这样构造查询了:)。
 $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')"