Page 1 sur 2

Insérer dans une base de donnée une valeur ayant une simple

Posté : 26 déc. 2007, 22:16
par zaknaou
Rebonjour

Savez-vous comment je peut faire pour insérer une valeur d'un champs dans une base de donnée qui contien une simple côte SANS la supprimer et sans ajouter un antislash.

J'ai :
$valeur = "l'union des deux lions";
et je veut faire un inser into :
mysql_query("INSERT INTO inscription (valeur) VALUES ('$valeur') ");
si $valeur contient '

j'ai
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'union des deux lions at line 1
ATTENTION vu les codes que j'utilise précédament et qui ne sont pas modifiable on ne peut pas mettre d'antislash !!

Merci

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Re: Insérer dans une base de donnée une valeur ayant une sim

Posté : 26 déc. 2007, 23:35
par Truc
ATTENTION vu les codes que j'utilise précédament et qui ne sont pas modifiable on ne peut pas mettre d'antislash !!
Pourquoi ?

Posté : 26 déc. 2007, 23:49
par Berzemus
oui, c'est bizzare pasque c'est justement fait pour..

Et du côté htmlentities ? mais en même temps, il faudra bien adapter ta chaine..

Posté : 26 déc. 2007, 23:55
par zaknaou
Oui je m'attendais à un "pourquoi"...

Et bien parceque je dans cette même page qui est celle qui succède un formulaire d'inscription je détecte les \ et si dans le champs $valeur y a un \ alors on génére une erreur.

Donc \' contient un \
Et \\' contient un \
Et \\\' contient un \

Donc erreur

Peut-on pas faire un insert into avec des " ?

Comment adapte-ton une chaine avec htmlentities ??

Posté : 27 déc. 2007, 00:22
par zeus
Oui je m'attendais à un "pourquoi"...
Et pourquoi ne pas l'avoir expliqué avant alors ? On aurait gagné 2h ...

Sinon, pour ton pb, il te suffit de protéger les chaines APRES avoir vérifié qu'elles ne contiennent pas de slash

Posté : 27 déc. 2007, 00:42
par zaknaou
Désoler pour les 2h de perdu de toute façon je suis le seul perdant dans l'histoire, donc pas besoin de s'énerver.

Bon je me suis promener sur le web et quand je fait le lien portéger une chaine est-ce bien ce qui est monté dans ce tutoriel ?

http://g-rossolini.developpez.com/tutor ... age=page_4

Posté : 27 déc. 2007, 00:54
par zeus
Si, j'estime avoir le droit de m'énerver ....

_ce n'est pas tes débuts sur phpfrance et tu n'as toujours pas compris qu'il fallait un maximum de détail quand on te le rappelle gentiment
_tu n'as visiblement pas cherché 10mn à comprendre le fonctionnement d'un code parce que la solution que je te donne, c'est l'enfance de la logique
_je suis modo, donc quand je reproche quelque chose, c'est pas pour m'amuser

Sinon, pour en revenir à ton problème, je te conseille mysql_real_escape_string() si tu utilises MySQL

Posté : 27 déc. 2007, 01:40
par zaknaou
Merci

donc j'obtient :
$query = sprintf("INSERT INTO inscription (`valeur`) VALUES ('%s')");
 mysql_real_escape_string($valeur);
Je doute que ce soit correct je me suis référer à :

http://fr3.php.net/manual/fr/function.m ... string.php

Mais j'ai du mal avec le code :
<?php

