Проверка пустого результата (php, pdo, mysql)

Пожалуйста, может кто-нибудь сказать мне, что я здесь делаю неправильно? Я просто извлекаю результаты из таблицы, а затем добавляю их в массив. Все работает так, как ожидается, пока я не проверю пустой результат …

Это получает совпадение, добавляет его в мой массив и повторяет результат, как и ожидалось:

$today = date('Ym-d', strtotime('now')); $sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC"); $sth->bindParam(':today',$today, PDO::PARAM_STR); if(!$sth->execute()) { $db = null ; exit(); } while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { $this->id_email[] = $row['id_email'] ; echo $row['id_email'] ; } $db = null ; return true ; 

Когда я пытаюсь проверить пустой результат, мой код возвращает «пусто», но не дает результат совпадения:

 $today = date('Ym-d', strtotime('now')); $sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC"); $sth->bindParam(':today',$today, PDO::PARAM_STR); if(!$sth->execute()) { $db = null ; exit(); } if ($sth->fetchColumn()) { echo 'not empty'; while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { $this->id_email[] = $row['id_email'] ; echo $row['id_email'] ; } $db = null ; return true ; } echo 'empty'; $db = null ; return false ; 

Как всегда, любая помощь приветствуется. Благодаря!

Вы $sth->fetchColumn() строку результатов, когда вы делаете $sth->fetchColumn() . Это не так, как вы проверяете, есть ли какие-либо результаты. вы делаете

 if ($sth->rowCount() > 0) { ... got results ... } else { echo 'nothing'; } 

соответствующие документы здесь: http://php.net/manual/en/pdostatement.rowcount.php

Несмотря на то, что это старая нить, я думал, что буду взвешивать, поскольку мне пришлось иметь дело с этим в последнее время.

Вы не должны использовать rowCount для операторов SELECT, поскольку он не переносится. Я использую функцию isset для проверки работоспособности оператора select:

 $today = date('Ym-d', strtotime('now')); $sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC"); //I would usually put this all in a try/catch block, but kept it the same for continuity if(!$sth->execute(array(':today'=>$today))) { $db = null ; exit(); } $result = $sth->fetch(PDO::FETCH_OBJ) if(!isset($result->id_email)) { echo "empty"; } else { echo "not empty, value is $result->id_email"; } $db = null; 

Конечно, это только для одного результата, как вы могли бы иметь, когда перебираете набор данных.

 $sql = $dbh->prepare("SELECT * from member WHERE member_email = '$username' AND member_password = '$password'"); $sql->execute(); $fetch = $sql->fetch(PDO::FETCH_ASSOC); // if not empty result if (is_array($fetch)) { $_SESSION["userMember"] = $fetch["username"]; $_SESSION["password"] = $fetch["password"]; echo 'yes this member is registered'; }else { echo 'empty result!'; } 

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

 count($sql->fetchAll(PDO::FETCH_ASSOC)) 

вернет число возвращенных строк.

что я здесь делаю неправильно?

Почти все.

 $today = date('Ym-d'); // no need for strtotime $sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC"); $sth->bindParam(':today',$today); // no need for PDO::PARAM_STR $sth->execute(); // no need for if $this->id_email = $sth->fetchAll(PDO::FETCH_COLUMN); // no need for while return count($this->id_email); // no need for the everything else 

эффективно, у вас всегда есть ваши данные (в этом случае в переменной $this->id_email ), чтобы указать, вернул ли ваш запрос что-либо или нет. Подробнее читайте в моей статье о PDO .

Благодаря помощи Marc B, вот что сработало для меня (примечание: предложение rowCount () Marc может работать тоже, но мне было неудобно, что он не работал с другой БД или что-то изменилось в моей … также , его предложение select count (*) тоже будет работать, но я решил, что в конечном итоге я получу данные, если он будет существовать, поэтому я пошел так)

 $today = date('Ym-d', strtotime('now')); $sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC"); $sth->bindParam(':today',$today, PDO::PARAM_STR); if(!$sth->execute()) { $db = null ; exit(); } while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { $this->id_email[] = $row['id_email'] ; echo $row['id_email'] ; } $db = null ; if (count($this->id_email) > 0) { echo 'not empty'; return true ; } echo 'empty'; return false ; 

Еще один подход к рассмотрению:

Когда я создаю таблицу HTML или другой контент, зависящий от базы данных (обычно через вызов AJAX), мне нравится проверять, возвращал ли запрос SELECT какие-либо данные перед началом работы над любой разметкой. Если данных нет, я просто возвращаю «Нет данных …» или что-то в этом роде. Если есть данные, тогда вперед, создайте заголовки и пропустите содержимое и т. Д. Хотя я, скорее всего, ограничу мою базу данных MySQL, я предпочитаю писать переносимый код, поэтому rowCount () отсутствует. Вместо этого проверьте количество столбцов. Запрос, который не возвращает строк, также не возвращает столбцов.

 $stmt->execute(); $cols = $stmt->columnCount(); // no columns == no result set if ($cols > 0) { // non-repetitive markup code here while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {