Проверка пустого результата (php, pdo, mysql)
Пожалуйста, может ли кто-нибудь сказать мне, что я здесь делаю неправильно? Я просто извлекаю результаты из таблицы, а затем добавляю их в массив. Все работает так, как ожидается, пока я не проверю пустой результат...
Получает совпадение, добавляет его в мой массив и повторяет результат, как и ожидалось:
$today = date('Y-m-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('Y-m-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 ;
Как всегда, любая помощь приветствуется. Спасибо!
Ответы
Ответ 1
Вы удаляете строку результатов, когда вы делаете $sth->fetchColumn()
. Это не то, как вы проверяете, есть ли какие-либо результаты. вы делаете
if ($sth->rowCount() > 0) {
... got results ...
} else {
echo 'nothing';
}
соответствующие документы здесь: http://php.net/manual/en/pdostatement.rowcount.php
Ответ 2
Несмотря на то, что это старый поток, я думал, что буду взвешивать, поскольку мне пришлось иметь дело с этим в последнее время.
Вы не должны использовать rowCount для операторов SELECT, поскольку он не переносится. Я использую функцию isset для проверки работоспособности оператора select:
$today = date('Y-m-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;
Конечно, это только для одного результата, как вы могли бы иметь, когда перебираете набор данных.
Ответ 3
$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!';
}
Ответ 4
Если у вас есть опция использования fetchAll(), то, если нет возвращенных строк, это будет просто и пустой массив.
count($sql->fetchAll(PDO::FETCH_ASSOC))
вернет количество возвращенных строк.
Ответ 5
что я здесь делаю неправильно?
Почти все.
$today = date('Y-m-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.
Ответ 6
Спасибо Marc B help, вот что сработало для меня (примечание: предложение Marc rowCount() может работать тоже, но мне было неудобно, если бы он не работал с другой БД или что-то изменилось в моей... также, его предложение select count (*) тоже будет работать, но я понял, что в конечном итоге я получаю данные, если они существуют, поэтому я пошел так)
$today = date('Y-m-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 ;
Ответ 7
Еще один подход к рассмотрению:
Когда я создаю таблицу 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)) {