if (isset($_POST['product_name']) && isset($_POST['product_description']) && isset($_POST['user_id'])) {
    // Connect

    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');

    if(!is_resource($link)) {

        echo "Échec de la connexion au serveur\n";
        // ... historisation de l'erreur

    } else {

        // Annule les effets magic_quotes_gpc/magic_quotes_sybase sur ces variables si ON.

        if(get_magic_quotes_gpc()) {
            if(ini_get('magic_quotes_sybase')) {
                $product_name        = str_replace("''", "'", $_POST['product_name']);
                $product_description = str_replace("''", "'", $_POST['product_description']);
            } else {
                $product_name        = stripslashes($_POST['product_name']);
                $product_description = stripslashes($_POST['product_description']);
            }
        } else {
            $product_name        = $_POST['product_name'];
            $product_description = $_POST['product_description'];
        }

        // Faire une requête sécurisée
        $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)",
                    mysql_real_escape_string($product_name, $link),
                    mysql_real_escape_string($product_description, $link),
                    $_POST['user_id']);

        mysql_query($query, $link);

        if (mysql_affected_rows($link) > 0) {
            echo "Produit inséré\n";
        }
    }
} else {
    echo "Remplissez le formulaire proprement\n";
}
?>
Proposé dans le site en tant que démo

Posté : 27 déc. 2007, 02:26
par Ryle
Je doute que ce soit correct je me suis référer à (...)
C'est de la documentation dont tu doutes ou bien de ce que tu en as fait ?

Aller, je vais te rassurer, la documentation est bonne (bon personnellement je ne supporte pas qu'on utilise des printf pour faire des requêtes, d'autant que dans 90% des cas les gens ne savent pas s'en servir, mais ça n'engage que moi, et le fait est que bien utilisé, ça fonctionne).

Et concernant ton code, il y a une façon simple de dissiper tes doutes et de vérifier s'il fonctionne : c'est de l'essayer. Et une fois que tu l'auras essayé, constaté qu'il ne fonctionne pas et lu les messages d'erreur t'indiquant ce qui ne va pas, tu pourras ajouter un point-virgule et équilibrer tes parenthèses....

Et ainsi tu n'auras plus de doute.

Posté : 27 déc. 2007, 13:22
par zaknaou
Bon j'aurai du aussi vous donner ça :

Ma requete est en faite :
mysql_query("INSERT INTO inscription (identifiant, mot_de_passe, pseudo_forum, pseudo_chat,
pseudo_blog, pseudo_article, question_secrete, reponse_secrete, date_heure_inscription, civilite,
nom, prenom, jour, mois, annee, numero_rue_1, rue_1, code_postal_1, ville_1, pays_1, batiment_1,
 etage_1, porte_1, numero_rue_2, rue_2, code_postal_2, ville_2, pays_2, batiment_2, etage_2, 
porte_2, numero_rue_3, rue_3, code_postal_3, ville_3, pays_3, batiment_3, etage_3, porte_3,
telephone_fixe_1, telephone_fixe_2, telephone_fixe_3, telephone_portable_1,
 telephone_portable_2, telephone_portable_3, email_1, email_2, email_3, site_1, site_2, site_3, 
site_4, site_5, loisir, langue, langage) VALUES ('$identifiant', '$mot_de_passe', '$pseudo_forum', 
'$pseudo_chat', '$pseudo_blog', '$pseudo_article', '$question_secrete', '$reponse_secrete',
 '$date_heure_inscription', '$civilite', '$nom', '$prenom', '$jour', '$mois', '$annee', '$numero_rue_1', 
'$rue_1', '$code_postal_1', '$ville_1', '$pays_1', '$batiment_1', '$etage_1', '$porte_1', 
'$numero_rue_2', '$rue_2', '$code_postal_2', '$ville_2', '$pays_2', '$batiment_2', '$etage_2', 
'$porte_2', '$numero_rue_3', '$rue_3', '$code_postal_3', '$ville_3', '$pays_3', '$batiment_3', 
'$etage_3', '$porte_3', '$telephone_fixe_1', '$telephone_fixe_2', '$telephone_fixe_3',
'$telephone_portable_1', '$telephone_portable_2', '$telephone_portable_3', '$email_1', '$email_2', 
'$email_3', '$site_1', '$site_2', '$site_3', '$site_4', '$site_5', '$loisir', '$langue', '$langage')") or die 
(''.mysql_error());
Mais je ne voulais pas vous compliquer la vie avec tout ça donc j'ai remplacer par $valeur mais il se trouve que je n'arrive pas à adapté vette requete avec :
query = sprintf("INSERT INTO inscription (`valeur`) VALUES ('%s')");
 mysql_real_escape_string($valeur);

