10
votes

PDO Obtenir des données de la base de données

J'ai commencé à utiliser PDO récemment, plus tôt j'utilisais juste mysql. Maintenant, j'essaie d'obtenir toutes les données de la base de données.

$getUsers = $DBH->prepare("SELECT * FROM users ORDER BY id ASC");
$getUsers->fetchAll();
if(count($getUsers) > 0){
    while($user = $getUsers->fetch()){
        echo $user['username']."<br/>";
    }
}else{
    error('No users.');
}


1 commentaires

Qu'est-ce que erreur (...) ? Assurez-vous que les déclarations d'erreur sont sur ....


3 Réponses :


22
votes

Le PDO code> méthode fetchall () Code> renvoie un tableau / un ensemble de résultats, que vous devez attribuer à une variable, puis utiliser / itérer via cette variable: xxx pré>

update strong> (manquant exécuté () code>)
En outre, il semble que vous n'appeliez pas le exécuter () code> méthode qui doit se produire après em> vous préparerez la déclaration mais avant em> vous récupérez les données: p>

$getUsers = $DBH->prepare("SELECT * FROM users ORDER BY id ASC");
$getUsers->execute();
$users = $getUsers->fetchAll();
...


3 commentaires

@ user1791971 Si vous faites var_dump ($ utilisateurs); , après le fetchall () , qu'est-ce qu'il affiche?


Avez-vous une erreur de contrôle et d'affichage des erreurs: ajoutez error_rporting (e_all); INI_SET ('"DISPLAY_ERRORS', '1'); au sommet du script


@ user1791971 ah, j'ai relu votre message; Vous manquez également un appel à exécuté () . J'ai mis à jour ma réponse avec les informations pertinentes.



6
votes

Ce code ci-dessous fera ce que vous demandez:

$sql = $dbh->prepare("SELECT * FROM users ORDER BY id ASC");
$sql->execute();
while ($result = $sql->fetch(PDO::FETCH_ASSOC)) {
    echo $result['username']."<br/>";
}


0 commentaires

3
votes

Votre code manque un appel à exécuté () code> après Préparer () Code> a >. Une fois que votre déclaration préparée est exécutée, vous pouvez obtenir la gamme d'enregistrements à l'aide de fetchall () code> . xxx pré>

Toutefois, dans votre exemple, vous ne transmettez aucune donnée variable à la requête et que vous ne l'exécutez qu'une seule fois, ce qui défait un but d'une déclaration préparée . Vous devez utiliser des instructions préparées si vous devez avoir des variables dans votre SQL, par exemple: p> xxx pré>

s'il n'y a pas de variables, vous pouvez simplement utiliser Query () code> méthode. P>

$getUsers = $DBH->prepare('SELECT * FROM users WHERE username LIKE ? ORDER BY id ASC');
$getUsers->execute([
    '%' . $_GET['search'] . '%'     // search for username with wildcards
]);

foreach ($getUsers as $user) {
    echo $user['username']."<br/>";
}


4 commentaires

Je ne pense pas qu'aucun utilisateur n'indique que l'erreur fatale.


Je pense que fetchall () ne doit être utilisé que si vous incorporiez l'un des systèmes intelligents / magiques Extraîner des modes ou si le traitement de l'ensemble de résultats est en cours de réalisation dans une autre couche de l'application. En d'autres termes, si vous allez immédiatement itérer le résultat défini comme un jeu de résultats structuré "standard", n'utilisez pas fetchall () .


@mickmackusa je suis en désaccord. Je comprends votre point, et je le fais dans mon propre code, mais je crois que dans mes réponses, je devrais s'efforcer de montrer la séparation de la logique d'application et de présentation. Les données doivent être récupérées dans les structures PHP et l'instruction PDO ne doit pas être exposée à la logique de présentation. Peut-être que je n'ai pas précisé cette distinction dans cette réponse en raison de la brièveté, mais c'était mon objectif. La boucle foreach est utilisée pour afficher les données et ne pas traiter les résultatsset.


Si vous allez gérer instantanément des lignes spécifiques, je ne recommande pas Fetchall (). Cela crée une pile uniquement pour le chercher un par un. J'aime mieux le dernier extrait.