Insérer dans une base de donnée une valeur ayant une simple côte...

Eléphant du PHP | 88 Messages

26 déc. 2007, 22:16

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]

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 déc. 2007, 23:35

ATTENTION vu les codes que j'utilise précédament et qui ne sont pas modifiable on ne peut pas mettre d'antislash !!
Pourquoi ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 4039 Messages

26 déc. 2007, 23:49

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..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 88 Messages

26 déc. 2007, 23:55

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 ??
Cordialement zaknaou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 déc. 2007, 00:22

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 88 Messages

27 déc. 2007, 00:42

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
Cordialement zaknaou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 déc. 2007, 00:54

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 88 Messages

27 déc. 2007, 01:40

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
Modifié en dernier par zaknaou le 27 déc. 2007, 03:46, modifié 1 fois.
Cordialement zaknaou

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

27 déc. 2007, 02:26

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.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 88 Messages

27 déc. 2007, 13:22

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);
Cordialement zaknaou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 déc. 2007, 13:30

ta manière d'utiliser sprintf est mauvaise ...
sprintf('ma chaine : %s', 
    $valeur);
alors que tu utilises :
sprintf('ma chaine : %s');
    $valeur;
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 88 Messages

27 déc. 2007, 13:45

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 ??
Cordialement zaknaou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 déc. 2007, 14:21

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 88 Messages

29 déc. 2007, 23:55

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());
Modifié en dernier par zaknaou le 30 déc. 2007, 04:22, modifié 1 fois.
Cordialement zaknaou

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 déc. 2007, 00:38

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.)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute