PDO et requete variable

PDO et requete variable - PHP - Programmation

Marsh Posté le 25-09-2012 à 15:05:36    

Hello,
 
Je suis en train de mettre au propre mes connexions, je remplace donc mes "mysql_ " par des $req->execute
 
j'ai 2 questions :
 

  • Pour les query ou le nombre de condition vaire j'ai trouvé cela :


Code :
  1. public function matchCriteria($field1=null,$field2=null,$field3=null) {
  2.         $db=DB::conn();
  3.         $sql=array();
  4.         $paramArray=array();
  5.         if(!empty($field1)) {
  6.             $sql[]='field1=?';
  7.             $paramArray[]=$field1;
  8.         }
  9.         if(!empty($field2)) {
  10.             $sql[]='field2=?';
  11.             $paramArray[]=$field2;
  12.         }
  13.         if(!empty($field3)) {
  14.             $sql[]='field3=?';
  15.             $paramArray[]=$field3;
  16.         }
  17.         $rs=$db->prepare('SELECT * FROM mytable'.(count($paramArray)>0 ? ' WHERE '.join(' AND ',$sql) : ''));
  18.         $result=$rs->execute($paramArray);
  19.         if($result) {
  20.             return $rs;
  21.         }
  22.         return false;
  23.     }


 
Sauf que tu définis pas le type et c'est chiant pour les "limite" et "offset"
 
Comment on peut adapter l'exemple pour rajouter les types ?
 
 

  • Avec mysql_ j'utilise un mysql_close($iddb) et alors qu'il pour PDO j'ai un $req->closeCursor();  


J'ai pas l'impression que cela ferme la connexion mais juste le cursor contenant mes données?


Message édité par KLeMiX le 25-09-2012 à 15:07:06

---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 25-09-2012 à 15:05:36   

Reply

Marsh Posté le 25-09-2012 à 15:14:05    

Citation :

public function matchCriteria($field1=null,$field2=null,$field3=null) {
        $db=DB::conn();
        $sql=array();
        $paramArray=array();
        if(!empty($field1)) {
            $sql[]='field1=?';
           $paramArray[$field1]='PDO::PARAM_INT';
        }
        if(!empty($field2)) {
            $sql[]='field2=?';
           $paramArray[$field2]=PDO::PARAM_STR;
        }
        if(!empty($field3)) {
            $sql[]='field3=?';
            $paramArray[$field3]=PDO::PARAM_STR;
        }
        $rs=$db->prepare('SELECT * FROM mytable'.(count($paramArray)>0 ? ' WHERE '.join(' AND ',$sql) : ''));
       foreach($paramArray as $key=>$val) $rs->bindParam($$key, $key, $val);
        $result=$rs->execute();

        if($result) {
            return $rs;
        }
        return false;
    }


 
Je vais tester cela  :)  
 
Bon bas en attandant si vous avez la réponse a la 2 questions


Message édité par KLeMiX le 25-09-2012 à 15:15:12

---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 25-09-2012 à 15:28:56    

Ca peut pas marcher :o
 
$$key n'est pas egale a fieldx


---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 25-09-2012 à 15:45:10    

$paramArray[]=array('newsid',$newsid,PDO::PARAM_INT);
 
et  
 
foreach($paramArray as $key=>$val)  
 {
  $req->bindValue($val[0], $val[1], $val[2]);
 }
 $req->execute();
 
et ca marche
 
Merci :o


---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 26-09-2012 à 11:09:04    

Comme j'ai répondu tout seul comme un grand a ma première question vous pouvez répondre à la 2 eme ?
 
 
Avec mysql_ j'utilise un mysql_close($iddb) et alors qu'il pour PDO j'ai un $req->closeCursor();  
 
J'ai pas l'impression que cela ferme la connexion mais juste le cursor contenant mes données?


---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 26-09-2012 à 18:19:38    

C'est exact.
 
Pour supprimer la connexion, il faut faire  
 

Code :
  1. unset($myPdoObject);


 
Ou
 

Code :
  1. $myPdoObject = null;


 
Et pourquoi pas appeler explicitement le garbage collector si tu es en 5.3+
 
 
 
 
Par ailleurs, le bind() est EVIL : il ne gère pas les types flottant.
 
