mysqli准备声明的命令

时间:2017-07-24 11:56:51

标签: php sql mysqli prepared-statement

我有一个名为friends的友谊表,如下所示:

id  | user1 | user2
------------------
1   | ab    | abc
2   | ab    | abcd
3   | aa    | ab

如果"ab""abc"位于同一行,则表示他们是朋友。现在,当用户说"ab"登录时,他会看到他的朋友'帖子('abc''abcd''aa'的帖子)以下是php代码:

    session_start();
    $name = $_SESSION['username']; //$name=ab;
    $stmt = mysqli_prepare($link,"SELECT location,postby,pid,likes,time FROM photos WHERE postby=? ORDER BY time");
    $query = $link->query("(select user2 from friends where user1='$name')union(select user1 from friends where user2='$name')");
 while($row=mysqli_fetch_array($query)) {
    $b = $row['user2'];
    $stmt->bind_param('s', $b);
    mysqli_stmt_execute($stmt);
    $stmt->bind_result($location, $postby,$id,$likes,$time);
    $stmt->store_result();
        while ($stmt->fetch()) {
          //code to display picture
        }
   }

问题是结果并不是真正的时间顺序。它将首先显示用户的所有帖子,并按时间对该用户的帖子进行排序,然后显示另一个用户的帖子,并按时间对该用户的帖子进行排序,但我想按顺序排序所有帖子时间。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

问题是您在单独的查询中获取结果。

您应该查询要显示帖子的所有用户ID(在您的情况下为'ab','abc','abcd'和'aa'),然后执行一个查询以获取所有帖子并订购结果

$stmt = mysqli_prepare($link,"SELECT location,postby,pid,likes,time FROM photos WHERE postby IN (?) ORDER BY time");

答案 1 :(得分:1)

您必须在一个查询中获取好友帖子。

尝试以下方法:

$sql = 'SELECT location, postby, pid, likes, time 
    FROM photos 
    WHERE 
     postby IN (
       SELECT user2 FROM friends where user1=?
       UNION 
       SELECT user1 FROM friends where user2=?
     )
    ORDER BY time';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $name, $name);
$stmt->execute();

答案 2 :(得分:0)

这是因为您的每个查询都会执行日期查询。首先,您尝试获取一个用户的所有数据,然后按日期时间排序。然后你找到其他用户和按时间排序。

如果你用连接编写一个完整的SQL语句然后statmenet make ordered,那会更好。

你可以发布整个表格,然后我可以给你写一个SQL查询,它会根据用户进行连接并按时间排序。

因为这是M的表:M你可以发布数据库设计的全貌。或者至少是关系中的表。