2011-11-18 64 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

谢谢你修复警告 –