Partage
  • Partager sur Facebook
  • Partager sur Twitter

nom de table dynamique dans une requete préparée

PHP 8.0.26 ; HeidiSQL : MariaDB or MySQL (TCP/IP) : libmysql-6.1.dll

    4 avril 2024 à 11:19:40

    Bonjour,

    je souhaite accéder aux tables de la bdd mySQL de façon dynamique.

    Ceci fonctionne :

    		$req = $this->bdd->prepare("SELECT * FROM $etable WHERE champ = :valeur");
    		$req->bindParam('valeur', $valeur, PDO::PARAM_STR, 0);
    		$req->execute();

    Mais à quoi bon utiliser les requêtes préparées si c'est pour injecter quand même des variables dedans ?

    Mais ceci ne fonctionne pas :

    		$req = $this->bdd->prepare('SELECT * FROM :etable WHERE champ = :valeur');
    		$req->bindParam('etable', $etable, PDO::PARAM_STR, 0);
    		$req->bindParam('valeur', $valeur, PDO::PARAM_STR, 0);
    		$req->execute();

    Ça ne fonctionne pas non plus avec bindValue() à la place de bindParam()

    D'après le message d'erreur :

    Message : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''etable' WHERE champ = 'valeur'' at line 1

    Il semblerait que bindParam() ajoute des quotes au nom de ma table dans la requête, ce qui donnerait

    SELECT * FROM 'etable' WHERE...

    au lieu de

    SELECT * FROM etable WHERE...

    et ce, malgré l'usage de PDO::PARAM_STR

    Est-ce que quelqu'un a déjà rencontré ce problème ?

    -
    Edité par touvenant 4 avril 2024 à 11:28:36

    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2024 à 15:57:00

      De mémoire, ce n'est pas faisable (ou du moins pas si facilement) de modifier le nom d'une table dans une requête, de même que le nom des champs.

      Il faudrait que les tables aient les mêmes noms de champs (si on ne souhaite modifier que le nom de table).

      Une façon de faire pourrait être de stocker la requête dans une chaine, puis de copier cette chaine et remplacer le '$etable" par le nom de la table ciblée

      ou mieux (je pense), stocker les requêtes préparées dans un dictionnaire dont la clé serait le nom de la table ciblée (on pourrait construire ce dictionnaire par la méthode que je décrit au dessus).

      Les méthodes plus complexes seraient d'utiliser les tables de schémas de la SGBD (voir cette solution sur SO https://stackoverflow.com/a/29082755 par exemple)

      • Partager sur Facebook
      • Partager sur Twitter

      nom de table dynamique dans une requete préparée

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown