【问题标题】:why this mysql query doesnt work from php为什么这个mysql查询不能从php工作
【发布时间】:2014-04-23 21:08:41
【问题描述】:

注册过程中的 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' , (SELECT id_po' at line 1".

我不明白。如果语法有错误,如何在 PHPmyAdmin 中执行而不出错?

【问题讨论】:

  • 错误消息中的查询似乎与“损坏”代码中的查询不匹配。
  • @ogc-nick 我想它已经被翻译了:polozka=item, hodnota=value
  • 发布查询的确切文本(由您的echo 语句输出)。
  • Multiple statements or multi queries must be executed with mysqli_multi_query(). -- reference php.net
  • mysqli_multi_query() 修复它。谢谢你。 (polozka=item, hodnota=value - 为了更好理解,我翻译了名称)

标签: php mysql syntax mysqli phpmyadmin


【解决方案1】:

从来没有任何理由使用mysqli_multi_query()。养成使用多查询的习惯,让您对新的types of SQL injection vulnerabilities 敞开心扉。

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

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


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

您可以使用多行语法执行单个 INSERT。但我不会担心执行多条语句的开销,除非您执行的量如此之大,以至于您可以衡量一个重要的性能问题。不用担心微优化。

【讨论】:

  • 你是对的,但在这种情况下,没有任何选项可以进行 sql 注入。或者他们是?用户输入由 mysqli_real_escape_string 函数处理。解决方案的核心是假设一个查询处理得更快......也许我错了。
  • “解决方案的核心是假设”——永远不要假设,要遵循事实。
猜你喜欢
  • 2014-03-30
  • 2015-05-19
  • 1970-01-01
  • 2012-03-20
  • 2011-05-04
  • 1970-01-01
  • 2023-03-23
  • 2012-08-19
  • 2023-03-22
相关资源
最近更新 更多