2011-11-18 77 views
1

我有以下代碼來顯示發送,接收和接受簡單的朋友系統的邀請。雖然循環的順序基於關聯數組php?

while ($friend = $q -> fetch(PDO::FETCH_ASSOC)) { 
     if ($friend['id'] == $user['id'] && $friend['friendAccept'] == 0) echo '<p>You have sent a request to be <a href="http://www.n.com/viewaccount?id=' . $friend['withID'] . '">' . $friend['username'] . '\'s</a> friend.</p>'; 
     if ($friend['withID'] == $user['id'] && $friend['friendAccept'] == 0) echo '<p>You have recieved a request from <a href="http://www.n.com/viewaccount?id=' . $friend['withID'] . '">' . $friend['username'] . '</a>.</p>'; 
     if ($friend['id'] == $user['id'] && $friend['friendAccept'] == 1) echo '<p>You are friends with <a href="http://www.n.com/viewaccount?id=' . $friend['withID'] . '">' . $friend['username'] . '</a>.</p>'; 
} 

它會顯示你有什麼朋友,你發送了哪些朋友請求,以及接收了哪些朋友請求。我從一個mysql查詢中獲取所有這些信息。但唯一的問題是,它們並不是按順序進行的,因爲while循環在列表中迭代並執行它應該執行的任何操作。

有沒有辦法讓他們仍然只使用一個查詢?我的意思是指在一個列表中收到的所有請求,在一個列表中發送的請求以及在一個列表中的朋友。因爲它是在他們按順序他們從桌上被拉出的分鐘。

查詢...

$q = $dbc -> prepare("SELECT social.*, accounts.username FROM social INNER JOIN accounts WHERE social.withID = accounts.ID AND (social.id = ? OR social.withID = ?) AND type = 'friend'"); 
$q -> execute(array($user['id'], $user['id'])); 
+0

什麼*是*正確的順序?你可以顯示查詢嗎? – JJJ

+0

好吧,現在編輯我的問題... – NovacTownCode

+0

請注意,'PDOStatement'實現了['Traversable'](http://php.net/Traversable)接口,因此您可以使用'foreach'而不是' while'。它不會影響結果的順序,但更具可讀性(「對於序列的每個元素」而不是「當某些條件成立時」更好地描述了循環的作用)。 – outis

回答

1

這是絕對可能的:

SELECT social.*, accounts.username 
FROM social 
INNER JOIN accounts 
WHERE social.withID = accounts.ID 
AND (social.id = ? OR social.withID = ?) 
AND type = 'friend' 
ORDER BY 
(social.id = $user_id AND social.friendAccept = 0), 
(social.withID = $user_id AND social.friendAccept = 0), 
(social.id = $user_id AND social.friendAccept = 1) 

只要把ORDER BY子句中的正確的順序。它的工作方式是使用表達式求值的布爾值對其進行排序。

當然,您還應該將$ user_id轉換爲?在準備好的聲明中。

+0

好吧現在就試試這個,我之前沒有遇到過,謝謝。 – NovacTownCode

+0

感謝這很簡單容易,我不知道可以根據結果訂購查詢再次感謝芽! – NovacTownCode

0

你可以改變SQL查詢做一個

ORDER BY x ASC/DESC 

或者你可以在PHP中創建結果的數組,然後使用任何PHP的排序函數根據任何標準對數組進行排序。

有關更多信息,請參見http://php.net/manual/en/array.sorting.php

編輯:我覺得

uasort() 

可能會有所幫助。你可以定義你自己的比較函數,然後PHP將根據它進行排序。有關信息,請參閱http://www.php.net/manual/en/function.uasort.php

+0

將看看這個謝謝。 – NovacTownCode

0
$q = $dbc -> prepare("SELECT social.*, accounts.username FROM social INNER JOIN accounts WHERE social.withID = accounts.ID AND (social.id = ? OR social.withID = ?) AND type = 'friend' ORDER BY social.friendAccept ASC"); 
$q -> execute(array($user['id'], $user['id'])); 

ORDER BY social.friendAccept

它會得到不接受用戶至上。

如果你給一些數據的例子我能更多的幫助

+0

它應該是'ORDER BY',而不是'ORDERY BY' :) – brianreavis

+0

謝謝你修復警告 –