Partage
  • Partager sur Facebook
  • Partager sur Twitter

RowCount en PDO avec SQL server

Sujet résolu
19 décembre 2018 à 9:21:32

Bonjour à tous !

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 ?

Merci beaucoup


-
Edité par cyril5789 19 décembre 2018 à 9:25:44

  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2018 à 9:29:13

Salut,

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

  • Partager sur Facebook
  • Partager sur Twitter
le bienfait n'est jamais perdu
19 décembre 2018 à 9:44:58

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;

et un résultat simple:

Table tile => 15900 lignes
Table toto => 0 lignes
Table troupe => 0 lignes
Table troupecomposition => 0 lignes



https://blog.developpez.com/elsuket/p8110/moteur-de-base-de-donnees-sql-server/trouver_le_nombre_de_lignes_de_toutes_le

-
Edité par christouphe 19 décembre 2018 à 9:48:34

  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2018 à 13:13:22

WillyKouassi a écrit:

Salut,

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;

et un résultat simple:

Table tile => 15900 lignes
Table toto => 0 lignes
Table troupe => 0 lignes
Table troupecomposition => 0 lignes



https://blog.developpez.com/elsuket/p8110/moteur-de-base-de-donnees-sql-server/trouver_le_nombre_de_lignes_de_toutes_le

-
Edité par christouphe il y a environ 3 heures

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...

  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2018 à 13:46:11

Le fetchAll + count ne te conviennent pas ?

PS: Mais généralement quand la BDD nous offre les bons outils mieux vaut les utiliser après c'est ton choix.. 

-
Edité par WillyKouassi 19 décembre 2018 à 13:47:57

  • Partager sur Facebook
  • Partager sur Twitter
le bienfait n'est jamais perdu
19 décembre 2018 à 15:08:00

WillyKouassi a écrit:

Le fetchAll + count ne te conviennent pas ?

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

  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2018 à 15:13:53

pourquoi vouloir faire un fetch après fetchAll ?

  • Partager sur Facebook
  • Partager sur Twitter
le bienfait n'est jamais perdu
20 décembre 2018 à 14:17:46

Tu as essayé le bon vieux MAX ? (en partant du principe que tu utilises des IDs)

$req->query("SELECT MAX(id_client) AS max FROM fact_client"); // tu fetch
print($idClient['max']);

-
Edité par xoxotf 20 décembre 2018 à 14:19:05

  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2018 à 14:26:59

le MAX(id) n'est pas forcément le nombre de ligne du ResultSet
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2018 à 14:41:27

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.

-
Edité par xoxotf 20 décembre 2018 à 14:44:11

  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2018 à 14:47:09

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.
  • Partager sur Facebook
  • Partager sur Twitter
le bienfait n'est jamais perdu
20 décembre 2018 à 21:45:46

WillyKouassi, ton commentaire m’a fait réagir 

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 !

Je te remercie pour ton implication !!

  • Partager sur Facebook
  • Partager sur Twitter
5 octobre 2021 à 0:21:08

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

  • Partager sur Facebook
  • Partager sur Twitter
5 octobre 2021 à 1:11:35

@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.

Voir https://www.php.net/manual/fr/pdostatement.rowcount.php

Déterrage

Citation des règles générales du forum :

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.

-
Edité par AbcAbc6 5 octobre 2021 à 1:13:39

  • Partager sur Facebook
  • Partager sur Twitter