2 votes

PHP : Comment faire fonctionner mon instruction IF avec PDO select ?

Je veux que ma sélection PDO ci-dessous fonctionne avec les deux instructions IF du bas ?
Pour le premier IF, je veux juste m'assurer qu'il n'y a pas d'erreur.
Dans le deuxième cas, je veux vérifier le nombre de lignes qu'il renvoie. Je sais que ce number of rows == 0 ne fonctionnera pas.
Existe-t-il un moyen de le faire ?

try {
    $conn = new PDO('mysql:host=localhost;dbname=zs', 'zs', 'rlkj08sfSsdf');
    $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo $e->getMessage();
    die();
}

$stmt = $conn->prepare("SELECT * FROM zip WHERE zip_code =:zip1");
$stmt->bindValue(':zip1', $_POST[zipcode], PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

if($rows = "") {
    echo "<p><strong>There was a database error attempting to retrieve your ZIP Code.</strong></p>\n";
}
if(number of rows == 0) {
    echo "<p><strong>No database match for provided ZIP Code.</strong> Please enter a new ZIP Code.</p>\n"; 
}

1voto

N.B. Points 4951

Ce qui vous intéresse, c'est de savoir s'il existe des enregistrements contenant une valeur particulière. Cela n'a aucun sens de sélectionner tout et compter les enregistrements en PHP. C'est un gaspillage de ressources. Imaginez ce qui se passe s'il y a un million d'enregistrements.

La solution que vous recherchez consiste simplement à demander à votre base de données de vous fournir le numéro d'identification de la personne à contacter. COUNT de lignes contenant une valeur particulière. Votre code devrait être assez simple :

$stmt = $conn->prepare("SELECT COUNT(*) AS num_rows FROM zip WHERE zip_code = :zip");
$stmt->bindValue(':zip', $_POST['zipcode'], PDO::PARAM_INT);

$stmt->execute();

$count = (int)$stmt->fetchColumn();

if($count)
{
    echo "Success";
}
else
{
    echo "Bummer";
}

Notes :

  • en cas de succès, la requête ci-dessus renverra toujours 1 ligne avec 1 colonne, nommée num_rows qui sera 0 si aucun enregistrement ne correspond ou un nombre entier supérieur à 0 s'il existe des enregistrements. Si vous utilisez le pilote natif de MySQL avec PHP, PHP représentera correctement cette valeur en tant qu'entier en interne. J'ai délibérément ajouté le typecasting, vous pouvez l'enlever (l'option (int) ) si vous avez MySQL ND.
  • si quelque chose ne va pas pendant l'exécution de la requête, une exception sera levée. L'extrait ne couvre pas ce point. Vous avez correctement configuré PDO en mode exception, et avec l'utilisation de bindValue au lieu de bindParam Cela implique que vous avez bien fait vos recherches et que vous utilisez PDO correctement, ce qui signifie que la gestion des erreurs devrait être facilement implémentée dans ce cas particulier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X