Requête SQL

Résolu
Bonjour,

J'ai crée un formulaire d'ajout d'articles, mais j'ai un petit problème. Lorsque dans ma partie contenu il y a un mot avec une apostrophe, la requête ne s'exécute pas a cause de l'apostrophe. Voici mon code d'ajout.

extract($_POST);
$sql = "INSERT INTO test(titre,contenu) VALUES ('$titre','$contenu')";
$req = mysql_query($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

J'ai déjà essayé sans les apostrophes et tout fonctionnent à merveille.

Merci pour votre aide !

3 réponses

  1. Bonjour

    C'est normal que ça ne marche pas avec une apostrophe. L'apostrophe sert à délimiter les valeurs que tu mets dans VALUES.

    Pour éviter ça, il faut "échapper" les apostrophes (et autres caractères spéciaux, d'ailleurs) avant d'insérer tes données dans ta requête :

    extract($_POST);  // très dangereux....
    $titre = mysql_real_escape_string($titre);
    $contenu = mysql_real_escape_string($contenu);
    $sql = "INSERT INTO test(titre,contenu) VALUES ('$titre','$contenu')";
    $req = mysql_query($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    1. Bonjour, je vais répondre mais je suis pas sur de mon coups...moi je ferais cela

      je transformerais la string en tableau et avec une boucle je chercherais l'apostrophe. Si il y en as un j'insérerais un \ pour l'échapper.

      j 'espère que cela peut vous aider

      bonne journée
      1. Merci ça marche !
        Pourquoi cette méthode est dangereuse ? Je découvre tout juste donc je sais pas grand chose :)
        1. le extract($_POST) est dangereux car il crée des variables dans ton programme en dehors de ton contrôle. Il est très facile de modifier un formulaire et de l'envoyer à ton script.
          Si j'ajoute dans le formulaire un champ que j'appelle 'admin' et auquel je donne la valeur 1, ça va créer dans ton programme une variable $admin qui vaudra 1. Tu imagines les possibilités ?

          Il est nettement préférable d'extraire soi-même une par une les variables auxquelles on s'attend :
          $titre = mysql_real_escape_string($_POST['titre']);
          $contenu = mysql_real_escape_string($_POST['contenu']);
          
        2. Ah oui effectivement. Merci pour ton aide, je vais modifier tout ça. Encore merci :)