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

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

Alorsladaccord
WRInaute impliqué
WRInaute impliqué
 
Messages: 510
Enregistré le: 30 Juil 2014

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

Message le Ven Mar 31, 2017 16: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 :!:

rick38
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 470
Enregistré le: 23 Fév 2013

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

Message le Sam Avr 01, 2017 13: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.

Alorsladaccord
WRInaute impliqué
WRInaute impliqué
 
Messages: 510
Enregistré le: 30 Juil 2014

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

Message le Sam Avr 01, 2017 15: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 ?

rick38
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 470
Enregistré le: 23 Fév 2013

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

Message le Dim Avr 02, 2017 10: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';


spout
WRInaute accro
WRInaute accro
 
Messages: 8336
Enregistré le: 14 Mai 2003

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

Message le Dim Avr 02, 2017 10:58

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

<3 Eloquent

Alorsladaccord
WRInaute impliqué
WRInaute impliqué
 
Messages: 510
Enregistré le: 30 Juil 2014

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

Message le Lun Avr 03, 2017 16: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

绝对


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.

Lectures recommandées sur ce thème :