$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。 有谁知道这个问题?谢谢!
答案 0 :(得分:1)
mysqli_fetch_array返回一个表示特定行结果的数组。如错误所示,传递给它的参数需要是mysqli_result资源。
在您的示例中第一次调用mysql_fetch_array是有效的,因为mysqli_result是query方法的返回类型。
但是,一旦你点击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'];
}
}
答案 1 :(得分:0)
关于查询本身的一些注意事项:查询在帖子和评论之间进行交叉连接,选择列表中的列是合格的,但是对timestamp_created
中的列order by
的引用条款没有资格。
查询使用旧式逗号语法进行连接操作。是时候放弃了,并使用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,则根本不需要加入操作。
如果来自id
和posts
的{{1}}列的数据表格兼容,您可以执行以下操作:
comments
如果您想保证整个结果的排序,您需要将 ( -- 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
)
作为列返回,并在其上指定ORDER BY。例如:
timestamp_created