Une seule requete PDO avec 2 bases de donnees MySQL

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

26 juil. 2011, 14:40

en fait si tu lit le sujet, c'est surtout (comme on l'indique avant) pas adapté à la situation.

après oui, peut être un incompréhension de l'utilisation de la chose, mais la pour le coup, il faut que rimie nous explique ce qu'il a compris ou pas (ou pense avoir compris) que l'on puisse lui expliquer ou l'orienter vers le tuto adéquate (comme sheila ....).

ensuite pour résoudre son soucis, il nous faut savoir ce qu'il veux, s'il y a des conditions a utiliser etc etc pour voir si on se goure, car au final la, ça part dans tous les sens et on s'éloigne du sujet original :)


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

Mammouth du PHP | 725 Messages

26 juil. 2011, 14:42

bon enfin de compte, j'aimerais proteger mes donnees contre les injections SQL :)

ViPHP
ViPHP | 5462 Messages

26 juil. 2011, 14:48

bon enfin de compte, j'aimerais proteger mes donnees contre les injections SQL :)
si tu fait un regarde préparé pas besion, si tu fait un requete avec query, protège tes valeur avec quote

Mammouth du PHP | 725 Messages

27 juil. 2011, 11:51

donc si je resume:

+ requete preparee / executee
OU BIEN
+ requete avec quote

est ce que cette class fait l'affaire:
public function __construct($db_host='', $db_user='', $db_passwd='', $db_name='', $errorMessage='', $charset='')
        {
                $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;
		}
j'ai utilise une requete preparee / executee

ViPHP
ViPHP | 5462 Messages

27 juil. 2011, 11:56

la requete préparee est inutile puisque tu ne mets pas de paramètre, tu n'as toujours pas lu l'article sur les requete préparées

Mammouth du PHP | 725 Messages

27 juil. 2011, 12:25

la requete préparee est inutile puisque tu ne mets pas de paramètre, tu n'as toujours pas lu l'article sur les requete préparées
tu veux dire par les parametres comme 'LIMIT 1', le 1 est un parametre??

ViPHP
ViPHP | 5462 Messages

27 juil. 2011, 13:42

la requete préparee est inutile puisque tu ne mets pas de paramètre, tu n'as toujours pas lu l'article sur les requete préparées
tu veux dire par les parametres comme 'LIMIT 1', le 1 est un parametre??
non, les paramètres type ?, la ta requête revient à faire un query même pas protégé
Modifié en dernier par stealth35 le 28 juil. 2011, 04:49, modifié 1 fois.

devlop78
Invité n'ayant pas de compte PHPfrance

28 juil. 2011, 02:51

Peut-être devrais-tu ne pas les utiliser les requêtes préparées. Je les utilise très peu et ne les connais pas bien (heureusement, MySQL est tolérant). Je pense me consacrer quelques heures à bien lire la doc et à faire des tests pour éventuellement m'y convertir. Ma démarche est plus un aspect de séparation structure/données qui peut avoir des effets intéressants. Bref.

Pour revenir aux requêtes préparées, elles offrent l'avantage d'une compilation de la requête sans données, puis une execution avec données. Je ne ferai pas office de cours, donc je ne citerai que ces avantages :

- Vitesse d'execution améliorée pour plusieurs executions par rapport à des requêtes classiques
- "sécurité garantie" sans qu'on ait à s'en soucier

Les requêtes préparées demanderaient plus de temps à l'éxecution pour 1 seule execution. Ce n'est donc pas un critère de performances. Tu as certainement la même requête à faire qu'une seule fois dans un seul script, donc ce ne sera pas pour toi décisif. En terme de sécurité, j'ai un autre oeil par rapport à ça. Ce n'est pas mon genre d'installer un pseudo firewall applicatif en me disant que ça va me protéger. En production, ça peut être bien, mais si c'est pour apprendre, alors les requêtes normales offrent un meilleur aspect d'apprentissage pour les injections.

De plus, la requête préparées prend en paramètre (on peut faire son marché ^^) :
- les données sensibles (données de formulaires, etc)
- les données changeantes (données de formulaires ...)

