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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Insérer dans une base de donnée une valeur ayant une simple côte...

par zaknaou » 31 déc. 2007, 03:19

Oui, vous avez raison en particulier iclo je me suis dit autant modifier les 800 lignes qui font le traitement des champs pour généré les images, sa ma pris 2 heures et 30 minutes mais maintenant sa marche correctement je suis en train faire tout les testes mon script fait 4700 lignes qui traitent toutes les erreurs possibles que les utilisateurs peuvent commettre.

Merci à vous bonne soirée ou bonne journée seulont l'heure à la quelle vous lisez ce message.

par iclo » 31 déc. 2007, 01:13

J'ai toujours pas compris où était le problème de faire un addslashes() avant l'insert et un stripslashes() après avoir récupérer les données dans la base de donnée...
Pourquoi absolument vouloir faire les choses, autrement qu'il est conseillé de le faire par les concepteurs même du serveur ?

par zeus » 30 déc. 2007, 23:35

Non mais en plus il est recommandé de "protéger" les champs textes :
Surtout pas ...
Il s'agit d'une astuce MySQL pour permettre l'utilisation de caractères non standard dans les nom de tables ou de champs (espace, accents, ...), ce qui est contraire à la norme SQL.

Il est de loin préférable de ne pas s'habituer à utiliser les ` et de nommer correctement ses tables et ses champs.

par Aureusms » 30 déc. 2007, 23:27

Juste une petite question :

Est-ce que on peut faire :
mysql_query("UPDATE inscription SET nom_du_champs = $variable WHERE identifiant = '$identifiant'");
au lieu de :
mysql_query("UPDATE inscription SET nom_du_champs = '$variable' WHERE identifiant = '$identifiant'");
?

Peut-on enlever les simples côtes ??

Merci
Non mais en plus il est recommandé de "protéger" les champs textes :
mysql_query("UPDATE `inscription` SET `nom_du_champs` = '$variable' WHERE `identifiant` = '$identifiant'");
Comme ca mysql râle rarement (au fait `` c'est la touche AltGR+7 clavier Français)

par zeus » 30 déc. 2007, 21:57

Le plus simple aurait été d'essayer ;)

Toute valeur textuelle doit être encadrée de quotes dans une requête SQL

par zaknaou » 30 déc. 2007, 20:54

Juste une petite question :

Est-ce que on peut faire :
mysql_query("UPDATE inscription SET nom_du_champs = $variable WHERE identifiant = '$identifiant'");
au lieu de :
mysql_query("UPDATE inscription SET nom_du_champs = '$variable' WHERE identifiant = '$identifiant'");
?

Peut-on enlever les simples côtes ??

Merci

par Truc » 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.)

par zaknaou » 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());

par zeus » 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

par zaknaou » 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 ??

par zeus » 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;

par zaknaou » 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);

par Ryle » 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.

par zaknaou » 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

par zeus » 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