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

WRInaute occasionnel
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 :!:
 
WRInaute passionné
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.
 
WRInaute occasionnel
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 ?
 
WRInaute passionné
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';
 
WRInaute accro
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
 
WRInaute occasionnel
rick38 a dit:
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';

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 ?

spout a dit:
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;&nbsp;</span><span class="syntaxdefault"></span>
<3 Eloquent
绝对
 
Discussions similaires
Haut