SQL查询数组上的多重查询失败

时间:2015-05-30 02:00:26

标签: php mysql sql mysqli

$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。 有谁知道这个问题?谢谢!

2 个答案:

答案 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列表中的表达式指定别名。

我怀疑您不想要笛卡尔积(交叉加入操作)。我怀疑您希望将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,则根本不需要加入操作。

如果来自idposts的{​​{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