В настоящее время я разрабатываю приложение для социальных сетей, которое включает пользователей (вы можете добавить их в друзья) и сообщения (текст, изображение и т. д.)
Я хочу показать пользователю 5 новейших сообщений по сравнению с сообщениями пользователя и сообщениями друзей пользователя, когда пользователь входит в приложение.
Я знаю, что это не самый разумный способ добиться этого, но пока я это делал. Запрос вернул только одно сообщение, хотя их больше, и даже не самое новое и не самое старое. Думаю, проблема в предложении «ИЛИ».
Я получаю все sno друзей пользователя и вставляю предложение WHERE один за другим с предложением «OR».
//CURRENT FRIENDS
$sql = 'SELECT current AS currents FROM friends WHERE sno = :sno';
$query = $this -> conn -> prepare($sql);
$query -> execute(array(':sno' => $usersSno));
$friends = $query -> fetchObject() -> currents;
//SELECT 5 NEWEST POST
$sql = 'SELECT operationId FROM posts WHERE operationId = :operationId';
$array = array(':operationId' => $usersSno);
if (isset($friends)) {
$ids = explode(",", $friends);
for($i = 0; $i < count($ids); $i++) {
$sql = $sql.' OR operationId = :operationId'.$i;
$array[':operationId'.$i] = $ids[$i];
}
}
if ($from == null)
$sql = $sql.' ORDER BY operationId DESC LIMIT 5';
else {
$sql = $sql.' AND operationId < :from ORDER BY operationId DESC LIMIT 5';
$array[':from'] = $from;
}
$query = $this -> conn -> prepare($sql);
$query -> execute($array);
$result = $query -> fetchAll(PDO::FETCH_ASSOC);
Sno пользователя - 1, и у пользователя есть два друга, sno - 2 и 75.
echo $ sql;
SELECT operationId FROM posts WHERE operationId = :operationId OR operationId = :operationId0 OR operationId = :operationId1 ORDER BY operationId DESC LIMIT 5
print_r ($ массив);
Array
(
[:operationId] => 1
[:operationId0] => 2
[:operationId1] => 75
)
У меня получилось, спасибо за рекомендацию.






Я чувствую себя глупцом из-за того, что осознал свою ошибку сразу после того, как объявил за это вознаграждение. Мне следовало использовать WHERE sno (так как я получаю сообщения с идентификатора пользователя [sno]), а не WHERE operationId в $sql.
Итак, echo $sql; будет похож:
SELECT operationId FROM posts WHERE sno = :sno OR sno = :sno0 OR sno = :sno1 ORDER BY operationId DESC LIMIT 5
И print_r($array) это:
Array
(
[:sno] => 1
[:sno0] => 2
[:sno1] => 75
)
По крайней мере, я счастлив решить эту проблему и даже решить ее самостоятельно :)
EDIT: I noticed two logical error too in my sql query.
1- Сравнение строки даты с operationId сообщения
Я сравниваю сообщения с их датами (вы также можете сравнить с operationId сообщения), чтобы узнать, какое из них самое новое. Но в коде я сравнил operationId с переменной $from (которая является строкой даты).
Итак, последний код;
$sql = $sql.') AND createdAt < :from ORDER BY operationId DESC LIMIT 5';
2- Предложение ИЛИ следует разделять предложением И круглыми скобками.
начало круглой скобки
$sql = 'SELECT operationId FROM posts WHERE (sno= :sno';
конец круглой скобки
if ($from == null)
$sql = $sql.') ORDER BY operationId DESC LIMIT 5';
else {
$sql = $sql.') AND createdAt < :from ORDER BY operationId DESC LIMIT 5';
$array[':from'] = $from;
}
Логику PHP сложно понять. Пожалуйста, разместите несколько примеров из
echo $sql;и соответствующегоprint_r($array);непосредственно передexecute().