为什么这个mysql查询无法从php工作

时间:2014-04-23 21:08:41

标签: php mysql syntax mysqli phpmyadmin

注册程序中的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中执行而没有错误?

1 个答案:

答案 0 :(得分:0)

从来没有任何理由使用mysqli_multi_query()。养成使用多重查询的习惯会让自己开启新的types of SQL injection vulnerabilities

您应该在mysqli_query()循环内单独执行每个INSERT,foreach

或者将多行附加到一个多行INSERT语句中并在循环后执行它。


在这种情况下,没有(虽然你应该使用绑定参数而不是mysqli_real_escape_string()),但我认为一旦你开始使用mysqli_multi_query(),你可能会以不安全的方式在其他地方使用它。最好不要使用它。

您可以使用多行语法执行单个INSERT。但是我不担心执行多个语句的开销,直到您以如此高的容量执行它才能测量出重大的性能问题。不要担心微观优化。