web-dev-qa-db-fra.com

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

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 les ajoute à un tableau. Tout fonctionne comme prévu jusqu'à ce que je vérifie un résultat vide ...

Cela obtient le match, 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 rechercher un résultat vide, mon code renvoie 'vide', mais ne renvoie 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!

46
canoebrain

Vous jetez 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

88
Marc B

Si vous avez la possibilité d'utiliser fetchAll (), si aucune ligne n'est renvoyée, il s'agira simplement d'un tableau vide.

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

retournera le nombre de lignes retournées.

10
josh123a123
$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!';
}
8
Mahmoud Ali

Bien que ce soit un vieux fil, je pensais que j'allais intervenir car je devais m'en occuper récemment.

Vous ne devez pas utiliser rowCount pour les instructions SELECT car elles ne sont pas portables. 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 entendu, il ne s'agit que d'un seul résultat, comme vous pourriez le faire lors d'une boucle sur un ensemble de données.

7
stubsthewizard

qu'est-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 toujours avez vos données récupérées (dans ce cas, dans $this->id_email variable) pour indiquer si votre requête a renvoyé quoi que ce soit ou non. Lire la suite dans mon article sur le PDO .

3

Une autre approche à considérer:

Lorsque je construis un tableau 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. data, je retourne simplement "No data found ..." ou quelque chose de similaire. S'il y a des données, avancez, créez 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 absent. 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
lango

Grâce à l'aide de Marc B, voici ce qui a fonctionné pour moi (note: la suggestion de Marc RowCount () pourrait également fonctionner, mais je n'étais pas à l'aise avec le fait que cela ne fonctionne pas sur une base de données différente ou si quelque chose a changé dans la mienne ... également , sa suggestion de comptage sélectif (*) fonctionnerait également, mais, j’ai pensé que c’est parce que je finirais par obtenir les données si elles existaient de toute façon, alors j’ai fait comme ça)

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