J'ai installé une application web sur un seveur WINDOWS, connecté à un Serveur SQL SERVER (donc pas de linux, pas de MySQL)
En PDO, j'ai une simple requête :
$retour = $link->prepare('SELECT * FROM table');
$retour->execute();
J'aurai besoin de récupérer le nombre d'éléments que me retourne cette requête, donc pour ça j’effectue
$nombre_lignes = $retour->rowCount();
Si ma requête me retourne aucun résultat, $nombre_ligne vaut 0, si j'ai un nombre de résultat positif, $nombre_lignes vaudra "-1" au lieu du nombre réelle.
Tant que je n'ai pas fait
while($row = $retour->fetch())
{
...
}
, mon $nombre_ligne reste coincé à -1. Cela est du - je pense - au fait que ->execute() ne récupère pas l'ensemble de mes lignes comme il le fait avec MySQL (je suppose)
Ma question est :
Hors mis faire un SELECT COUNT(*) (qui ne m'arrange pas du tout), existe t il un moyen de récupérer le nombre de lignes affectées par ma requête ? Ou bien un paramètre à passer à PDO pour lui demander que "execute()" soit capable de précharger toutes mes lignes et donc me retourner le nombre de ligne quand je lui demande ?
En même temps cette affaire de rowCount la doc en parle. Pourquoi un SELECT COUNT(*) ne t'arrange pas?
Sinon initialiser un compteur en dehors de la boucle et l'incrémenter là-dedans (si tu veux utiliser la variable après la récupération), utiliser un fetchAll pour récupérer toutes tes données + la fonction count de PHP
- Edité par WillyKouassi 19 décembre 2018 à 9:30:24
En même temps cette affaire de rowCount la doc en parle. Pourquoi un SELECT COUNT(*) ne t'arrange pas?
Sinon initialiser un compteur en dehors de la boucle et l'incrémenter là-dedans (si tu veux utiliser la variable après la récupération), utiliser un fetchAll pour récupérer toutes tes données + la fonction count de PHP
Par qu'en réalité j'utilise une classe intermédiaire qui traite tout ça. Je lui passe la requête en paramètre dans la méthode "Query()" m'ai j'ai d'autre méthode private qui font certains travaux de vérifications..
Dont un compteur de rows pour vérifier que la requête retourne des choses etc... Je ne veux pas passer deux requetes à cette classe (la requete initiale + la même avec la version Count(*)...)
christouphe a écrit:
En même temps 5 secondes de recherches + 5 minutes de dév d'un test basique et tu auras tout ce que tu veux, mais bon ...
<?php
//A adapter pour SQL Server
$requete = "show table status";
//la connexion m'est spécifique
$bdd = new PDO("mysql:host=localhost;dbname=<TA_BASE>", '<USER>', '<PASS>', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$stmt = $bdd->query($requete);
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "<br/>Table ".$data['Name']." => ".$data['Rows']." lignes";
}
exit;
Rien à voir, c'est pas du tout ça que je veux faire... je veux connaître le nombre de ligne que me retourne ma requête, pas connaitre le nombre d'élément dans ma table...
PS: Mais généralement quand la BDD nous offre les bons outils mieux vaut les utiliser après c'est ton choix..
Yes, le seul soucis c'est que si je fais un fetchAll, après je ne peux plus faire mon fetch tout cours, car je ne peux pas "fetcher" 2 fois avec SQL.
Oui j'utilise les bons outils, je rajouter juste une classe intermédiaire qui gère pas mal d'automatismes et de sécurité pour me facilité la vie au quotidien dans le dev
Evidemment là je bloque sur un point qui ne me posait jamais de soucis avec MySQL
Oui, MAX retourne la plus grosse valeur de la colonne, donc s'il utilise des IDs dans un ordre croissant, c'est une méthode simple pour compter le nombre de lignes. J'en fais usage parce que je suis sûre de la façon dont je gère ma table, donc evidemment il faut que la request soit des plus basiques.
Il a dit qu'il ne veut pas de requête supplémentaire, les lignes ça se supprime, donc utiliser un MAX pour compter alors qu'on a déjà COUNT n'est pas une bonne idée.
pourquoi faire un fetch après un fetchall ?? C’est complément idiot ! Hehe
du coup j‘ai j’ai trouvé ma solution :
Apres l’ «execute()» je fais un fetchAll(), je stock dans une variable (un array forcément du coup), ensuite pour compter : rien de plus simple avec un simple count(), et pour parcourir les resultats, exit le fetch, mais un bon vieux foreach que je peux appeler 20 fois si je veux résoud tous mes problèmes !
mais pourquoi la méthode rowcount ne marche tout simplement pas comme avec mysql? c'était plus simple comme ça on pouvait facilement récupérer le nombre des lignes et afficher les données par après.
- Edité par JeremieKamuina 5 octobre 2021 à 0:22:54
@JeremieKamuina Bonsoir, merci de ne pas déterrer d'ancien sujet résolu. Créer le votre dans le respect des règles du forum, à savoir qu'un message commence par des formules de politesses (un bonjour ou des saltations à la communauté et se termine par des remerciements par avances pour les futures réponses), une description de votre problématique et le code que vous avez écrit inséré sur le forum à l'aide du bouton code </> de la barre d'outil.
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Je ferme ce sujet. En cas de désaccord, me contacter par MP.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL