当PHP变量包含单引号时,不插入MySQL Query

时间:2012-02-13 18:15:40

标签: php mysql insert

当变量$ subject具有单引号时,未插入此查询。有没有可用的解决方案?

mysql_query("INSERT INTO  table  (to_email_id,subject) values('$to','$subject');");

7 个答案:

答案 0 :(得分:7)

例如,考虑使用PDO参数化查询。

或者,将变量括在方括号{}。

修改

我错过了您的变量$subject 包含单引号。这意味着你必须逃脱它们。 (请参阅无数其他答案和mysql_real_escape_string()关于此问题。)但正如您所看到的,变量中的单引号正是注入攻击的工作原理。转义它们有助于防止此类问题,并允许您的查询存储预期的数据。

在没有引用Bobby Tables的情况下,没有关于注射攻击的答案是完整的。

答案 1 :(得分:3)

转义参数。

$to = mysql_real_escape_string($to);
$subject = mysql_real_escape_string($subject);
mysql_query("INSERT INTO  table (to_email_id, subject) values('$to', '$subject');");

手动:mysql_real_escape_string()

另外,请阅读 SQL注入攻击

答案 2 :(得分:3)

您的查询将返回1064错误,这是您查询中的语法错误。这种情况正在发生,因为变量,特别是问题的主题是$ subject正在改变你所附字符串的格式。例如,假设我们有

$subject = "fire's hotter than it looks";

在查询中对此进行评估时,您的查询字符串将为

INSERT INTO  table  (to_email_id,subject) 
     VALUES('the value of the to variable','fire's hotter than it looks');

如果您查看值中的第二项(曾经是$ subject),您会注意到现在您的撇号数量不均匀意味着您的查询结束了');是一个开放的字符串。

如上所述,使用mysql_real_escape_string()等函数添加缺失的斜杠。

快速注释:在“和”(\“,\”)等字符中添加斜杠。告诉mysql将这些解释为字符串字符而不是查询字符串分隔符。

答案 3 :(得分:2)

您需要对mysql_real_escape_string()$to

值使用$subject

另外,如果你在开始使用SQL注入之前没有这样做

答案 4 :(得分:1)

答案 5 :(得分:1)

您的查询有一个很棒的“漏洞” - > SQL注入。您应该在此处详细了解这一点:http://en.wikipedia.org/wiki/SQL_injection以及此处http://php.net/manual/en/function.mysql-real-escape-string.php

要做出简短的回答,您必须“转义”传递给mysql的值。最好的方法是使用mysql_real_escape_string函数。

$query = sprintf("mysql_query("INSERT INTO  table  (to_email_id,subject) values('%s', '%s');", mysql_real_escape_string($to),mysql_real_escape_string($subject));
mysql_query($query);

我希望这会对你有所帮助。

答案 6 :(得分:0)

如果您正在使用

(所有书都可用)作为$ subject,你试图插入到mysql

使用此

$disc_str = addslashes($subject);

“INSERT INTO表名(主题)值('$ disc_str')”;

它在Textarea中也适合我使用tinymce