Par exemple, je ne vois pas l'intérêt de mettre le nom de la table comme paramètre ... Ni un LIMIT x, sauf si éventuellement x change. Par contre, les données telles que celles venant d'un formulaire (ou les données provenant de $_SERVER, bref, tout ce qui n'est pas propre au script, certains préconisent même de se méfier des données venant de notre propre base de données ...) sont sensibles et changeantes, donc ont tout pour être un paramètre.

Mon explication est un peu mal foutue, j'en suis conscient, mais je ne suis ni prof, ni pro des requêtes préparées. Mais ce que je vois, c'est que tu fais des choses vraiment étranges avec. En plus, je remarque que tu fais des classes qui n'ont pas beaucoup de sens et qui font la même chose en moins bien que celles déjà existantes (et écrites en C, donc légèrement plus performances ^^).

Mammouth du PHP | 725 Messages

28 juil. 2011, 10:31

qu'est ce que vous me conseillez, une requete preparee / executee OU BIEN une requete avec quote?

ViPHP
ViPHP | 5462 Messages

28 juil. 2011, 17:55

qu'est ce que vous me conseillez, une requete preparee / executee OU BIEN une requete avec quote?
si tu ne comprend pas les requêtes préparées je te conseil de faire d'utilisé le couple query/quote, comme pour l'extension mysql_*

devlop78
Invité n'ayant pas de compte PHPfrance

29 juil. 2011, 02:38

Moi je te conseille de faire une à plusieurs petites appli avec du query/quote et quand tu seras à l'aise avec tu pourras lire des tutos sur des requêtes préparées. Moi je m'en passe très bien, je les utilise des fois, mais même l'aspect "totalement sécuritaire" est très mauvais (se dire : c'est lui qui s'occupe de tout, en sécurité, c'est généralement aller droit dans le mur ...).

Mammouth du PHP | 725 Messages

29 juil. 2011, 22:01

alors les plus securises est ce que les requetes preparees/executees ou bien une query/quote?

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

30 juil. 2011, 02:23

comme dit plus la sécurité aveugle c'est pas bon. même avec prépare ou quote tu peux faire n'importe quoi.

dans le qui te pré occupe au départ il n'est question de ni l'un ni l'autre !

les préparées servent a une automatisation d'une tache (par exemple insertion des 400000 lignes identique (même requete mais pas même valeur) dans une table.
Par exemple
insert into table value(champ1,champ2,champ3);
va devenir
insert into table value(?,?,?);

chaque ? représente un champ de la table, pour chaque couple de valeur une insertion sera faite. la requête préparée permet de juste indiquer les couples de valeurs plutôt que de renvoyer la requête.
avec PDO, c'est par exemple l'utilisation de execute(array(...)); dans une boucle.

si tu ne comprend pas le principe de requête préparée oublie c'est pas obligatoire.

après faut pas essayer de protéger totu et n'importe quoi.

S'il s'agit de valeurs provenant d'un formulaire il faut le faire, si c'est quelque chose que tu définis alors ce n'est pas la peine.

quote permet de "protéger" une chaine "manuellement", il faut savoir ce que tu protège et comment.

Par défaut cette fonction considéré que l'entrée est une chaine, le problème c'est qu'avec un nombre (entier ou flot) il ne faut pas mettre de ' autour (car c'est la définition d'une chaine et si tu veut mettre une chaine dans un entier ça marche pas :) ).
Mysql est sympa dans la valeur du champ il cast tous seul comme un grand. Par contre si tu l'utilise sur un limit, il pleure la requête est pas bonne.

Donc utiliser quote est une bonne solution si tu ne comprend pas le principe de requête préparée (j'me répète ?;) )

je ne vois pas pourquoi tu fait un fixation la dessus ;)

y a t il des chose que tu ne comprend pas dans ce que l'on dit ?

@+

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

Mammouth du PHP | 725 Messages

30 juil. 2011, 08:28

merci moogli, j'ai voulu juste savoir la difference entre les 2 (prepare et quote), bien sur qu'il faut savoir quoi securiser :)

Mammouth du PHP | 725 Messages

31 juil. 2011, 03:43

corrigez moi si je me trompe:
$Connexion = new PDO('ouverture de connexion');
$champs = $Connexion->quote($champs, PDO::PARAM_STR);
$Connexion->query("SELECT * FROM table WHERE champs = ".$champs);