注册程序中的PHP代码:
$query="INSERT INTO `users`(`email`, `password`, `role`, `time_registration`)
VALUES ('".mysqli_real_escape_string($con, trim($_SESSION['reg']['email']))."',
'".hash('SHA512',trim($_POST['password']))."',
'".mysqli_real_escape_string($con, trim($_SESSION['rola']))."',
NOW())";
if(!mysqli_query($con, $query)){
error(".....");
}else{
这一切都很好。执行第一个查询,并将数据存储到表“用户”。但问题来了。下一个php代码生成新的mysql查询,永远不会执行。但是当我将它复制到PHPmyAdmin时,它可以工作......
$last_id=$con->insert_id;
$query='';
foreach($_SESSION['reg'] as $key=>$value){
if($value!=''){
$query.=" INSERT INTO user_detail (id_user,id_item,value) VALUES ('".$last_id."', (SELECT id_item FROM profil_items WHERE name='".$key."'), '".mysqli_real_escape_string($con, $value)."');";
}
}
if(!mysqli_query($con, $query)){
echo $query;
}else{
header('Location: ...somewhere....');
}
}
Mysqli错误消息:“您的SQL语法中有错误;请查看与您的MySQL服务器版本对应的手册,以便在'INSERT INTO user_detail(id_user,id_item,value)附近使用正确的语法VALUES('14' ,(在第1行选择id_po'。
我不明白。如果语法中有错误,那怎样才能在PHPmyAdmin中执行而没有错误?
答案 0 :(得分:0)
从来没有任何理由使用mysqli_multi_query()
。养成使用多重查询的习惯会让自己开启新的types of SQL injection vulnerabilities。
您应该在mysqli_query()
循环内单独执行每个INSERT,foreach
。
或者将多行附加到一个多行INSERT语句中并在循环后执行它。
在这种情况下,没有(虽然你应该使用绑定参数而不是mysqli_real_escape_string()
),但我认为一旦你开始使用mysqli_multi_query()
,你可能会以不安全的方式在其他地方使用它。最好不要使用它。
您可以使用多行语法执行单个INSERT。但是我不担心执行多个语句的开销,直到您以如此高的容量执行它才能测量出重大的性能问题。不要担心微观优化。