簡體   English   中英

多查詢在SQL數組上失敗

[英]Multiquery failing on SQL array

$postsret_query = mysqli_fetch_array($db->query("SELECT posts.id,comments.id FROM posts,comments ORDER BY timestamp_created LIMIT 10"));
echo $postsret_query['posts.id'];

while($row = mysqli_fetch_array($postsret_query)){  }

它給了我:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in G:\PHP\DEVELOPMENT\index.php on line 101

那我該怎么解決呢? 我正在使用Mysqli,我想做一個查詢,以獲取最新的帖子(來自帖子)和最新的評論(來自評論),並在數組上顯示它的10個持續時間為1時間。 有人知道這個問題嗎? 謝謝!

mysqli_fetch_array返回一個表示特定行結果的數組。 如錯誤所暗示,傳遞給它的參數必須是mysqli_result資源。

在您的示例中,對mysql_fetch_array的第一次調用是有效的,因為mysqli_result是查詢方法的返回類型。

但是,一旦到達while循環,您現在將傳遞該關聯數組而不是mysqli_result資源。

嘗試像這樣重構代碼:

$result = $db->query("SELECT p.id  AS `posts.id` , c.id  AS `comments.id` FROM posts JOIN comments ON c.post_id = c.id ORDER BY p.timestamp_created DESC LIMIT 10");

if ($result === false) {
    echo mysqli_error($db);
} else {
    while($row = mysqli_fetch_array($result)) { 
            echo $row['posts.id'];
    }
}

我要指出的另一件事。 mysqli有兩種綁定類型-面向對象和過程。 您似乎在混合和匹配這兩種樣式。 您應該選擇一個。

OO版本看起來更像:

$db = new mysqli("localhost", "user", "password", "db");
$result = $db->query("SELECT p.id  AS `posts.id` , c.id  AS `comments.id` FROM posts JOIN comments ON c.post_id = c.id ORDER BY p.timestamp_created DESC LIMIT 10");

if ($result === false) {
    echo $db->error;
} else {
    while($row = $result->fetch_array(MYSQLI_ASSOC)) { 
            echo $row['posts.id'];
    }
}

而程序版本如下所示:

$db = mysqli_connect("localhost", "user", "password", "db");
$result = mysqli_query($db, "SELECT p.id  AS `posts.id` , c.id  AS `comments.id` FROM posts JOIN comments ON c.post_id = c.id ORDER BY p.timestamp_created DESC LIMIT 10");

if ($result === false) {
    echo mysqli_error($db);
} else {
    while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { 
            echo $row['posts.id'];
    }
}

有關查詢本身的幾點說明:查詢在帖子和評論之間進行交叉聯接,選擇列表中的列是合格的,但是對order by子句中創建的timestamp_created的引用是不合格的。

該查詢使用老式的逗號語法進行聯接操作。 現在該放棄它了,並使用JOIN關鍵字。

同樣,結果集中返回的列都將使用id作為列名。 沒有返回列引用上的限定符。 如果要返回名為posts.id的列,則需要為select列表中的表達式分配別名。

我懷疑您不想要笛卡爾積(交叉連接操作)。我懷疑您想使commentpost匹配。

  SELECT p.id  AS `posts.id`
       , c.id  AS `comments.id` 
    FROM posts
    JOIN comments
      ON c.post_id = c.id
   ORDER BY p.timestamp_created DESC
   LIMIT 10

我們只是在猜測您要返回什么結果集。

但是您的查詢絕對不會返回名為posts.id的列。


keleem現在剛剛發布了有關代碼的答案,因此無需在此重復。


如果要返回最新的10條帖子的ID和最新的10條評論的ID,則完全不需要加入操作。

如果postscommentsid列的數據類型兼容,則可以執行以下操作:

  ( -- latest 10 posts 
    SELECT 'post' AS type
         , p.id
      FROM posts p
     ORDER BY p.timestamp_created DESC
     LIMIT 10
  )
  UNION ALL
  ( -- latest 10 comments 
    SELECT 'comment'
         , c.id
      FROM comments c
     ORDER BY c.timestamp_created DESC
     LIMIT 10
  )

如果要保證整個結果的順序,則需要將timestamp_created作為列返回,並在其上指定ORDER BY。 例如:

SELECT v.type
     , v.id
  FROM (
         ( -- latest 10 posts 
           SELECT 'post' AS type
                , p.id
                , c.timestamp_created
             FROM posts p
            ORDER BY p.timestamp_created DESC
            LIMIT 10
         )
         UNION ALL
         ( -- latest 10 comments 
           SELECT 'comment'
                , c.id
                , c.timestamp_created
             FROM comments c
            ORDER BY c.timestamp_created DESC
            LIMIT 10
         )
       ) v
 ORDER BY v.timestamp_created DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM