Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/09/2006, 11h27   #1
Membre régulier
 
Inscription : avril 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 236
Points : 74
Points : 74
Par défaut [SQL] Sprintf ou concaténation pour créer les requêtes SQL?

Salut à tous,

en lisant des sources à droite à gauche j'ai vu qu'il existait deux façons de créer des requetes SQL avec des variables.
La concaténation:
Code :
$query="insert into <matable> values (".$valeur1.",".$valeur2.",...)";
Ou l'utilisation de sprintf:
Code :
$query= sprintf("insert into <matable> values (%s,%s,....)",$valeur1,$valeur2)
Quelle méthode conseilleriez-vous ?
Quels avantages/incovénients ?

Merci
EvilAngel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2006, 11h50   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Vous en oubliez une : l'interpolation :
Code :
1
2
 
$query="insert into <matable> values ('$valeur1','$valeur2',...)";
Je vous recommande la plus lisible, la plus facile à maintenir donc l'interpolation ou bien sprintf pour des requêtes qui sont longues/compliquées.


Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2006, 13h13   #3
Membre régulier
 
Inscription : avril 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 236
Points : 74
Points : 74
La fonction Sprintf me paraît moins lisible, mis c'est un avis personnel.

Dans le cas de l'interpolation, comment faire pour que les variables contenant des chaines de caracteres soient échappées avec des simple quote comme lre reclame MySQL.

Je m'explique, voici comment je fais en concatenation:
Code :
$query="INSERT INTO <matable> VALUES ('".$unechaine."','".$une_autre_chaine."'....);
EvilAngel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2006, 13h23   #4
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
dans le cas d'un gros INSERT, il peut devenir compliqué, avec l'une ou l'autre methode, de voir quel champ est affecté a quel valeur, car contrairement a l'UPDATE, ils ne ont pas a coté.

a moins de faire qqchose comme ca :
Code :
1
2
INSERT INTO table(	champ1,		champ2,		champ3,		champ4)
VALUES		(	'valeur1',	'valeur2',	'valeur3',	'valeur4')
Il serait peut etre mieux alors de passer par une génération automatique de la requete a partir d'un tableau associatif simple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$insert=array(
'champ1'=>'valeur1',
'champ2'=>'valeur2',
'champ3'=>'valeur3',
'champ4'=>'valeur4'
);
 
foreach($insert as $k=>$v) {
	if (!is_numeric($v)) {
		$insert[$k]="'".mysql_real_escape_string($v)."'";
	}
}
 
$sql="INSERT INTO table(".implode(',',array_keys($insert)).") VALUES(".implode(',',$insert).")";
Mon exemple répond aussi a ta question : mysql_real_escape_string pour echapper correctement toute les données
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2006, 17h01   #5
Membre régulier
 
Inscription : avril 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 236
Points : 74
Points : 74
Donc une nouvelle technique...
EvilAngel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2006, 17h08   #6
Membre émérite
 
Avatar de guitou12
 
Guillaume
Inscription : juillet 2006
Messages : 813
Détails du profil
Informations personnelles :
Nom : Guillaume
Âge : 29

Informations forums :
Inscription : juillet 2006
Messages : 813
Points : 905
Points : 905
Envoyer un message via MSN à guitou12
Pour ma part je conseille la concaténation.... mais ce n'était pas difficile à deviner
__________________
Le . est la base de toute bonne concaténation, marre de voir des
echo "Mavar1 = $toto et Mavar2 = $titi";
ou pire echo 'Mavar1 = ',$toto,' et Mavar2 = ',$titi;
pratiquez plutôt le echo 'Mavar1 = '.$toto.' et Mavar2 = '.$titi;
guitou12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h07.


 
 
 
 
Partenaires

Hébergement Web