2017-07-24 38 views
0

準備語句中的順序我有一個朋友叫表friends看起來像這樣:的mysqli通過

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

如果"ab"和​​是在同一行中就意味着他們是朋友。現在,當用戶說"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 
     } 
    } 

的問題是,結果是不是真的按時間排序。它會首先顯示用戶的所有帖子,然後按時間順序排列該用戶的帖子,然後顯示另一個用戶的帖子,然後按時間排列該用戶的帖子,但我想按時間排列所有帖子。我怎樣才能做到這一點?

+0

如果你能打印出時間字段,告訴我們您從查詢有結果:) –

回答

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(); 
+0

嗨,我怎麼能在這種情況下使用準備好的語句和綁定參數? – gravition

+0

就像你用其他的mysqli查詢一樣。我編輯了我的答案。 –

+0

嗨,我得到了「調用成員函數bind_param()布爾值」,這意味着準備好的語句返回false?你是否錯過了一個關閉括號或什麼?在你的sql – gravition

0

這是因爲您的日期查詢是在您的每個查詢上執行的。因此,首先嚐試獲取一個用戶的所有數據,然後再按日期排序。然後你可以找到其他用戶和按時間排序。

如果你用連接編寫一個完整的SQL語句,然後statmenet命令,那會更好。

你可以發佈整個表,然後我可以給你寫一個SQL查詢,它可以根據用戶進行連接並按時間排序。

由於這是M:M的表格,您可以發佈數據庫設計的整個圖片。或者至少是處於關係中的表格。

+0

你的意思是你想看到的「照片」表的設計? – gravition

1

問題是您在單獨的查詢中獲取結果。

您應該查詢所有想要顯示來自('ab','abc','abcd'和'aa'的案例的帖子)的用戶標識符,然後執行一個查詢以獲取所有帖子和訂單那結果。

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