我有一个php form,formfields是字符串数组。以下是从数组中提取字符串并将其与其他提取的字符串一起保存在数据库中的代码。$sql = "INSERT INTO student (formid,firstname,lastname,dob,school,year,sex,touch,reason,other,need,improve1) values";
$valuesArr = array();
$i=0;
for ($i=1; $i <=$childtoen; $i++) //childtoen is a form variable
{
$improve_list="";
if ($improve[$i][0]!="") // converting this array to a list
{
$improve_list = implode( ',', $improve[$i]);$improve_list = mysql_real_escape_string( $improve_list );
}
$improve_list = mysql_real_escape_string($improve_list);
$firstname = mysql_real_escape_string( $firstname[$i] );
$lastname = mysql_real_escape_string( $lastname[$i] );
$dob = mysql_real_escape_string( $dob[$i] );
$school = mysql_real_escape_string( $school[$i] );
$year = mysql_real_escape_string( $year[$i] );
$sex = mysql_real_escape_string( $sex[$i] );
$touch1 = mysql_real_escape_string( $touch[$i] );
$reason = mysql_real_escape_string( $reason[$i] );
$other = mysql_real_escape_string( $other[$i] );
$need = mysql_real_escape_string( $need[$i] );
$valuesArr[] = "('$id', '$firstname' , '$lastname' , '$dob' , '$school' , '$year' , '$sex' , '$touch1' , '$reason' , '$other' , '$need' , '$improve_list')"; // Error at or near reason
$sql .= implode(',', $valuesArr);
$query=mysql_query($sql,$connection); if(!$query) exit(mysql_error());
echo $query;
}
现在我收到以下错误
您的SQL语法有误。检查与您的MySQL服务器相对应的手册,以在'('''23','12321','12321','01/22/2015','321','3','male',第1行的'yes','Interv'
其中interv实际上是Intervention,并且是$reason的值
我试图将valuesArr中字段的封闭引号从单''更改为双精度“”,但没有帮助。无法得到错误原因
最佳答案
您的代码未重置$sql。第二次通过循环,它仍然具有从第一次通过循环获得的值。
因此,您要将新的值列表附加到上一条语句上。作为简短的演示,第一次通过循环,$sql的值为:INSERT INTO foo (bar) VALUES ('fee')
第二次遍历循环,$sql的值为:
INSERT INTO foo (bar) VALUES ('fee')('fi')
^
MySQL将在那里引发语法错误:('fi'
作为快速解决方案,将初始分配$sql = "INSERT INTO ...移到for循环内,就像在添加内嵌的$valuesArr之前一样。
对于这样的调试问题,请在执行之前立即回显SQL文本:
echo "SQL=" . $sql ;
另外,不建议使用mysql_接口,以后将不再支持该接口。新开发应使用PDO或mysqli,并使用带有绑定占位符的准备好的语句。 (但是,如果您受制于mysql接口,则至少应使用mysql_real_escape_string函数来抵制SQL注入攻击。)
跟进
查看这一行代码,并考虑第一次循环时$i = 1会发生什么。
$dob = mysql_real_escape_string( $dob[$i] );
现在,考虑第二遍循环中发生的情况。问自己一个问题:$dob中当前存储了什么值?
是否完成了之前的分配,更改了$dob的值?该表达式:$dob[2]的结果是什么,当$dob包含诸如'01/22/2015'的字符串值时? (提示:我们希望返回一个字符。)