【问题标题】:mysqli_multi_query array issuemysqli_multi_query 数组问题
【发布时间】:2017-12-17 00:06:33
【问题描述】:

发生了一些奇怪的事情。 我有我的数据库,看起来像这样:

table name: dm
|id|receiver|sender|msg          |
|1 |John    |Emma  |Hey John!    |
|2 |Emma    |John  |Hey!         |
|3 |John    |Emma  |Whats up     |
|4 |Emma    |John  |Not too much |
|5 |John    |Keira |Have you got...|

我有一个带有 a 的 html 页面,现在我想要的是消息

  1. Emma 发送给 John => 接收方 = "John",发送方 = "Emma" 或
  2. John 发送给 Emma => 接收方 = “Emma”,发送方 = “John”

显示在控制台中。 我可以使用 JQuery 使用 console.log() 函数来做到这一点。

我的 PHP 看起来像这样:

$user1 = "John";
$user2 = "Emma";
$sql = "SELECT * FROM dm WHERE receiver = '$user1' AND sender = '$user2';SELECT * FROM dm WHERE receiver = '$user2' AND sender = '$user1'";

// Execute multi query
if (mysqli_multi_query($link,$sql))
{
  do
    {
      $i = 0;
      $msg = array();

    if ($result=mysqli_store_result($link)) {

      while ($row=mysqli_fetch_row($result))
        {
        printf("%s\n",$row[0]);
        $msg[$i] = $row[0];
          $i++;
        }
      mysqli_free_result($result);
      }
    }
  while (mysqli_next_result($link));
}

echo json_encode($msg);
exit();
mysqli_close($link);

您会注意到,我在其中有“printf”,因为我想看看数据库会返回给我什么。它正确地返回了 ID:1,3,2,4。

但是,我通常想使用 JQuery ajax 来执行请求。我也知道该怎么做。因此,我想要一个数组来保存所有帖子的 id,如下所示:

["1","2","3","4"]

不幸的是,我按照代码中所写的方式返回给我的是这样的:

["2","4"]

所以发生的事情是他只将第一个查询中的内容放入数组中。

那么我的问题到底是什么?

我想修复数组以保存所有相应消息的 ID,即 1、2、3、4。最好也按这个顺序,而不是像这样 1,3,2,4。

我希望我把问题说清楚了,感谢您的任何建议!

【问题讨论】:

  • 你的 jQuery 部分在哪里?
  • 这里不需要。问题出在 php.ini 中的某个地方。我可以说,因为当我单击按钮并被重定向到 php 页面(所以没有 ajax 请求)时,它会显示' 1 3 2 4 ["2","4"] '。 jquery 部分将只处理 json_encode($msg) 位。
  • 您对SQL injection 敞开心扉。您需要使用准备好的语句,而不是将变量连接到查询中。见How can I prevent SQL injection in PHP?
  • 你不能只做一个$msg[] = $row[0] 没有$i 吗?我看不出有什么区别……

标签: php jquery mysqli


【解决方案1】:

您在外循环内重置 $i$msg。这意味着您只会看到数组中第二个查询的结果。将 $i = 0;$msg = array(); 行移到该循环之外。

也就是说,这里没有理由进行 2 次查询。只需在 WHERE 子句中使用 OR 即可同时获得两个结果。这会更快更容易。

另外,这很重要:您对SQL injection 持开放态度。您需要使用准备好的语句,而不是将变量连接到查询中。见How can I prevent SQL injection in PHP?

【讨论】:

  • 我该怎么做呢?我需要的是“固定”接收者和发送者。所以要么是艾玛和詹姆斯,要么是詹姆斯和艾玛。
  • @D.Krold 你是什么意思?我已经在我的回答中告诉你如何解决这个问题:将这两行代码移到你的do ... while循环之外。这就是您所问问题的答案。如果你想要不同的东西,你应该接受这个答案,然后提出一个新问题。
  • 好吧,伙计,放松。
  • 如果您询问的是 SQL 查询,它应该是一个带有 WHERE 子句的查询,例如 WHERE receiver = '$user1' AND sender = '$user2' OR receiver = '$user2' AND sender = '$user1'。 (这只是为了说明。正如我所说,您遇到了 SQL 注入问题,您需要使用占位符和准备好的语句,而不是将变量直接连接到查询中。)
  • 谢谢你,太好了@Ed Cottrell
猜你喜欢
  • 2017-06-13
  • 2017-02-15
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多