Une seule requete PDO avec 2 bases de donnees MySQL

ViPHP
ViPHP | 5462 Messages

25 juil. 2011, 18:01

je ne comprend pas pourquoi tu veux passer cela comme un paramètre, d’où viens ce choix ?
@+
j'ai entendu parler de bindValue protege les donnees entrees, c'est comme mysql_real_escape_string
non c'est pas pareil, équivalant de mysql_real_escape_string pour pdo c'est quote

Mammouth du PHP | 725 Messages

25 juil. 2011, 18:12

non c'est pas pareil, équivalant de mysql_real_escape_string pour pdo c'est quote
je peux echapper bindValue et utiliser quote directement??

si oui, voila une class traitant une connection BDD, est ce que c'est juste cette methode?
public function __construct($db_host='', $db_user='', $db_passwd='', $db_name='')
        {
                $this->db_host = $db_host;
                $this->db_user = $db_user;
                $this->db_passwd = $db_passwd;
                $this->db_name = $db_name;
                $this->errorMessage = $errorMessage;
                $this->charset = $charset;
                
                
                try
					{
						$connexion = new PDO('mysql:host='.$this->db_host.';dbname='.$this->db_name, $this->db_user, $this->db_passwd
						, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES $this->charset")); //SET NAMES utf8
					 	$connexion->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
					}
					 
					catch(Exception $e)
					{
					        echo $this->errorMessage .': '.$e->getMessage().'<br />';
					        echo 'N� : '.$e->getCode();
					}
                          $this->connexion = $connexion;
        }
        
        
		public function query($requete)
		{			
                    //echo $requete;
			$prep = $this->connexion->prepare($requete);
			$prep->execute();			
                        $this->prep = $prep;
		}
		
                public function quoted($value, $param)
                {
                    $this->value = $value;
                    $this->param = $param;
                    $this->connexion->quote($this->value, $this->param);
                }
utilisation:
// les valeurs pre-definies (host,...)              
$PDO = new PDOCon($host, $usr, $pass, $db);
$PDO->quoted($id, PDO::PARAM_INT);
$PDO->query("SELECT * FROM menu WHERE id='".$id."'");

ViPHP
ViPHP | 5462 Messages

25 juil. 2011, 18:19

je peux echapper bindValue et utiliser quote directement??
je te conseil plutôt d’apprendre ce qu'est vraiment une requete préparée
http://dev.mysql.com/doc/refman/5.0/fr/sqlps.html

Mammouth du PHP | 725 Messages

25 juil. 2011, 20:26

c'est ce que j'ai trouve sur le net sur les requetes preparees et executees :)
PDO : Interface d'accès aux BDD

ViPHP
ViPHP | 5462 Messages

26 juil. 2011, 09:38

c'est ce que j'ai trouve sur le net sur les requetes preparees et executees :)
PDO : Interface d'accès aux BDD
ça c'est juste l'interface, mais il faut bien comprend qu'est ce que ça fait derrière, de plus le tuto l'inclus pas la gestion des erreurs ( ce que je lui ai dit de changer y'a des années d'ailleurs ...)

Mammouth du PHP | 725 Messages

26 juil. 2011, 10:05

et la requete preparee / executee que j'ai fait, est ce qu'elle est correcte ou non?

ViPHP
ViPHP | 5462 Messages

26 juil. 2011, 10:25

et la requete preparee / executee que j'ai fait, est ce qu'elle est correcte ou non?
la requete en elle même oui, mais ensuite si tu voulais faire un requete préparée c'est complétement inutile puisque tu n'en fais pas une

Mammouth du PHP | 725 Messages

26 juil. 2011, 11:38

donc je dois suivre une requete comme celle-ci: http://php.net/manual/fr/pdo.prepare.php

ViPHP
ViPHP | 5462 Messages

26 juil. 2011, 11:42

donc je dois suivre une requete comme celle-ci: http://php.net/manual/fr/pdo.prepare.php
c'est quoi ton problème à la base ?

Mammouth du PHP | 725 Messages

26 juil. 2011, 12:10

a la base le probleme etait avec, bindValue, or bindValue n'a pas bien marche avec une multitude de variables (BDD.Table.ID), je me suis oriente vers quote avec une requete preperee / executee, j'ai fait une class pour cela, dans ma class j'ai voulu verifier si les 3 conditions existent afin de proteger mes requetes:

+ Requete preparee,
+ Requete executee,
+ quote.

merci

ViPHP
ViPHP | 5462 Messages

26 juil. 2011, 12:19

pourquoi refaire une classe pour PDO qui aide déjà beaucoup ?

quelle est l'interet de ca
$PDO = new PDOCon($host, $usr, $pass, $db);
$PDO->quoted($id, PDO::PARAM_INT);
$PDO->query("SELECT * FROM menu WHERE id='".$id."'");
contre ca
$PDO = new PDO("mysq:host=$host;dbname=$db", $usr, $pass);
$id = $PDO->quote($id, PDO::PARAM_INT);
$PDO->query("SELECT * FROM menu WHERE id='".$id."'");
???

