requete SELECT et comper ligne avec PDO

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : requete SELECT et comper ligne avec PDO

par Invité » 10 févr. 2007, 20:29

Ajoloca :

salut !

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

c'est juste de l'optimisation maitnenant !

par Ajoloca » 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 ?

par Invité » 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()... :?

par gectou4 » 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...

par Invité » 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 !

par Ajoloca » 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 ???

par gectou4 » 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.

par Ajoloca » 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.

par Invité » 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:

par Ajoloca » 09 févr. 2007, 23:08

Bonsoir,

Je suis très étonné de la fçon dont tu utilises PDO.

Ceci me semble bizarre
$res = $this->connexion->query($sql); 
et en particulier le $this.

Peu-tu nous montrer comment tu crées ton objet et l'utilisation de la méthode query() ?

par Truc » 09 févr. 2007, 19:23

salut,
$res = $this->connexion->query($sql); 
var_dump($res);
ceci renvoi : bool(false)
Donc ce n'est pas un objet mais un booléen !
et tu ne peut donc pas appliquer une méthode dessus :
$res->fetchColumn();

par Invité » 09 févr. 2007, 19:19

gectou4 :

je veux récupérer ce que me renvoie ma requête (select count(*)...)

:)

par gectou4 » 09 févr. 2007, 13:54

attender a la base c'est récupérer le nombre de requête de pdo ?

donc ou tu as un $result = $db->query("..") qui te renvoie un tableau et en se cas tu fait un count dessus ou tu as fait un update/delete/insert et en ce cas tu as utiliser $req = $pdo->exec("...") et en ce cas $req est le nombre de ligne traiées!

par Invité » 09 févr. 2007, 12:25

salut,
$res = $this->connexion->query($sql); 
var_dump($res);
ceci renvoi : bool(false)

par Truc » 09 févr. 2007, 03:07

Certes, le lien n'était donné que pour info :wink:

Par contre :
Que retourne query($sql) ?


affiche le contenu (type) de $res :
var_dump($res);