requete SELECT et comper ligne avec PDO

Invité
Invité n'ayant pas de compte PHPfrance

10 févr. 2007, 01:32

salut,

en fait je n'utilise pas PDO partout dans mes pages PHP mais j'ai créé une classe qui regroupe une multitude de fonctions pour ensuite interroger la bd via PDO... ça me permet de laisser le code SQL dans une seule classe.

d'ou le $this->connexion qui fait référence à ma variable $connexion qui est dans cette classe.

:)

clair ou pas trop ?

:lol:

ViPHP
ViPHP | 1961 Messages

10 févr. 2007, 01:57

Bonsoir,

Après ce que tu expliques dans ton message précédent, je suis étonné de ta certitude de mettre en cause PDO.

Avant d'utiliser ce type d'imbrications, il est fort judicieux de commencer à tester en partant de l'étape la plus "basse".

Teste ta requête directement en PDO, si PDO ne te retourne rien, c'est là qu'il faut le mettre en cause (ce qui m'étonnerait, mais on ne sait jamais ...).
Voici un bout de code qui fonctionne
<?php
  $dsn = 'mysql:host=localhost; dbname=mydb';
  $user = 'user';
  $passWd = 'mypassword';
  try{
    $cnx = new PDO($dsn, $user, $passWd);
    // Activation du mode de gestion des erreurs par levée d'exception
    $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  }
  catch(PDOExecption $ePDO){
    die ('<h2>ERR de Connexion :</h2>' . $ePDO->getMessage());
  }
  
  try {
    $qryCount = "SELECT COUNT(*) nombre FROM ma_table";
    $stmt = $cnx->query($qryCount);
    $result = $stmt->fetchAll();
    echo 'Nombre d\'enregistrements = ' . $result[0]['nombre'] . '<br />';
  }
  catch (PDOException $ePDO) {
    die ('<h2>ERR_SQL :</h2>' . $qryCount . '<br />' . $ePDO->getMessage());
  }
?>
Adapte-le à tes besoins et tu seras tout de suite fixé si c'est PDO qui est en cause ou pas.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphanteau du PHP | 20 Messages

10 févr. 2007, 02:37

Personellement ça ne me semble pas bizard si il utilise l'objet :
private $connexion; // pointeur vers l'instance pdo

 __construct($connexion){
$this->connexion = $connexion;
}
Ensuite fetchColumn() retourne les données depuis une colonne d'un jeu de résultats, pas le nombre de ligne !

Tu devrais plus utiliser :
fetch()

Si tu souhaite savoir le nombre de colone dans ta requête:
$sql = 'select * from table where champs ='.$num;

Si tu souhaites savoir le nombre ligne et que tu as un champ unique ou primaire comme un ID privilégie le :
$sql = 'select count(id) from table where champs ='.$num;


Tu peux essayer rowCount() mais il ne marche pas avec toutes les DB


Je pense que tu as du t'inspirer de ça :
http://fr2.php.net/manual/fr/function.P ... wCount.php

pour ton script or cet exemple ne retroune pas concrétement le nombre de ligne.

Si avec un fetch() ou fetchObject() si tu veux call une methode; tu ne retrouve pas le nombre de ligne essay ce 'hack' :
function getNbrLigne($num) { 
$sql = 'select champs from table where champs ='.$num; 
$res = $this->connexion->execute($sql); 
echo 'Nb ligne: '. $res;
return $res; 
}
ou
function getNbrLigne($num) { 
$sql = 'select champs from table where champs ='.$num; 
$res = $this->connexion->query($sql); 
$nb_ligne=count($res->fecthAll());
echo 'Nb ligne: '.$nb_ligne;
return $nb_ligne; 
}

Enfin si cela venait à ne pas marcher vérifie que tu n'appel pas un execute() juste avant d'appeller ta fonction.

ViPHP
ViPHP | 1961 Messages

10 févr. 2007, 03:11

Re,
Ensuite fetchColumn() retourne les données depuis une colonne d'un jeu de résultats, pas le nombre de ligne !
Si sa requête est SELECT COUNT(*) FROM ... comme c'est le cas, l'utilisation de fetchColumn() est totalement justifié car le contenu de la colonne 0 de la ligne 0 est bien le résultat de la requête (nombre de rangs).
Si tu souhaite savoir le nombre de colone dans ta requête:
$sql = 'select * from table where champs ='.$num;
Ceci n'a aucun sens, cette requête va extraire tout le contenu de la ligne (rang) dont la colonne nommée "champs" aura la valeur de $num, mais jamais le nombre de colonnes dans cette ligne.
@gectou4
Que se passerait-il si on ne trouve pas de rang correspondant?
d'après toi ça signifie que j'ai 0 colonnes dans ma table ???
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Invité
Invité n'ayant pas de compte PHPfrance

10 févr. 2007, 14:34

Re messieurs !

alors voilà ou j'en suis...

mapage.php

cette page contient une fonction (Afficher) qui appelle à chaque fois (si besoin) la fonction (getNbrLigne) de ma classe(SQLCLasse) dédié au SQL / PDO. Avant d'appeller Afficher, je déclare une instance de ma classe SQLClasse puis j'apelle la fonction Afficher avec en paramètre l'instance créer.

jusque là aucun problème.

au 1er tour tout fonctionne parfaitement.
au second tour, je perd la connexion en fait et c'est pour ça que ma requete dans getNbrLigne ne fonctionnait pas !
j'ai par hasard ajouté au debut de ma fonction getNbrLigne
$this->__construct();

puisqu'en fait c'est le constructeur de ma classe SQLClasse qui crée la ligne : $this->connexion = new PDO(...)

et là ça marche !

mais je me suis connecté 13 000 fois :lol: alors que c'est pas necessaire !

j'ai afficher des messages partout, je ne passe jamais dans la méthode de deconnexion !

y a t-il une particularité dans PDO qui fait que je perde ma connexion à chaque tour ? ou existe-t-il une solution pour vérifier si je suis bien connecté ou déconnecté avant l'exécution d'une requête ?

Je vous remercie en tout cas pour toutes ces explications ! ça m'éclaire et me rassure quand à ma façon de penser avec PDO !

Eléphanteau du PHP | 20 Messages

10 févr. 2007, 16:18

Arf plantage à la soummission, bon reprenons...

Invité :
Dans ton utilisation de pdo j'ai pus noté que le faite d'appeller la methode execute() faisait perdre le connexion. Il faut donc appeller celle-ci en dernière.

Ajoloca:
Certe la requête à une telle finalité mais n'est pas très performante, que de brutalité!

Si tu souhaite le nombre de colone d'une table pourquoi sélectionne tu toutes leur ligne ? Il ne te faut qu'un rang si possible connue (WHERE 1)
Or initialement "invité" utilise déjà WHERE; donc il cible un élément concret. Si cette élément n'existe pas pourquoi diantre cherche t'il à savoir le nombre de colone de ce dernier ?

Pour connaitre le nombre de ligne; pourquoi sélectionné toutes les colonnes ? Une seul suffit!

Je suis moi aussi un partisant du bricolage tant que ça marche mais quite à renseigner autruis auttant m'efforcer à lui fournir une réponse de splus propres qui soit; comme quand on ensseigne la programation et qu'à aucun momment on n'esseigne le debug...
Combien de codeur laisse des divisions par 0 et cie sans même y prendre gars? Ce n'est pas leur faute ont ne leur à jamais dit qu'il fallait y prêter attention et pourtant...

Invité
Invité n'ayant pas de compte PHPfrance

10 févr. 2007, 17:23

gectou4 salut !

le hic c'est que je ne me sers plus de execute() maintenant mais uniquement de query()... :?

ViPHP
ViPHP | 1961 Messages

10 févr. 2007, 19:14

Re,
Si j'ai bien compris la finalité, c'est faire fonctionner sa requête et non pas une optimisation de celle ci.

Je ne cherche pas du tout à être brutal, du mois c'était du tout mon intention.

Mais pourquoi lu parler de récupérer les colonnes alors que son but est de récupérer le nombre de lignes.

Pourquoi dire qu'une méthode ne fais pas ce quelle est censé faire, bon passons et essayons de faire avancer le schimilblik.

As-tu testé le bout de code que je t'ai donné ?

Si oui, quel est le résultat ?
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Invité
Invité n'ayant pas de compte PHPfrance

10 févr. 2007, 20:29

Ajoloca :

salut !

mon script fonctionne lol depuis quelques post déjà !

c'est juste de l'optimisation maitnenant !