#php #mysql #pdo
#php #mysql #pdo
Вопрос:
Я пытаюсь исключить определенные строки с помощью запроса PDO, но он не возвращает правильное значение, и я не вижу своей ошибки, может быть, кто-то из вас может мне помочь.
Это первый запрос, который работает.
$objGetRecievedChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE recieverid = :recieverid GROUP BY chatid');
Теперь я хочу исключить chatid
‘s, которые я получаю из этого запроса.
foreach ($getRecievedChatFtch as $chatid) {
echo $chatid['chatid'] . '<BR>';
}
Когда я повторяю вышесказанное, я получаю следующий результат:
20920
81586
Что правильно, я хочу исключить эти два значения, поэтому я выполняю следующий запрос:
$objGetSendChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE ownerid = :ownerid AND chatid != :chatid GROUP BY chatid');
foreach ($getSendChat as $key ) {
echo $key['chatid'] . '<BR>';
}
Но когда я повторяю вышесказанное, я получаю следующие значения
44495
20920
44495
это значение 44495
правильное, хотя оно мне нужно только один раз (вот почему я GROUP BY chatid
), но это значение 20920
является одним из значений, которые мне нужно исключить.
Кто-нибудь знает, что я делаю не так?
Заранее спасибо!
Весь код:
//Voor de berichten die je hebt ontvangen.
$objGetRecievedChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE recieverid = :recieverid GROUP BY chatid');
$objGetRecievedChat->bindParam('recieverid', $member_id);
$objGetRecievedChat->execute();
$getRecievedChatFtch = $objGetRecievedChat->fetchAll(PDO::FETCH_ASSOC);
//Dit is voor verzonden berichten.
foreach ($getRecievedChatFtch as $chatid) {
echo $chatid['chatid'] . '<BR>';
$objGetSendChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE ownerid = :ownerid AND chatid NOT IN(:chatid) GROUP BY chatid');
$objGetSendChat->bindParam('ownerid', $member_id);
$objGetSendChat->bindParam('chatid', $chatid['chatid']);
$objGetSendChat->execute();
$getSendChat = $objGetSendChat->fetchAll(PDO::FETCH_ASSOC);
foreach ($getSendChat as $key) {
echo $key['chatid'] . '<BR>';
}
}
Комментарии:
1. Вы не исключаете с помощью PD, PDO здесь не имеет значения. Вы просто исключаете с помощью самого запроса. Если у вас есть массив данных, вы можете использовать
WHERE chatid NOT IN(:chatid)
2. Если вы выполните a
GROUP BY chatid
, вы не сможете получить повторение одного и того же идентификатора чата дважды. Я чувствую, что вы не делитесь всей историей.3. Я не понимаю, есть массив с 2 элементами, которые вы хотите исключить, а в вашем запросе только 1
chatid != :chatid
. Как вы связываете свои переменные? И вам, вероятно, нужноchatid NOT IN (.., ..)
.4. Я использую bindParam для привязки переменных.
Ответ №1:
Измените запрос на catid НЕ В (xxxx, xxxx).
Комментарии:
1. По-прежнему дает те же результаты, что и раньше.
Ответ №2:
Вы делаете это неправильно: в вашем цикле foreach вы извлекаете ВСЕ строки, КРОМЕ текущей. Вы должны поместить запрос из foreach
и использовать WHERE IN
//Voor de berichten die je hebt ontvangen.
$objGetRecievedChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE recieverid = :recieverid GROUP BY chatid');
$objGetRecievedChat->bindParam('recieverid', $member_id);
$objGetRecievedChat->execute();
$getRecievedChatFtch = $objGetRecievedChat->fetchAll(PDO::FETCH_ASSOC);
//Dit is voor verzonden berichten.
$chatids = array();
foreach ($getRecievedChatFtch as $chatid) {
echo $chatid['chatid'] . '<BR>';
$chatids = $chatid['chatid'];
}
$placeholders = implode(',', array_fill('?', count($chatids)));
$objGetSendChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE ownerid = ? AND chatid NOT IN(' . $placeholders . ') GROUP BY chatid');
$objGetSendChat->execute(array_merge(array($ownerid, $chatids)));
$getSendChat = $objGetSendChat->fetchAll(PDO::FETCH_ASSOC);
foreach ($getSendChat as $key) {
echo $key['chatid'] . '<BR>';
}
Более или менее (потому что мне не нравится использовать WHERE IN
with prepared statement. Обычно вы можете избежать их с JOIN
помощью .
$objGetSendChat = ...
При использовании $getSendChat
в foreach
.
Поэтому я чувствую, что нам не хватает некоторого кода, который содержит ошибку.
Кроме того, вы выполняете a GROUP BY chatid
и получаете 44495
в результате дважды, поэтому результат не может быть результатом запроса.
Комментарии:
1. Я просто выполняю выборку.
2. $getSendChat = $objGetSendChat->fetchAll(PDO::FETCH_ASSOC);
3. Наличие дважды одного и того же значения из
GROUP BY
столбца означает, что результат не совпадает с результатом запроса, поэтому вам следует отредактировать свой вопрос и показать весь код.4. Обновлен мой первоначальный комментарий.
5. Теперь это лучше. Каждый раз, когда вы запускаете свой запрос в
foreach
, вы получите ВСЕ строки, КРОМЕ текущей, отсюда и ваши результаты.