Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insertion Basse de Donnée

Aucune Erreur Pourtant Aucune Ligne Présente Dans Ma Table

    26 mars 2017 à 19:32:51

    <?php
    function random($car) {
    $string = "";
    $chaine = "abcdefghijklmnpqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    srand((double)microtime()*1000000);
    for($i=0; $i<$car; $i++) {
    $string .= $chaine[rand()%strlen($chaine)];
    }
    return $string;
    }
    
    // Fonction
    ?>
    
    <?php
    $folder = random(10);
    $file = random(10);
    $name = $_FILES['avatar']['name'];
    $date = date('h:i:s');
    ?>
    
    
    <?php
    mkdir($folder);
    ?>
    
    <?php
    try
    {
    	$bdd = new PDO('mysql:host=privee;dbname=privee;charset=utf8', 'privee', 'privee');
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    ?>
    
    
    
    <?php
    if(isset($_FILES['avatar']))
    { 
         $dossier = $folder .'/';
         $fichier = basename($_FILES['avatar']['name']);
         if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
         {
              $status = true;
         }
         else //Sinon (la fonction renvoie FALSE).
         {
             $status = false;
         }
    }
    ?>
    
    <?php
    $bdd->exec('INSERT INTO upload (Name, File, Date, Folder, status) VALUES(' .$name .',' .$file .',' .$date .',' .$folder .',' .$status .')');
    print_r($bdd->errorInfo());
    ?>

    Juste en incluant 
    print_r($bdd->errorInfo());
    j'ai pu constater cet érreur :
    Array ( [0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':24:39,SpMyWq8m6K,1)' at line 1 )

    Aucune erreur de connexion à la base
    • Partager sur Facebook
    • Partager sur Twitter
      26 mars 2017 à 19:40:27

      Lut,

      Je constate une petite erreur de débutant qui ouvre une faille XSS faille qui permet de faire une injection SQL et rend la requête successible aux erreurs de syntaxe SQL. L'erreur est la manière d'exécuter. Bon, je ne vais pas te taper dessus mais je vais te donner un petit bout de code pour correctement exécuter la requête.

      $bdd = new PDO('...', '...', '...');
      $requete = $bdd->prepare('Ma requête SQL');
      $requete->execute(['Mes', 'paramètres'])
      

      Si tu veux plus d'informations, je te conseille de voir la documentation.

      -
      Edité par lapin-math 26 mars 2017 à 20:23:34

      • Partager sur Facebook
      • Partager sur Twitter
      Clef PGP: 4577 D41D 2F68 4552 ou https://keybase.io/l4p1n; Votre problème est résolu ? Mettez-le en résolu pour nous aider à nous retrouver ^^
        26 mars 2017 à 20:19:36

        Peut tu me redire tout ça en clair s'il te plait

        -
        Edité par 360matt 26 mars 2017 à 20:32:33

        • Partager sur Facebook
        • Partager sur Twitter
          26 mars 2017 à 20:32:41

          Je reprends, avec des mots un peu plus simples.

          La concaténation effectuée pour construire la requête SQL est vulnérable à une faille appelée injection SQL (pas XSS, où est-ce que j'avais ma tête ?). De plus, cette technique expose la requête aux erreurs de syntaxe à cause du fait que les données peuvent contenir une apostrophe (délimiteur de chaîne de caractères en SQL). Alors, pour pallier cela, je propose que l'on change ta technique de construire la requête par

          // $bdd est une instance de PDO
          // Préparer la requête
          $requete = $bdd->prepare('INSERT INTO une_table(un, champ, de_table) VALUES(?, ?, ?)');
          
          // Exécuter la requête
          $requete->execute(['une', 'valeur', "avec l'apostrophe qui casse tout"]);
          

          Cette technique permet non seulement de pallier la faille d'injection SQL en plus d'éviter les erreurs de syntaxe SQL parce qu'il y a un apostrophe.

          J'espère avoir été plus clair pour le coup.

          • Partager sur Facebook
          • Partager sur Twitter
          Clef PGP: 4577 D41D 2F68 4552 ou https://keybase.io/l4p1n; Votre problème est résolu ? Mettez-le en résolu pour nous aider à nous retrouver ^^
            26 mars 2017 à 20:39:28

            Je n'ai pas compris le code au moment d'exécuter la requête

            -
            Edité par 360matt 26 mars 2017 à 20:46:51

            • Partager sur Facebook
            • Partager sur Twitter
              26 mars 2017 à 21:55:30

              Tout d'abord, je prépare la requête (on dit comme ça) en appelant $bdd->prepare(...) avec des ?, dans la requête, qui seront remplacés par les valeurs correspondantes plus tard.

              Le résultat est un objet de type PDOStatement. Pour exécuter la requête, on fait appel à $requete->execute(...) en lui passant un tableau. Les valeurs de ce tableau remplaceront les ?. Le résultat renvoyé est un booléen; true si la requête a bien été exécutée, false sinon (ou encore une exception si tu l'a paramétré ainsi).

              Si t'as besoin de clarifications, je t'invite à consulter la doc, le cours, ou bien de me demander ^^

              • Partager sur Facebook
              • Partager sur Twitter
              Clef PGP: 4577 D41D 2F68 4552 ou https://keybase.io/l4p1n; Votre problème est résolu ? Mettez-le en résolu pour nous aider à nous retrouver ^^
                27 mars 2017 à 12:24:45

                S&lut,

                je complète l'explication de lapin-math:

                • Préfère les marqueurs nommés (:toto) plutôt qu'anonymes (?) car tu peux les binder dans n'importe quel ordre,
                • Préfère le PDOStatement::bindvalue() /PDOStatement::bindParam() au passage de tableau dans PDOStatement::execute(),
                • Vérifie le nombre de lignes affectées avec PDOStatement::rowCount() su un INSERT/UPDATE/DELETE

                ++

                • Partager sur Facebook
                • Partager sur Twitter
                  30 novembre 2023 à 19:33:26

                  tu peux me redire stp ?

                  J'ai pas compris

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 novembre 2023 à 19:39:46

                    360matt a écrit:

                    tu peux me redire stp ?

                    J'ai pas compris

                    Bonsoir, 6 ans après!!! Pourriez vous être plus explicite sur ce que vous n'avez pas compris?  Code actuel?

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Insertion Basse de Donnée

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    • Editeur
                    • Markdown