IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Un formulaire qui ne fonctionne pas comme il faut (problèmes avec stripslashes & com) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Un formulaire qui ne fonctionne pas comme il faut (problèmes avec stripslashes & com)
    Bonjour tlm,

    Voila j'ai un formulaire de soumission d'articles qui ne fonctionne pas comme je le désirerai. Le problème se situe au niveau du réaffichage des variables envoyées par le formulaire. En fait quand un utilisateur ne remplit pas un champs comme il le faut et appuies sur envoyé (cible=la même page), les champs seront préremplis avec ce qu'il a envoyé. Seulement les données ne s'affichent pas bien. Par exemple l'amour devient l\'amour, malgré le stripslashes et les saut à la ligne deviennent /r/n.
    Bref, après avoir tout éssayé rien ne fonctionne.
    Ah oui j'allais oublié, j'ai déja magic_quotes_gpc sur Off.
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    <?php
    //----------------------------------------------------
    //Debut de la partie du code qui doit être mise avant tout code html
    //----------------------------------------------------
     
    session_start();
     
    mysql_connect("localhost", "root", "");
    mysql_select_db("articles");
     
    if(empty($_SESSION ['pseudo']))
    {
    	header('location: ../login.php');
    	exit();  
    }
    //--------------------------------------------------
    //Fin de la partie du code qui doit être mise avant tout code html
    //--------------------------------------------------
     
    mysql_connect("localhost", "root", "");
    mysql_select_db("articles");
    $erreur = '';
     
    if (!empty($_POST['titre'])  AND !empty($_POST['contenu']) AND !empty($_POST['infos_auteur']) AND !empty($_POST['mots_cles']))
    {
    	$_POST['titre'] = mysql_real_escape_string($_POST['titre']);
    	$_POST['contenu'] = mysql_real_escape_string($_POST['contenu']);
    	$_POST['infos_auteur'] = mysql_real_escape_string($_POST['infos_auteur']);
    	$_POST['mots_cles'] = mysql_real_escape_string($_POST['mots_cles']);
    	//Transformer $_POST['mots_cles'] en array et compter le nombre d'antrées 
    	$nbre_mots_cles = count(explode(",", $_POST['mots_cles']));
     
     
     
    	//Si le champ titre compte moins de deux mots
    	if (str_word_count($_POST['titre']) < 2 )
    	{
    		$erreur .= '* Le titre doit contenir au moins deux mots.<br />'; 
    	}
    	//Vérifier si l'utilisateur à choisi une catégorie 
    	if ($_POST['categories'] == 0)
    	{
    		$erreur .= '* Veuillez choisir une catégorie ou sous catégorie.<br />';
    	}
    	//Si le contenu contient moins de 200 mots ou plus de 5000 caractères
    	if ( strlen($_POST['contenu']) > 5000 OR str_word_count($_POST['contenu']) < 200 )
    	{
    		$erreur .= '* Votre articles doit contenir un minimum de 200 mots et pas plus de 5.000 caractères au maximum. La taille idéale d\'un article est de 250 à 700 mots.<br />';
    	}
    	//Si la bio de l'auteur ne doit pas dépasser 600 caractères
    	if ( strlen($_POST['infos_auteur']) > 600 )
    	{
    		$erreur .= '* Votre bio ne doit pas dépasser 600 caractères.<br />';
    	}
    	//Le nombre de mots clès ne doit pas être supérieur à 20 mots et inférieur à 2 mots
    	if ($nbre_mots_cles < 2 OR $nbre_mots_cles > 20 )
    	{
    		$erreur .= '* Vous devez saisir au moins 2 mots-clés et pas plus de 20. N\'oubliez pas de séparer chaque mot-clé par une virgule.<br />';
    	}
     
    	//Si tout est bon on enregistre les informations et affiche un message "success".
    	if ($erreur == NULL)
    	{
    		echo 'Votre Article a bien été ajouté, cependant un administrateur doit le valider avant qu\'il apparaisse en ligne.<br />';
    	}
    }
    //Si tous les champs sont manquant 
    elseif(empty($_POST['titre'])  AND empty($_POST['contenu']) AND empty($_POST['infos_auteur']) AND empty($_POST['mots_cles']))
    {
    	$_POST['titre'] = '';
    	$_POST['contenu'] = '';
    	$_POST['infos_auteur'] = '';
    	$_POST['mots_cles'] = '';
     
    }
    //Si un seul champs ou plus sont manquants
    else
    {
    	$erreur .= '* Un champ est maquant, veuillez remplir tous les champs.<br />';
    }
    ?>
    <h2>Ajouter un Article</h2>
    <?php
    if(!empty($erreur))
    {
    	echo '<p>'.$erreur.'</p>';
    }
    ?>
     
    <form method="POST" action="ajouter_article.php">
    <fieldset color="red" ><Legend><strong>Ajouter un Article</strong></legend>
    Titre de l'article : <input type="text" name="titre" maxlength="80" size="35" value="<?php echo stripslashes(htmlspecialchars($_POST['titre'])); ?>" /><br /><br />
    Catégories et sous-catégories<br />
    <select name="categories" style="font-size:9pt">
    <option value='0'>Aucune
     
    <!--              AFFAIRES               -->
    <option value='1'>&nbsp;&nbsp; Affaires</option>
    <option value='17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Faillite</option>
    <option value='18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Administration</option>
    <option value='19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Relations client</option>
    <option value='20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Financement</option>
    <option value='21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entreprises</option>
    <option value='22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Etude de marché</option>
    <option value='23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vente</option>
    <option value='24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Association et JV</option>
     
     
    <!--        autres catégories et sous catégories           -->
     
     
    </select><br /><br />
     
    Le corps de votre article :<br />
    <textarea name="contenu" cols="55" rows="20" /><?php echo stripslashes(htmlspecialchars($_POST['contenu'])); ?></textarea><br /><br />
     
    A propos de l'auteur  : <br /><textarea name="infos_auteur" cols="55" rows="5" />
    <?php echo stripslashes(htmlspecialchars($_POST['infos_auteur'])); ?>
    </textarea><br /><br />
    Mots clés : <input type="text" name="mots_cles" size="35" value="<?php echo stripslashes(htmlspecialchars($_POST['mots_cles'])); ?>"/><br />
     
    <input type="submit" value="soumettre" />
     
    </fieldset>
    </form>
    Si rien ne vous apparait étrange, pourriez vous tester ce script chez vous, car je suspecte que quelque chose ne va pas dans ma configuration .

    Merci à vous.
    Vicent.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Etes-vous certains que magic_quotes_gpc est à Off ?

    Je vous recommande afin d'être plus portable d'utiliser une fonction pour gérer proprement l'échappement des caractères spéciaux MySQL, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function quote_smart($value)
    {
       // Stripslashes
       if (get_magic_quotes_gpc()) $value = stripslashes($value);
       // Protection si ce n'est pas un entier
       if (!is_numeric($value)) $value = mysql_real_escape_string($value);
       return $value;
    }
    L'appel à quote_smart remplacerait ainsi celui à mysql_real_escape_string. J'ai testé votre code sur ma configuration (à Off) et je n'ai semble-t-il pas de problème.

    Vous faites deux connexions MySQL identiques : vous pouvez supprimer la première.

    Quant à \r\n, que cherchez-vous exactement ? A les transformer en <br/> (fonction nl2br) ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Oui j'ai revérifié et jpc (php.ini dans le dossier php) est bien sur off.
    Merci pour la fonction, je la testerais aprés avoir compris pourquoi ca ne marche pas chez moi.
    En fait quand j'oublie de remplir un champs, tout fonctionne. Mais quand tous les champs sont remplis et qu'une condition n'est pas remplie, l'affichage devient vraiment bizard.
    Il y a surement quelque chose qui m'echappe dans tout ca.
    Merci encore une fois pour votre réponse.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par vincent.b
    Oui j'ai revérifié et jpc (php.ini dans le dossier php) est bien sur off.
    Le phpinfo est plus fiable (pas d'erreur possible quant au fichier php.ini, la valeur a pu être changée localement via un htaccess et/ou directement dans le fichier de configuration d'Apache).

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Comment faire ca depuis phpinfo ?
    Sinon, j'ai remarqué qu'en enlevant le mysql_real_escape_string() mon programme fonctionne bien, ce qui veut dire que le off que j'avais mis n'était pas pris en compte.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par vincent.b
    Comment faire ca depuis phpinfo ?
    Vous créez ce simple script :
    Vous consultez ensuite sa sortie et dans le cas présent vous cherchez la ligne magic_quotes_gpc dans le deuxième tableau.

    Citation Envoyé par vincent.b
    Sinon, j'ai remarqué qu'en enlevant le mysql_real_escape_string() mon programme fonctionne bien, ce qui veut dire que le off que j'avais mis n'était pas pris en compte.
    Ce n'est pas le rôle de cette fonction et elle n'est pas liée à ce paramètre de configuration de PHP (d'où le test avec get_magic_quotes_gpc dans la fonction donnée précédemment). En effet, son but est de protéger les données utilisées lors d'une requête MySQL en échappant les caractères considérés comme spéciaux par MySQL.

    magic_quotes_gpc lorsqu'il est à On a pour effet d'appliquer automatiquement et en interne par PHP l'échappement de caractères spéciaux "génériques" comme l'apostrophe sur les données externes (méthodes GPCS : get, post, cookie, session).

    Dès lors mysql_real_escape_string combiné à l'action de magic_quotes_gpc (donc à On) revient à appliquer pour ainsi dire deux fois le même traitement d'où un comportement inattendu (une simple apostrophe se transforme alors en \\\' au lieu de \').

    D'autre part, les données subissant originalement une protection via mysql_real_escape_string ne devraient être utilisées que pour la requête (que je n'ai pas vu cela dit) et non pour un réaffichage (bien que vous devriez retrouver vos données originales avec stripslashes mais cela vous fait un traitement supplémentaire et inutile dans votre formulaire).

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Merci pour toutes ces informations.
    C'est de plus en plus clair.
    Je me mets au travail de suite .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Regex simple mais qui ne fonctionne pas comme il faut
    Par yagami77 dans le forum Langage
    Réponses: 1
    Dernier message: 08/01/2011, 23h27
  2. [Bonne pratique] merge qui ne fonctionne pas comme prévu
    Par forex dans le forum Subversion
    Réponses: 1
    Dernier message: 19/05/2008, 04h28
  3. Validation formulaire qui ne fonctionne pas
    Par dom59111 dans le forum Langage
    Réponses: 6
    Dernier message: 25/10/2007, 10h18
  4. requete qui ne fonctionne pas comme je shouterais
    Par domino_dj dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/04/2007, 12h27
  5. un if qui ne fonctionne pas comme je veux
    Par Kelly182 dans le forum Access
    Réponses: 4
    Dernier message: 27/07/2006, 15h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo