Page 1 sur 1

problème de quotes dans une chaine php contenant une chaine

Posté : 27 mars 2008, 22:19
par virgilio
Bonjour.
Voila mon problème, j'ai une variable php qui contient un paramètre à passer dans une fonction javascript.
la variable :
$req = "insert into personnel(personnelId, personnelNom, personnelTxt) values(0,\'' + $('personnelNom').value + '\',\'' + $('personnelTxt').value + '\')";
la fonction javascript (contenu dans une chaine php) :
echo "<input type=\"button\" value=\"valider\" 
    onClick=\"ChargerDIV('execute.php?req=".$req."'); />";
Le problème concerne les quotes. En affichant la variable req suite à l'execution de la fonction ChangerDIV (ajax) j'obtiens :

insert into personnel(personnelId,personnelNom,personnelTxt values(0,\'Virgilio\',\'dqsdqs qd qsd qsd qsd qs \')

Forcément cette requête SQL n'est pas valide...Comment dire au code PHP de dire au code javascript d'afficher une quote ?
Je sollicite donc l'aide d'une personne qui me permettrait de résoudre ce problème...
Merci beaucoup.

Posté : 27 mars 2008, 23:22
par Cyrano
Observe bien ce que tu as écrit :

Tu as débuté coté PHP l'encadrement de la chaîne avec des guillemets :
$req = "insert into ...
Il est donc maintenant logique d'insérer des variables dans une concaténation en utilisant aussi des guillemets, or tu es passé aux quotes simples en faisant un concaténation selon la syntaxe JavaScript :
$req = "... ...values(0,\'' + $('personnelNom')
Et logiquement, ça plante coté résultat.
Donc il faudrait continuer avec des guillemets et faire ta concaténation en PHP :
$req = "... ...values(0,'". $('personnelNom') ...etc...
Le truc pour ne jamais te planter :
Écris ta ligne de code avec des valeurs en dur, pas de variables :
$req = "... ...values(0,'test1', 'autre paramètre'...etc...);";
Là, on a une variable à laquelle on affecte une chaîne. D'abord pour une raison : il serait souhaitable d'avoir testé ton code JavaScript AVANT de l'intégrer.

Ensuite, il te reste à remplacer les valeurs en dur par des variables : là, tu regardes ce que tu as utilisé pour encadrer les valeurs assignés à tes variables ? Des guillemets ? Ok, alors on va faire les concaténation avec des guillemets aussi, mais ATTENTION : on ne remplace que les valeurs, on ne s'occupe pas des caractères spéciaux d'encadrement du JavaScript. Si la chaîne JavaScript contient des apostrophes (quotes simples), on en en PHP et on les traite comme faisant partie intégrante d'une chaîne de caractères.

On remplace donc juste les valeurs par (". $variable .") sans les parenthèses : et ça donne :
$req = "... ...values(0,'". $variable1 ."', '". $variable2 ."'...etc...);";
MAIS

Dans le bout de code montré, tu as mis $('personnelNom') : ça sent Ext à 100km ;) et on a donc affaire non pas à une variable PHP mais à une fonction JavaScript correspondant à document.getElementById() . well, mais en PHP, ça pose problème : il n'y a en fin de compte pas de variable PHP dans cette partie : alors on échappe juste le "$" et on échappe pas les quotes simples puisque la chaine est entre guillemets. Résultat final :
$req = "... ...values(0, \$('personnelNom'), ...etc...";

Posté : 28 mars 2008, 00:07
par zeus
Modération :
virgilio, le multipostage est interdit sur le forum.

Merci de prendre le temps de lire les règlements.

Posté : 28 mars 2008, 14:35
par virgilio
Modération :
virgilio, le multipostage est interdit sur le forum.

Merci de prendre le temps de lire les règlements.
oui je me doutais bien que le multipostage est interdit mais je ne savais pas vraiment dans quelle rubrique devait se situer ma réponse.
Merci Cyrano, je vais tester ce soir ta solution (et merci pour l'explication) et voir ce qu'il en est.

Posté : 29 mars 2008, 21:24
par virgilio
Cyrano, ok pour les nuances que tu as énoncés, cela me permet déjà de simplifier mon code.
Mais un problème subsiste (à moins que je n'ai pas compris ta réponse).
Le voici :
la finalité de cette portion de code est de créer une requête SQL et cela grâce à des valeurs saisies sur ma page HTML, d'où l'utilisation des $('toto').value pour les récupérer.
Ma requête SQL devrait donc ressembler à :

insert into personnel(personnelId,personnelNom,personnelTxt values(0,'qdqsdqs','qsdqsdqsd')

bon, je me suis rendu compte que je pouvais eviter d'appeler ma fonction javascript dans le echo du php.
J'ai donc :

Code : Tout sélectionner

<input type="button" value="valider" ChargerDIV('execute.php', '?req=insert into personnel(personnelId,personnelNom,personnelTxt) values(0,\'' + $('personnelNom').value + '\',\'' + $('personnelTxt').value + '\')');" />
J'appelle ma fonction avec en 2ème paramètre une chaine qui doit contenir des quotes, donc j'echappe...je pense que c'est ok.
Mais dans le fichier execute.php (qui est un appel ajax du fichier passé en paramètre, je récupere ma variable avec un
  $param = $_GET['param'];
et si j'affiche ce $param j'obients :
insert into personnel(personnelId,personnelNom,personnelTxt) values(0,\'fgdfg\',\'dfgdfgd\')
alors que je ne voudrais voir afficher que '
Mon erreur se situe peut être au moment où je récupère ma variabe au moment du $_GET ?

Posté : 29 mars 2008, 23:00
par Cyrano
Quel fouillis |*()

Tu fais tout en même temps, c'est le meilleur moyen de te vautrer en beauté :-k

Essaye de décomposer ton développement en étapes successives.
- 1 - La partie client : concevoir ta page HTML puis quand ça fonctionne, ajouter les fonctionnalités JavaScript;
- 2 - La partie serveur : Si tu as de l'AJAX à mettre en place, le script qui récupère la requête, les traite et retourne le résultat.

Ça, c'est le sommaire, mais il faut encore décomposer. D'abord coté client on s'occupe d'abord du HTML, ensuite, on s'occupe du JavaScript sans s'occuper du PHP. Et coté serveur c'est la même chose.

Et ce que j'en arrive à conclure, c'est que tu envoies une requête SQL via AJAX : tu joue avec le feu là, comme méthode de construction d'un bel outil pour se faire pirater, je dois reconnaître que c'est faire preuve d'une certaine imagination :shock:

Posté : 30 mars 2008, 17:42
par virgilio
oui c'est le fouillis, mais je te rassure tout mon site n'est pas comme ca. :wink:
Tout fonctionne jusqu'à présent, je voulais rajouter une fonctionnalité pour qu'un utilisateur puisse insérer des occurrences dans la bd. C'est là que j'ai dut rajouter cette partie de code tordue car je ne vois pas comment exécuter une requête SQL sur le click d'un bouton (sachant que je n'utilise pas de formulaire). C'est pour ca que j'utilisais AJAX pour appeler un execute.php qui ne faisait qu'exécuter la requête passée en paramètre...
il y a surement plus simple ?
:oops:

Posté : 30 mars 2008, 18:19
par Cyrano
Règle de sécurité numéro 1 : ne jamais envoyer directement une requête SQL à partir d'une page, et surtout pas avec la méthode GET.

Il faut que tu arrives à définir quels paramètres tu veux traiter en base de données et ce sont ces paramètres qu'il faut envoyer via AJAX à ton code serveur. Ce code serveur doit construire la requête en utilisant ces paramètres. Sinon, il suffit d'envoyer n'importe quelle requête avec un DELETE ou un UPDATE quelconque pour mettre la zone dans ta base de données.

Pars sur cette base dans ton raisonnement et tu vas pouvoir avancer. Commence par la requête SQL : isole ce qui est variable de ce qui est fixe. Une fois que tu auras déterminé quelles sont les valeurs variables à manipuler, construis le JavaScript qui va les envoyer via Ajax. Teste tout ça et quand ça fonctionnera bien, relie ton bouton de formulaire dessus.