我有下表:
$sql = "CREATE TABLE received_queries
(
sender_screen_name varchar(50),
text varchar(150)
)";
我使用以下SQL语句在表中存储值
$sql = "INSERT INTO received_queries VALUES ('$sender_screen_name', '$text')";
现在我尝试将以下字符串存储为“text”。
另一个#haiku:考虑棉毛;感觉就像睡觉一样无法治愈; 我需要一些咖啡。
我收到以下错误消息:
错误:您的SQL语法出错;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 接近'治愈;我需要一些咖啡。')'在第1行
我认为这一定是一个非常普遍的问题。我该如何解决?
答案 0 :(得分:4)
我建议使用预处理语句(使用mysqli或pdo)而不是转义。
答案 1 :(得分:4)
请注意,将这样的SQL查询放在一起会带来潜在的安全风险。
更好的方法是使用预备语句。这基本上意味着将某些占位符放入您的SQL中,其中实际值(例如您的$sender_screen_name
和$text
)将会出现。
我搜索了'net并想出了以下代码片段,显示了如何在PHP中完成预处理语句(对不起,如果这可能不是最好的PHP,我通常不用这种语言编写任何东西 - - 但我想它可以作为一个合理的起点):
$dbSelect = $objDb->prepare("INSERT INTO received_queries VALUES (:ssn, :text");
$dbSelect->bindParam('ssn', $sender_screen_name);
$dbSelect->bindParam('text', $text);
通过将查询作为预准备语句执行,您无需担心自己转义字符串。 PHP和RDBMS将自动为您处理。
答案 2 :(得分:3)
您可以使用mysql_real_escape_string
答案 3 :(得分:2)
您转义单引号\'
。请参阅manual。
One more #haiku: Cotton wool in mind; feeling like a sleep won\'t cure; I need some coffee.
答案 4 :(得分:2)
您永远不应该通过将字符串与用户输入连接来构建SQL。这会打开您的SQL注入攻击应用程序(想象一下当某人以'); delete from received_queries;
的身份输入$text
时会发生什么。)
因此,您应该始终使用DB框架(如PHP的DB),它允许您传递带占位符的字符串,然后传递带有值的数组。然后,框架将确保值不会造成任何伤害。