si tu voulais faire une vrai requete préparé fait
$PDO = new PDO("mysq:host=$host;dbname=$db", $usr, $pass);
$stmt = $PDO->prepare("SELECT * FROM menu WHERE id=?");
$stmt->execute(array($id));
je vois pas ce que tu cherches en voulant faire absolument des binds

Mammouth du PHP | 725 Messages

26 juil. 2011, 13:48

$PDO = new PDOCon($host, $usr, $pass, $db);
j'ai deja definit mes variables dans la class:
$connexion = new PDO('mysql:host='.$this->host.';dbname='.$this->db, $this->user, $this->pass
						, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES $this->charset"));
$PDO->quoted($id, PDO::PARAM_INT);
j'ai mis une fonction pour proteger mes requetes par quote:
public function quoted($value, $param)
                {
                    $this->value = $value;
                    $this->param = $param;
                    $this->connexion->quote($this->value, $this->param);
                }

ViPHP
ViPHP | 5462 Messages

26 juil. 2011, 14:10

et ? pourquoi refaire ce qui est déjà fait, quoted est par exemple complétement inutile,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 juil. 2011, 14:17

je vois pas ce que tu cherches en voulant faire absolument des binds
ça c'est la question que je pose depuis quelque jours ;)

rimie, ce que Stealth35 indique c'est que ta classe perso c'est la même chose que la classe PDO, en d'autre terme elle n'apporte rien. si, par exemple, ta classe ajoutée une fonctionnalité pourquoi pas.

Par contre, tu peut très bien utiliser le mécanisme d'héritage des classes pour que ta classe perso hérite de PDO et donc "partage" ses fonctionnalités (par exemple tu a une classe de gestion des utilisateurs qui a besoin d'une connexion a un sgbd : class user extends PDO { }, et la tu peux faire comme tu veux).

Pour en revenir a ton problème, et comme l'indique Stealth35, les requêtes préparées sont présentées comme ultime avec PDO, mais on peux très bien le faire sans PDO, Stealth35 a d'ailleurs fait un article sur la chose. Le lien de la doc mysql qu'il ta filé t'indique d’ailleurs comment le le faire.

Pour ma part je pense, que dans la plus part des cas, en web on a pas besoin de requête préparée.
Pourquoi ? Parce que souvent il s'agit d'une requête, hors le but de la requête préparée et de pouvoir fournir plein de donnée, en utilisant qu'une fois la requete (par exemple tu veux mettre le contenu d'un fichier dans une table, tu créer une requête préparé insert et avec le jeux de bindX tu peux fournir 500000 jeux de données, avec une seul requête. Il me semble que c'est "mieux, plus rapide peut être" dans ce cas que 50000 insert into mais ça fait la même chose. )

Dans le cas de la requête que tu nous montre il n'y a pas de paramètre qui change (a priori) pas de valeur a passer en paramètre a quoi que ce soit. Bref la requête préparée, ici, n'a rien a faire !
Pour aller plus loin quote non plus puisque c'est toi qui donne la chaine, donc aucune inter action inconnue !

cela est utile, par exemple lorsque tu ajoute un utilisateur dans ta table, tu va utilise quote, ou une requête préparé (même si j'en vois pas l’intérêt tu peux) et donc la tu va demander a PDO de "protéger" tes valeurs, car il ne faut pas l'oublier tu peux très bien faire un exec('ma requête foireuse'); et la que se passe t il ? quote / bindvalue etc ne sont pas utilisées est ce que tout va bien se passer ?

si tu souhaite que l'on t'aide plus efficacement, le mieux c'est de nous dire ce que tu veux faire exactement (a priori selectionner des utilisateur dans des bases / tables différentes, ce qui ne pose pas de soucis a priori, en fonction de leur id. ça c'est une jointure et rien d'autre, tu ne passe pas de paramètre puisque tu a dit vouloir toute la liste).
Si je me trompe indique le clairement ;)
tu peux aussi nous montre plus de code afin que l'on puisse suivre ton cheminement :)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 171 Messages

26 juil. 2011, 14:19

j'ai entendu parler de bindValue protege les donnees entrees, c'est comme mysql_real_escape_string
je vois pas ce que tu cherches en voulant faire absolument des binds
et ? pourquoi refaire ce qui est déjà fait, quoted est par exemple complétement inutile,
Je m'avance peut être mais j'ai l'impression qu'il croit que faire un execute(array($var)); ne protège pas correctement les variables et que son script devient donc sensible aux injections.

bindValue sert à définir un type de variable précis qui doit être lié à la requête. Moi ça m'est surtout utile pour la clause LIMIT qui n'accepte qu'un nombre entier en paramètre.
En faisant un execute(array($var)) , tes données sont aussi échappes correctement, et ton script n'est donc pas sensible aux injections SQL. Mais par contre toutes les variables passés par cette méthode seront considérés comme des chaines de caractères.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.