php mysql 保存字符串数组中,php - 用于在php SQL语法错误中存储字符串数组的mysql查询...

我有一个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'的字符串值时? (提示:我们希望返回一个字符。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值