Подтвердить что ты не робот

Проверка пустого результата (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 ;

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

4b9b3361

Ответ 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)) {