Il vaut mieux utiliser le prepare() et execute(), qui sont de surcroit plus simples à utiliser :
 

Code :
  1. // Toujours bien resetter les paramètres pour éviter les problèmes
  2. $results = array();
  3. $params  = array();
  4. $sqlCommand = 'SELECT email FROM woman WHERE age BETWEEN ? AND ?';
  5. $params[] = 18;
  6. $params[] = 19;
  7. $statement = $myPdoObject->prepare($sqlCommand);
  8. if (!$params) {
  9.   $statement->execute();
  10. }
  11. else {
  12.   $statement->execute($params);
  13. }
  14. if ($statement->columnCount()) {
  15.   $results = $statement->fetchAll();
  16. }
  17. $statement->closeCursor();
  18. print_r($results);

Message cité 1 fois
Message édité par CyberDenix le 26-09-2012 à 18:33:21

---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 26-09-2012 à 23:29:47    

CyberDenix a écrit :

C'est exact.
 
Pour supprimer la connexion, il faut faire  
 

Code :
  1. unset($myPdoObject);


 
Ou
 

Code :
  1. $myPdoObject = null;


 
Et pourquoi pas appeler explicitement le garbage collector si tu es en 5.3+
 
 
 
 
Par ailleurs, le bind() est EVIL : il ne gère pas les types flottant.
 
Il vaut mieux utiliser le prepare() et execute(), qui sont de surcroit plus simples à utiliser :
 

Code :
  1. // Toujours bien resetter les paramètres pour éviter les problèmes
  2. $results = array();
  3. $params  = array();
  4. $sqlCommand = 'SELECT email FROM woman WHERE age BETWEEN ? AND ?';
  5. $params[] = 18;
  6. $params[] = 19;
  7. $statement = $myPdoObject->prepare($sqlCommand);
  8. if (!$params) {
  9.   $statement->execute();
  10. }
  11. else {
  12.   $statement->execute($params);
  13. }
  14. if ($statement->columnCount()) {
  15.   $results = $statement->fetchAll();
  16. }
  17. $statement->closeCursor();
  18. print_r($results);



 
 
 
pour les paramètres du order ca marche pas et puis si tu as un nombre de paramètre qui varie non plus
 
 
sinon c'est quoi le garbage collector


---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 26-09-2012 à 23:35:49    

exemple :
 

Code :
  1. $paramArray=array();
  2. $iddb=connectionPDO(); 
  3. $sql = 'SELECT toto,tata,titi';
  4. $sql =$sql. ' FROM table';
  5. $sql =$sql. ' WHERE toto = titi;
  6. If(!empty($newsid) and $newsid<>-1)
  7. {
  8. $sql =$sql. ' AND `COD_NEWS`= :newsid';
  9. $paramArray[]=array('newsid',$newsid,PDO::PARAM_INT);
  10. }
  11. $sql =$sql. '  ORDER BY COD_NEWS DESC';
  12. If(empty($newsid) or $newsid==-1)
  13. {
  14. $sql =$sql. ' LIMIT :limit OFFSET :debut'; 
  15. $paramArray[]=array('limit',$limit,PDO::PARAM_INT);
  16. $paramArray[]=array('debut',$debut,PDO::PARAM_INT);
  17. }
  18. // on envoie la requête
  19. $i=0;
  20. $req = $iddb->prepare($sql);
  21. foreach($paramArray as $key=>$val)
  22. {
  23.  $req->bindValue($val[0], $val[1], $val[2]);
  24. }
  25. $req->execute();


Message édité par KLeMiX le 26-09-2012 à 23:37:09

---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 02-10-2012 à 23:31:47    

KLeMiX a écrit :


pour les paramètres du order ca marche pas  


 
C'est tout à fait exact (et regrettable).
 
 

KLeMiX a écrit :


et puis si tu as un nombre de paramètre qui varie non plus


 
Et avec bindParam, ça fonctionne ?
Il me faudrait un exemple pour comprendre ce point-ci.
 
 

KLeMiX a écrit :


sinon c'est quoi le garbage collector


 
 
Littéralement le "collecteur de déchet"
 
http://php.net/manual/fr/function. [...] cycles.php


Message édité par CyberDenix le 02-10-2012 à 23:35:24

---------------
Directeur Technique (CTO)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed