2011-07-30 42 views
0

我正在做一个新的问题,看到的另一个问题是无效的,它已经改变了很多我的数据库代码是这样的:mysql_real_escape_string()允许“和”

$sql2="INSERT INTO $tbl_name(s_id, s_name, s_email, s_content)VALUES('$id', '$s_name', '$s_email', '$s_content')"; 
$result2=mysql_query($sql2); 

if($result2){ 
echo "Successful<BR>"; 

} 
else { 
echo "ERROR"; 
} 

我可以输入字母数字,但不是“或” - 我怎样才能使用mysql_real_escape_string()来解决这个问题?谢谢。

+0

的[MySQL的不要让'可能重复和“in Longtext](http://stackoverflow.com/questions/6883351/mysql-not-letting-and-in-l ongtext) –

回答

0

你应该mysql_real_escape_string逃脱你的字符串变量查询内部或外部:

$name = mysql_real_escape_string($s_name); 
$email = mysql_real_escape_string($s_email); 
$content = mysql_real_escape_string($s_content); 

$sql2 = "INSERT INTO $tbl_name(`s_id`, `s_name`, `s_email`, `s_content`) \n"; 
$sql2.= "VALUES('$id', '$name', '$email', '$content')"; 
+0

感谢您的帮助! – fealiuex

6

只需使用mysql_real_escape_string()就可以在将字符串注入SQL查询之前转义您的字符串。

例如:

$s_name_escaped = mysql_real_escape_string($s_name); 
$s_email_escaped = mysql_real_escape_string($s_email); 
$s_content_escaped = mysql_real_escape_string($s_content); 

$sql2="INSERT INTO $tbl_name(s_id, s_name, s_email, s_content) 
     VALUES('$id', '$s_name_escaped', '$s_email_escaped', '$s_content_escaped')"; 


或者,甚至更好:停止使用旧mysql_*功能,并使用两种mysqli_*PDO,预处理语句。

+1

+1 - @fealiuex:如何使用预处理语句的例子在这里:http://stackoverflow.com/questions/2893025/quick-mysqli-security-question - 有[网站上的许多其他人]( http://www.google.com/search?q=mysqli+prepared+site:stackoverflow.com) – Tomalak

+0

什么时候mysql扩展将被depraated? – andho

+0

由于它不支持“新”*(实际上不再是新的),它将被贬低*(如果它是一天)* MySQL的特性,在MySQL 4.1中引入的特性,如预先准备好的语句 - “when “是另一个问题,我不确定是否已经做出决定;不适用于PHP 5.4,至少*(仅在alpha阶段)* –

0

mysql_real_escape_string()不会阻止你使用像“或”的字符可能可能有助于SQL注入攻击。它只是逃避这些字符因此MySQL将它们解释它们的字面价值,而不是作为查询的命令。 所以你。回答,只是用它你不必做任何事情都要

+0

感谢您的帮助! – fealiuex

+0

@fealiuex任何时间! –