[英]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
列表中的表達式分配別名。
我懷疑您不想要笛卡爾積(交叉連接操作)。我懷疑您想使comment
與post
匹配。
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,則完全不需要加入操作。
如果posts
和comments
的id
列的數據類型兼容,則可以執行以下操作:
( -- 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.