Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Oracle] Caractères spéciaux

Sujet résolu
    10 février 2016 à 8:23:11

    Bonjour,

    Lorsqu'il y a un point d'interrogation dans ma chaîne de caractères, Oracle refuse de l'insérer. Voici la variable :

    $commentaires = (!empty($commentaires)) ? htmlspecialchars(stripslashes($this->input->post("commentaires")), ENT_QUOTES) : "";

    Sauriez-vous pour quelle raison les points d'interrogation ne s'insèrent pas ?

    Merci :)

    • Partager sur Facebook
    • Partager sur Twitter
      10 février 2016 à 11:37:39

      Bonjour,

      Je n'ai pas de réponse à ta question, mais je ne comprends pas le pourquoi de ce traitement avant insertion ...

      htmlspecialchars est normalement destinée à empêcher l'affichage de code malin, ce n'est donc pas à utiliser à l'insertion en base, mais à l'affichage de la page web (avec un echo par exemple) ...

      stripslashes supprime les backslashes de la chaîne de caractères, pour quel besoin les retirer ?

      Essayes peut-être de faire un insert sans ces deux fonctions, directement avec une requête préparée PDO pour sécuriser à minima ta variable $commentaires.

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        10 février 2016 à 13:14:57

        Bonjour,

        Merci de ta réponse. Comment puis-je éviter les injections SQL alors ?

        • Partager sur Facebook
        • Partager sur Twitter
          10 février 2016 à 13:28:15

          Benzouye a écrit:

          directement avec une requête préparée PDO pour sécuriser à minima ta variable $commentaires.

          Exemple avec la classe PDO et une variable $_POST issue d'un formulaire :

          <?php
          	try {
          		$pdoOptions[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
          		$pdo = new PDO('mysql:host=localhost;dbname=ma_base;charset=UTF8', 'user', 'password', $pdoOptions);
          		
          		$requete = $pdo->prepare('
          			INSERT INTO ma_table ( colonne_commentaires )
          			VALUES ( :commentaires );
          		');
          		$requete->execute( array( ':commentaires' => $_POST['commentaire'] ) );
          		$requete->closeCursor();
          	}
          	catch(Exception $e) {
          		die('Erreur : '.$e->getMessage());
          	}
          ?>

          De cette façon PDO va "isoler" le contenu de la variable avant de l'insérer en base.

          Si tu as plusieurs variables, alors il suffit d'augmenter le nombre de marqueurs dans le prepare, et d'augmenter en fonction la taille du tableau dans l'execute.

          Jette un coup d'oeil sur le cours PHP/MySQL au chapitre concerné.

          -
          Edité par Benzouye 10 février 2016 à 13:30:45

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            10 février 2016 à 14:00:19

            Ah.. Je précise que j'utilise CodeIgniter avec une BDD Oracle. Il est clair que sinon j'aurais fait une requête préparée.
            • Partager sur Facebook
            • Partager sur Twitter
              10 février 2016 à 14:02:37

              Mais avec CodeIgniter les requêtes sont préparées ... les variables sont échappées ... tout du moins si tu passes par le "model".

              -
              Edité par Benzouye 10 février 2016 à 14:06:43

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                15 février 2016 à 8:29:09

                Oui je sais.. Mais on doit avoir un problème avec le driver oracle uniquement. Sur du MySQL tout va bien..
                • Partager sur Facebook
                • Partager sur Twitter

                [Oracle] Caractères spéciaux

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown