Получение ленты новостей (социальные сети)

В настоящее время я разрабатываю приложение для социальных сетей, которое включает пользователей (вы можете добавить их в друзья) и сообщения (текст, изображение и т. д.)

Я хочу показать пользователю 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
)

Логику PHP сложно понять. Пожалуйста, разместите несколько примеров из echo $sql; и соответствующего print_r($array); непосредственно перед execute().

Michael Berkowski 21.05.2018 15:57

У меня получилось, спасибо за рекомендацию.

Yusuf Çağlar 21.05.2018 16:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
2
284
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я чувствую себя глупцом из-за того, что осознал свою ошибку сразу после того, как объявил за это вознаграждение. Мне следовало использовать 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;
}

Другие вопросы по теме