updated - php pdo rowcount




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

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 .

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!


Même si c'est un vieux fil, j'ai pensé que je peserais comme j'ai dû faire face à ceci récemment.

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 pourriez l'avoir lors d'une boucle sur un ensemble de données.


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.


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






pdo