Vérification du résultat vide (php, pdo, mysql)

S'il te plaît, quelqu'un peut-il me dire ce que je fais mal ici? Je récupère simplement les résultats d'une table puis les ajoute à un tableau. Tout fonctionne comme prévu jusqu'à ce que je vérifie un résultat vide...

Cela obtient la correspondance, l'ajoute à mon tableau et fait écho au résultat comme prévu:

$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 ;

Lorsque j'essaie de vérifier un résultat vide, mon code renvoie 'empty', mais ne donne plus le résultat correspondant:

$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 ;

Comme toujours, toute aide est appréciée. Merci!

36
demandé sur canoebrain 2012-11-20 20:58:56

7 réponses

Vous jetez une ligne de résultat lorsque vous faites $sth->fetchColumn(). Ce n'est pas comme ça qu'on vérifie s'il y a des résultats. c'est vrai

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

Documents pertinents ici: http://php.net/manual/en/pdostatement.rowcount.php

72
répondu Marc B 2012-11-20 17:01:28

Même si c'est un vieux fil, j'ai pensé que j'allais peser car j'ai dû faire face à cela dernièrement.

Vous ne devez pas utiliser rowCount pour les instructions SELECT car il n'est pas portable. J'utilise la fonction isset pour tester si une instruction select a fonctionné:

$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;

Bien sûr, ce n'est que pour un seul résultat, comme vous pouvez l'avoir lors d'une boucle sur un ensemble de données.

7
répondu stubsthewizard 2014-12-02 22:03:58

Si vous avez la possibilité d'utiliser fetchAll() alors s'il n'y a pas de lignes retournées, ce sera juste un tableau vide.

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

Renvoie le nombre de lignes renvoyées.

7
répondu josh123a123 2016-05-16 14:40:22
$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
répondu Mahmoud Ali 2015-03-15 22:39:05

Ce que je fais mal ici?

Presque tout.

$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

Effectivement, vous avez toujours vos données récupérées (dans ce cas dans la variable $this->id_email) pour dire si votre requête a renvoyé quelque chose ou non. En savoir plus dans mon article sur PDO .

2
répondu Your Common Sense 2016-05-16 15:03:44

Une autre approche à considérer:

Lorsque je construis une table HTML ou un autre contenu dépendant de la base de données (généralement via un appel AJAX), j'aime vérifier si la requête SELECT renvoie des données avant de travailler sur un balisage. S'il n'y a pas de données, je retourne simplement "aucune donnée trouvée..."ou quelque chose à cet effet. S'il y a des données, allez de l'avant, construisez les en-têtes et parcourez le contenu, etc. Même si je vais probablement limiter ma base de données à MySQL, je préfère écrire du code portable, donc rowCount() est sorti. Au lieu de cela, vérifiez le nombre de colonnes. Une requête qui ne renvoie aucune ligne ne renvoie également aucune colonne.

$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)) {
1
répondu lango 2015-05-31 09:40:32

Merci à L'aide de Marc B, voici ce qui a fonctionné pour moi (note: la suggestion rowCount() de Marc pourrait aussi fonctionner, mais je n'étais pas à l'aise avec la possibilité que cela ne fonctionne pas sur une base de données différente ou si quelque chose a changé dans la mienne... en outre, sa suggestion select count(*) fonctionnerait aussi, mais, j'ai pensé parce que je finirais par obtenir les données si elles existaient de toute façon, alors je suis allé de cette façon)

$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 ;
0
répondu canoebrain 2012-11-20 17:51:05