Partage
  • Partager sur Facebook
  • Partager sur Twitter

Uncaught PDOException: SQLSTATE[42000]

Sujet résolu
    14 novembre 2017 à 16:46:24

    Bonjour,

    Je viens vers vous pour un problème qui revient sans cesse mais ça fait 2 jours que j'essai de le résoudre et je vois pas où se trouve mon erreur...

    Le message d'erreur :

    Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ''presentation' WHERE pres_id = '3'' à la ligne 1 in C:\wamp64\www\ASM-new\modification.php:28 Stack trace: #0 C:\wamp64\www\ASM-new\modification.php(28): PDOStatement->execute(Array) #1 {main} thrown in C:\wamp64\www\ASM-new\modification.php on line 28


    Mon code en question :

    $req = $bdd->prepare('SELECT * FROM ? WHERE pres_id = ?');
    $req->execute(array($_GET['table'], $_GET['modif']));
    			
    while ($donnees = $req->fetch())
    {
            $titre=$donnees['pres_titre'];
            $contenu=$donnees['pres_contenu'];
    	$id=$donnees['pres_id'];	
    }

    La ligne 28 correspond à la partie : $req->execute

    Je vous remercie d'avance pour votre aide :-°

    • Partager sur Facebook
    • Partager sur Twitter
      14 novembre 2017 à 16:50:20

      Bonjour,

      Tu ne peux pas passer un nom de table comme ça, ça revient à mettre des quotes autour, SQL le prend comme une valeur.

      • Partager sur Facebook
      • Partager sur Twitter
        14 novembre 2017 à 17:00:50

        C'est une hypothèse que j'ai envisagé, mais dans ce cas, est-ce qu'on peut sélectionner une table via une variable ?

        • Partager sur Facebook
        • Partager sur Twitter
          14 novembre 2017 à 17:08:00

          Le plus simple est de passer le nom de la table directement dans la requête après s'être assuré que le nom de la table existe bien (pour éviter les injections).

          if(in_array($_GET['table'],$tables))
          {
          $req = $bdd->prepare('SELECT * FROM '.$_GET['table'].' WHERE pres_id = ?');
          $req->execute(array($_GET['modif']));
          }



          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2017 à 12:47:03

            Du coup si je fais ça, il faut au préalable que je déclare mon array $table avec toute les valeurs que peuvent prendre mes tables ?
            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2017 à 15:09:43

              Exactement. Après tout dépends à qui cela est accessible. C'est juste pour éviter les injections SQL.
              • Partager sur Facebook
              • Partager sur Twitter
                17 novembre 2017 à 10:38:11

                Ce sera accessible uniquement aux admin du site donc normalement pas de risque d'injection SQL.

                Je protège juste les variable transmise par l'URL à l'entrée de la page admin.

                Petite question pour finir, en relisant le tuto sur SQL, il est indiqué que la requête s’exécute plus rapidement si on la prépare plutôt que si on insert les variable directement dans la requête. Est-ce qu'on parle d'un réel gain de temps ou alors c'est plus du confort ? parce que sur une petite requète de ce type, j'ai du mal a voir le gain que sa pourrait apporter ^^

                En tout cas merci pour tes réponses Philodick !

                • Partager sur Facebook
                • Partager sur Twitter
                  17 novembre 2017 à 13:48:45

                  Non, dans ce cas il n'y a aucun gain de temps.

                  Les requêtes préparées servent d'abord à ne pas avoir à refaire la même requête qu'on exécuterait plusieurs fois avec des paramètres différents, Dans ce cas oui le gain est notable.

                  Elles ont aussi l'intérêt d'empêcher les injections SQL. C'est pourquoi tu les retrouveras même pour des requêtes qui ne sont exécutées qu'une fois.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 novembre 2017 à 14:01:39

                    Ok merci pour ces précisions.

                    Je garde ces infos dans un coin de ma tête ;)

                    merci pour ton temps ^^

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Uncaught PDOException: SQLSTATE[42000]

                    × 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