PHP循环批量插入Oracle数据库的语法问题及解决方法
Oracle批量插入循环失效的问题解决
在向Oracle表批量插入记录时,单条插入逻辑正常,但用$i计数器实现循环批量插入时失效,问题出在SESSION变量的键名拼接语法上。
原错误代码:
for ($i = 1; $i < $num; $i++){ $query="INSERT INTO MYTABLE (CODE, NAME) VALUES ('$_SESSION[CODE]', '$_SESSION[NAME.$i]')"; $stid2 = oci_parse($conn, $query); $r=oci_execute($stid2); }
问题原因
PHP在双引号字符串中直接解析$_SESSION[NAME.$i]时,无法正确识别NAME.$i这个动态拼接的键名,导致无法获取到对应的SESSION值,进而插入的数据不符合预期甚至执行报错。
解决方法
先将动态拼接的SESSION值赋值给一个普通变量,再将变量代入SQL语句,让PHP提前正确解析出SESSION值:
修正后的代码:
for ($i = 1; $i < $num; $i++){ $NAME=$_SESSION["NAME.$i"]; $query="INSERT INTO MYTABLE (CODE, NAME) VALUES ('$_SESSION[CODE]', '$NAME')"; $stid2 = oci_parse($conn, $query); $r=oci_execute($stid2); }
额外优化建议
为避免SQL注入风险,同时提升批量插入的性能,推荐使用绑定变量构建SQL语句:
for ($i = 1; $i < $num; $i++){ $NAME=$_SESSION["NAME.$i"]; $query="INSERT INTO MYTABLE (CODE, NAME) VALUES (:code, :name)"; $stid2 = oci_parse($conn, $query); oci_bind_by_name($stid2, ':code', $_SESSION['CODE']); oci_bind_by_name($stid2, ':name', $NAME); $r=oci_execute($stid2); }
内容的提问来源于stack exchange,提问作者Guille GM
相关产品推荐
相关产品推荐

