Consultez la formation SEO spéciale Wordpress
par WebRankInfo / Ranking Metrics

Messages: 527

Enregistré le: 30 Juil 2014

Message le Ven Mar 31, 2017 17:10

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: Tout sélectionner
 
$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 :!:
Haut
5 Réponses
Messages: 503

Enregistré le: 23 Fév 2013

Message le Sam Avr 01, 2017 14:32

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.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Sam Avr 01, 2017 16:56

Salut rick38,

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

Code: Tout sélectionner
$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 ?
Haut
Messages: 503

Enregistré le: 23 Fév 2013

Message le Dim Avr 02, 2017 11:39

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';
Haut
Messages: 8544

Enregistré le: 14 Mai 2003

Message le Dim Avr 02, 2017 11:58

Code: Tout sélectionner
DB::table($table)->update(compact('attribution')); 

<3 Eloquent
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Lun Avr 03, 2017 17:13

rick38 a écrit: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: Tout sélectionner
Select "$champ1", "$champ2" FROM laTable WHERE  $champ1="$id".

Je me trompe ?

spout a écrit:
Code: Tout sélectionner
DB::table($table)->update(compact('attribution'));  

<3 Eloquent

绝对
Haut

Formation recommandée sur ce thème :

Formation SEO spéciale Wordpress : apprenez à optimiser le référencement naturel d'un site fait avec Wordpress... Formation Ranking Metrics animée par un expert SEO / Wordpress.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.