Posté : 27 déc. 2007, 13:30
par zeus
ta manière d'utiliser sprintf est mauvaise ...
sprintf('ma chaine : %s', 
    $valeur);
alors que tu utilises :
sprintf('ma chaine : %s');
    $valeur;

Posté : 27 déc. 2007, 13:45
par zaknaou
Je suis pas vraiment là. En utilisant sprintf est-ce $valeur peut garder son ' et que je puisse l'insérer dans la base de donnée ? Et je n'est donc pas besoin de mettre d'antislash ??

Posté : 27 déc. 2007, 14:21
par zeus
Dans mon dernier exemple, je te donnais un exemple d'utilisation de sprintf(), pas de la protection des variables.
Compare mon code avec ton exemple, remplace la chaine par ta requête et remplace ma variable non protégée par ta variable protégée

Posté : 29 déc. 2007, 23:55
par zaknaou
En fait je suis pas sur que l'erreur vienne de la simple côte bon voici l'erreur :
Ligne 3772 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'autres..', ', francais', 'PHP, HTML, SQL')' at line 1
Et la requête
mysql_query("INSERT INTO inscription (identifiant, mot_de_passe, pseudo_forum, pseudo_chat, pseudo_blog, pseudo_article, question_secrete, reponse_secrete, date_heure_inscription, civilite,
 nom, prenom, jour, mois, annee, numero_rue_1, rue_1, code_postal_1, ville_1, pays_1, 
batiment_1, etage_1, porte_1, numero_rue_2, rue_2, code_postal_2, ville_2, pays_2, batiment_2, 
etage_2, porte_2, numero_rue_3, rue_3, code_postal_3, ville_3, pays_3, batiment_3, etage_3, 
porte_3, telephone_fixe_1, telephone_fixe_2, telephone_fixe_3, telephone_portable_1, 
telephone_portable_2, telephone_portable_3, email_1, email_2, email_3, site_1, site_2, site_3, 
site_4, site_5, loisir, langue, langage) VALUES ('$identifiant', '$mot_de_passe', '$pseudo_forum', 
'$pseudo_chat', '$pseudo_blog', '$pseudo_article', '$question_secrete', '$reponse_secrete', 
'$date_heure_inscription', '$civilite', '$nom', '$prenom', '$jour', '$mois', '$annee', '$numero_rue_1',
 '$rue_1', '$code_postal_1', '$ville_1', '$pays_1', '$batiment_1', '$etage_1', '$porte_1', 
'$numero_rue_2', '$rue_2', '$code_postal_2', '$ville_2', '$pays_2', '$batiment_2', '$etage_2', 
'$porte_2', '$numero_rue_3', '$rue_3', '$code_postal_3', '$ville_3', '$pays_3', '$batiment_3', 
'$etage_3', '$porte_3', '$telephone_fixe_1', '$telephone_fixe_2', '$telephone_fixe_3', 
'$telephone_portable_1', '$telephone_portable_2', '$telephone_portable_3', '$email_1', '$email_2', 
'$email_3', '$site_1', '$site_2', '$site_3', '$site_4', '$site_5', '$loisir', '$langue', '$langage'
)") or die ('Ligne 3772 '.mysql_error());

Posté : 30 déc. 2007, 00:38
par Truc
Ce n'est pas la requête avant traitement php qu'il nous faut mais après :roll:
(en passant essaie de présenter ta requête de manière à ce qu'on puisse la voir sans devoir utiliser la barre de défillement sur 2km.)