Qu'est-ce qui ne va pas dans ma requête préparée ?

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Alorsladaccord, 31 Mars 2017.

  1. Alorsladaccord
    Alorsladaccord WRInaute occasionnel
    Inscrit:
    30 Juillet 2014
    Messages:
    485
    J'aime reçus:
    0
    Bonjour,

    J'essaie d'utiliser une requête préparée, dont un champ est défini par la valeur d'une variable. Donc je passe une variable en paramètre de colonne/champ (c'est bien ça ?).

    Je n'ai pas d'erreur, mais pas de résultat non plus...

    Code:
     
    $table="la_table" ;
    
    
    
    $sql = "UPDATE :table SET attribution=1 WHERE id=".$attribution."";
     $stmt = $dbh->prepare ($sql); /* On prépare la requête */
    $stmt->bindValue('table', $table);
     $stmt->execute();

    Une idée :?:

    Je sais que le problème vient de la requête préparée, car avec une requête "classique", le script fonctionne bien.

    Merci d'avance :!:
     
  2. rick38
    rick38 WRInaute passionné
    Inscrit:
    23 Février 2013
    Messages:
    1 544
    J'aime reçus:
    210
    Un paramètre ne peut pas s'appliquer à un nom de table.

    C'est ton $attribution qui devrait être un paramètre, pas le nom de la table.
     
  3. Alorsladaccord
    Alorsladaccord WRInaute occasionnel
    Inscrit:
    30 Juillet 2014
    Messages:
    485
    J'aime reçus:
    0
    Salut rick38,

    Je n'ai pas sorti ce morceau de code de mon chapeau, je me suis inspiré de cette page :

    Code:
    $conn = new PDO(...);
    $sql = "SELECT * FROM :table WHERE id=:id";
    $requete = $conn->prepare($sql);
    $requete->execute(array(':table' => 'test1', ':id' => 5));
    ...
    
    https://openclassrooms.com/forum/sujet/pdo-requete-preparee-nom-de-table-12304
    
    Ils n'ont pas l'air de dire qu'on ne peut utiliser une variable pour définir la table d'une requête préparée et cet exemple ne le laisse pas voir. Ou alors, je lis mal.

    **edit**
    Ah ouais, je lis mal, la vache. Ils disent qu'on ne peut pas. Vous confirmez ?
    L'idée, c'est d'utiliser la même requête pour effectuer la même opération dans plusieurs tables, sachant qu'elles ont des champs similaires. Je change donc seulement le nom de la table au moyen d'une variable, ce qui m'évite de réécrire x fois la même requête, dans x scripts.
    Je ne peux pas ?

    Il faut peut-être que je fasse un switch en définissant préalablement les requêtes complètes alors. C'est pas mal aussi, un peu plus lourd, mais ça peut le faire.

    Confirmatance ?
     
  4. rick38
    rick38 WRInaute passionné
    Inscrit:
    23 Février 2013
    Messages:
    1 544
    J'aime reçus:
    210
    Evidemment mais ça n'aurait de toute façon aucun intérêt de mettre des noms de table ou champs en paramètre !
    Il faut revenir à pouquoi utiliser des paramètres pour un SELECT. C'est essentiellement une question de sécurité quand les valeurs sont reçues de l'extérieur. Ca n'a aucun intérêt quand vous pouvez construire votre requête dans le code de cette façon :

    if (...)
    $table = 'table1';
    else
    $table = 'table2';

    $sql = 'UPDATE ' . $table . ' SET attribution=1 WHERE id= :attribution';
     
  5. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 101
    J'aime reçus:
    305
    PHP:
    <span class="syntaxdefault">DB</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">table</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$table</span><span class="syntaxkeyword">)-></span><span class="syntaxdefault">update</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">compact</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'attribution'</span><span class="syntaxkeyword">));&nbsp;</span><span class="syntaxdefault"></span>
    <3 Eloquent
     
  6. Alorsladaccord
    Alorsladaccord WRInaute occasionnel
    Inscrit:
    30 Juillet 2014
    Messages:
    485
    J'aime reçus:
    0
    Sauf erreur de ma part, avant les histoires de requêtes préparées, il était possible de placer une variable en guise de champ, dans une requête SQL. Je me trompe ?
    Par exemple :
    Code:
    Select "$champ1", "$champ2" FROM laTable WHERE  $champ1="$id".
    Je me trompe ?

    绝对
     
Chargement...
Similar Threads - requête préparée Forum Date
marqueurs nommés vs marqueurs interrogatifs requête préparée Développement d'un site Web ou d'une appli mobile 16 Janvier 2019
Marqueur nommé ou interrogatif pour les requetes préparées ? Développement d'un site Web ou d'une appli mobile 30 Décembre 2018
Requête préparée nécessaire ? Développement d'un site Web ou d'une appli mobile 28 Octobre 2018
Combiner 2 requetes préparées Développement d'un site Web ou d'une appli mobile 30 Septembre 2018
Pourquoi ma requête préparée n'update-t'elle rien du tout ? Développement d'un site Web ou d'une appli mobile 8 Avril 2017
Ma première requête préparée (ne) fonctionne (pas) Développement d'un site Web ou d'une appli mobile 19 Septembre 2015
Requete préparée avec LIKE Développement d'un site Web ou d'une appli mobile 31 Juillet 2015
Nettoyage de requètes externes de Google, comment faire? Administration d'un site Web 24 Octobre 2020
encodage texte sur requete mysql Demandes d'avis et de conseils sur vos sites 21 Octobre 2020
Requête MySql imbriquée Développement d'un site Web ou d'une appli mobile 8 Octobre 2020