在每个循环的insert语句之前转义数组值

时间:2013-01-13 12:46:06

标签: php mysql ajax

  

可能重复:
  “slash before every quote” problem

我有一个奇怪的情况,我的代码在本地计算机上工作,就像在localhost中一样,但是当我在Web服务器上发布它时,它的行为有所不同。

我有一个学生列表,其中包含复选框,以便用户可以选择复选框,点击删除按钮后,这些将从列表中删除,这意味着我将它们插入另一个表中。

注意:studentid是斜杠,如KNC / 2012 / sem1 / BSC / 125

现在我的javascript函数发出一个ajax请求并将值作为参数发送到我的php文件,该文件通过数组并使用foreach循环插入它们。

javascript代码:

function flagRemovedStudents(iar){
displayBox = document.getElementById("studentBox");
elements = document.getElementsByName('stids[]');  
data = [];
for (i = 0; i < elements.length; i++){
 if (elements[i].checked){
    data.push('stids[]='+encodeURIComponent(elements[i].value));
 }
 }
 params = "iars="+encodeURIComponent(iar)+"&fl="+encodeURIComponent(1)+"&"+data.join('&');
 alert(params); // just to check what values are being passed to php script
 if (window.XMLHttpRequest)
 {
 xmlhttp=new XMLHttpRequest();
 }
else
 {
 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
 }
xmlhttp.onreadystatechange=function()
 {
if (xmlhttp.readyState==4 && xmlhttp.status==200)
 {
result = xmlhttp.responseText;  
alert(result);
displayBox.className = "dimBox";
setTimeout(function(){showStudentsAfterRemoval(iar);},200); 
}
 }
xmlhttp.open("POST","remst.php",true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(params);
} 

现在我的php工作为:

 $session = $_SESSION['sess'];
 $iarsid = mysql_real_escape_string($_POST['iars']);
 $studentid = $_POST['stids'];
 $num = 0;

 foreach ($studentid as $value ) {
$val = mysql_real_escape_string($value);
$q1 = "insert into removedstudents(sessionid,iarsid,studentid)     values('$session','$iarsid','$value')";
$r1 = mysql_query($q1) or die(mysql_error());
if(mysql_affected_rows() > 0){
$num = $num + 1;
}
  }
echo $num." student(s) have been removed from the responsibility.";

问题是,在web服务器上,studentid被插入为KNC\/2012\/sem1\/BSC\/125,这影响了我的进一步查询。

令人惊讶的是,它是以我在localhost上所需的格式插入的,即我的开发环境,但是当我在网络服务器上放置相同的代码时,它会以某种方式表现得很奇怪。 请帮忙。

1 个答案:

答案 0 :(得分:0)

mysql_real_escape_string将按设计执行此操作(请参阅the docs)。

在这种特殊情况下,您可能最好使用正则表达式在php中验证ID的格式,然后不在数据库中转义它。显然,你需要非常小心,不要通过这样做打开安全漏洞。

mysql_ *函数现在也已弃用,所以你也应该考虑使用mysqli_ *。