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




php pdo rowcount (6)

S'il vous 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 je 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 répercute le 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 rechercher un résultat vide, mon code renvoie "vide", 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!


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

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


Merci à l'aide de Marc B, voici ce qui a fonctionné pour moi (note: la suggestion de Marc rowCount () pourrait fonctionner aussi, mais je n'étais pas à l'aise avec la possibilité de ne pas travailler sur un DB différent ou si , sa suggestion de compte de sélection (*) fonctionnerait aussi, mais, j'ai figuré parce que je finirais par obtenir les données si elles existaient de toute façon, ainsi 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 ;

Une approche de plus à 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 a renvoyé des données avant de travailler sur un balisage. S'il n'y a pas de données, je renvoie simplement "Aucune donnée trouvée ..." ou quelque chose à cet effet. S'il y a des données, alors allez de l'avant, créez les en-têtes et faites une boucle sur 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)) {

$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!';
}

Si vous avez l'option d'utiliser fetchAll () alors s'il n'y a pas de ligne retournée, elle sera simplement vide et sera vide.

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

retournera le nombre de lignes retournées.


Vous $sth->fetchColumn() une ligne de résultat lorsque vous faites $sth->fetchColumn() . Ce n'est pas comme ça que vous vérifiez s'il y a des résultats. tu fais

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

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







pdo