【问题标题】:sql fails to execute via mysqli_multi_querysql 无法通过 mysqli_multi_query 执行
【发布时间】:2018-11-14 00:24:22
【问题描述】:

我是使用 mysqli_multi_query 的新手,并没有在 php 中花费大量时间。当我直接在我的数据库客户端(phpMyAdmin)中应用它时,我的 sql 成功,但它不会从我的 php 代码中执行。此函数的返回旨在成为一个包含 2 个 SELECT 语句的结果的 2 项数组,但它总是返回空。 (注意:连接成功;$con 在别处定义。)

function claimItem($key){
    //remove expiry, decrement quantity available, send Kate & Sasha an email.
    global $con;
    $sql = "SELECT A.name, B.name, C.quantity, B.id FROM invitees A, items B, invitees_items C WHERE C.activation_key = '$key' AND C.items_id = B.id AND C.invitees_id = A.id; SELECT @qnt := quantity, @itm := items_id FROM invitees_items WHERE `activation_key` = '$key'; UPDATE items SET num_available = GREATEST(num_available - @qnt, 0) WHERE id = @itm; UPDATE invitees_items SET expiry = null, activation_key = null WHERE activation_key = '$key';";

    $multiArr = array(array(), array());

    if (mysqli_multi_query($con,$sql)){
      $qcount = 0;
      do
        {
        // Store first result set
        $result=mysqli_store_result($con);
          // Fetch one and one row
          while ($row=mysqli_fetch_row($result))
            {
                array_push($multiArr[$qcount], $row);
            }
          // Free result set
          mysqli_free_result($result);

          $qcount++;
        }
      while (mysqli_next_result($con));
    }
    else {
        return "failure";
    }

    mysqli_close($con); 
    return $multiArr;
}

【问题讨论】:

  • 不要使用mysqli_multi_query,从安全角度来看这是非常危险的。
  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db->prepare("…") 程序接口是 PHP 4 时代引入的 mysqli API 的产物,不应在新代码中使用。
  • 谢谢,tadman,感谢您的建议。在我得到这个工作之后,我会采取这些建议来提高安全性,但现在我仍然想知道为什么 sql 不执行并且数组不填充。
  • (fwiw 我仍处于虚拟数据/内部测试阶段,因此目前没有安全风险)

标签: php mysql mysqli mysqli-multi-query


【解决方案1】:

变量名存在一些问题。

有一个变量$multiArr 已被初始化,但直到最后才被引用,它被返回。这解释了为什么返回一个空数组。 (有一个不同的变量,名为 $multiArray,在函数体中被引用)。

还有一个变量$qcount 被初始化和引用。但是该变量不会增加。相反,一个名为 $count 的变量会递增。


我建议在声明 mysqli_multi_query 存在问题之前先将其平方。

代码似乎使用了一种已知易受 SQL 注入攻击的模式。并且使用mysqli_multi_query 会为恶意攻击敞开大门。

【讨论】:

  • 谢谢,Spencer,好眼力——修正了错别字,仍然看不到 sql 的执行。在我开始工作后,我会接受 tadman 的建议以提高安全性,但现在我仍然想知道为什么 sql 不执行并且数组不填充。
猜你喜欢
  • 2023-03-18
  • 2023-03-15
  • 2021-12-07
  • 2010-12-04
  • 2019-06-18
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多