[RESOLU] Quel if pour savoir si il y a une réponse ?

Eléphanteau du PHP | 18 Messages

04 mars 2024, 16:25

La réponse, je l’ai déjà pour une première approche :

Code : Tout sélectionner

$sth = $dbh->prepare(" SELECT cod, nom, chef_lieu, cree FROM depa WHERE cod = '$variable' OR nom = '$variable' OR chef_lieu = '$variable' "); $sth-> execute(); $resultat = $sth->fetchAll(PDO::FETCH_NUM); if (empty($resultat)) { echo 'Désolé...'; } else {
Ça marche, mais il me faut une présentation en tableau, non comme là par une ligne de texte, ce que j’ai pu faire grâce à l’aide reçue à mon sujet précédent intitulé « Présenter dans un tableau » :

Code : Tout sélectionner

$sql="SELECT cod, nom, chef_lieu, cree FROM depa WHERE cod = '$variable' OR nom = '$variable' OR chef_lieu = '$variable' OR cree = '$variable' "; if(!$connexion->query($sql)) echo "Pb d'accès aux données"; else { ?> <table class="centre" id="tableau"> …
J’ai bien un tableau, mais ce nouvel ‘if’ ne convient pas. Je tourne dans tous les sens sans parvenir au résultat obtenu dans ma première tentative : if pas de réponse, affiche « Désolé... », sinon…
Pourrais-je avoir de l’aide pour formuler correctement les choses ?
Merci d’avance.

Avatar du membre
Mammouth du PHP | 1564 Messages

04 mars 2024, 16:31

Voir avec foreach.

Eléphanteau du PHP | 18 Messages

04 mars 2024, 16:51

foreach est utilisé ensuite, pour la construction du tableau des réponses.
Peut-il servir avant, peut-on l'utiliser pour demander si il y a une réponse à la requête sql (si non afficher message, si oui afficher le tableau) ?

Avatar du membre
Mammouth du PHP | 1564 Messages

04 mars 2024, 17:51

Un tableau vide est retourné s'il y a zéro résultat.

Ceci devrait être correct :
if(count($tableau) == 0)
echo "0 résultat";

Avatar du membre
Mammouth du PHP | 1609 Messages

04 mars 2024, 18:18

Salut, éventuellement quelque chose dans le genre :
<?php
// ...
if(($statement = $connexion->query($sql)) === false) {
    echo 'Erreur de requête';
} elseif (count($rows = $statement->fetchAll()) === 0) {
    echo 'Aucun résultat';
} else {
?>
    <table class="centre" id="tableau">
    <!-- ... -->
        <?php foreach ($rows as $row): ?>
            <!-- ... -->
        <?php endforeach; ?>
    <!-- ... -->
    </table>
<?php
}
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 18 Messages

05 mars 2024, 11:19

C'est bon !
Si avec

Code : Tout sélectionner

if(count($tableau) == 0)
je tombe sur le même obstacle que dans mes précédentes tentatives : "Undefined variable",

Code : Tout sélectionner

elseif (count($rows = $statement->fetchAll()) === 0)
fonctionne immédiatement !
Merci beaucoup.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

05 mars 2024, 11:23

Code : Tout sélectionner

if(!$connexion->query($sql)) echo "Pb d'accès aux données"; else { ?> <table class="centre" id="tableau"> …
A noter qu'ici, il te manque des accolades qui sont obligatoires autour de ta ligne d'instruction echo si tu veux que ton else fonctionne.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1609 Messages

05 mars 2024, 14:56

Ca fonctionne car $statement a été défini lors du if précédent et que $statement->fetchAll() retourne un tableau de toutes les lignes du résultat.

Dans ton exemple la variable $tableau n'est pas définie comme le dit le message d'erreur "Undefined variable" (variable indéfinie) ! Tu ne peux pas utiliser une variable qui n'existe pas, comment veux-tu que le code interprète une variable qui n'existe pas ? y a pas de magie, il va pas deviner ce qu'elle serait sensée être. Ce n'est pas le nom de la variable qui définit sa valeur, c'est la valeur qu'on lui attribue lors de sa définition avec le signe = et peu importe son nom. Il faut donc forcément la définir au préalable en lui attribuant une valeur et si possible la bonne valeur en fonction de ce qu'on veut faire avec. Quand à son nom il est question de lisibilité. Des noms de variables bien choisis permettent dans l'idéale de comprendre ce que fait un code à sa simple lecture.

Le code de two3d n'était pas à copier sans réfléchir, il fallait le comprendre et définir $tableau en fonction de ce que tu souhaitais faire avec, en l’occurrence tester le nombre de lignes du résultat de la requête. Il fallait donc en faire un tableau avec toutes les lignes du résultat, ce qui peut s'obtenir avec la méthode fetchAll de la class PDOStatement, puisqu'ici tu utilises l'interface PDO.

Ton premier exemple fonctionnait car $resultat était au préalable défini avec $resultat = $sth->fetchAll(PDO::FETCH_NUM); et que la fonction empty retourne true quand on lui passe un tableau vide.
Développeur web depuis + de 20 ans