IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Concaténation dans une requête SQL


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 54
    Points : 72
    Points
    72
    Par défaut Concaténation dans une requête SQL
    Bonsoir !

    J'essaye depuis quelques temps de faire fonctionner une requête SQL... en vain :s
    Dans mon code je récupère deux types de variables provenant d'un formulaire (des $_POST['lien1'], $_POST['lien2'], $_POST['lien3'],... et ainsi de suite ainsi que des $_POST['id1'], $_POST['id2'],...) que j'utilise dans une requête SQL que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    for ($nb_lignes = 1; $nb_lignes <= $_POST['nb_liens']; $nb_lignes++)
    {
    	$table = $_POST['lien' . $nb_lignes . ''];
    	$id2 = $_POST['id' . $nb_lignes . ''];
    	$requete = "INSERT INTO ".$table."(id_article, id2) VALUES('".$_GET['id']."', '".$id2."')";
    	echo $requete . '<br />'; // que j'ai inséré pour y voir plus clair dans mon erreur
    	$bdd->exec($requete);
    }
    ?>
    l'echo $requete me retourne ceci quand $_POST['nb_liens'] vaut par exemple 3 :

    INSERT INTO article_presse_dossier(id_article, id2) VALUES('47', '5')
    INSERT INTO article_presse_individu(id_article, id2) VALUES('47', '2')
    INSERT INTO article_presse_dossier(id_article, id2) VALUES('47', '2')

    Ce qui me semble tout à fait correct, puis que j'ai les champs 'id_article' et 'id2' dans les deux tables concernées. Seulement voila, rien n'est ajouté dans mes tables... ca ne fonctionne pas :s

    Si quelqu'un pouvait m'aider à trouver mon erreur je lui en serais vraiment très reconnaissant, merci !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    As-tu essayé ces requetes dans phpmyadmin ?
    Tu utilises PDO ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 161
    Points
    161
    Par défaut
    Si c'est PDO, profites-en pour lire ça :
    http://www.php.net/manual/fr/pdo.pre...statements.php

    Car les requêtes que tu postes (à moins que tu ne t'en serves que pour faire des tests) invitent aux injections SQL (en plus simple : elles ne sont pas sécurisées du tout).

  4. #4
    Modérateur
    Avatar de Vil'Coyote
    Homme Profil pro
    Développeur adélia & Web
    Inscrit en
    Février 2008
    Messages
    4 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur adélia & Web
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 4 583
    Points : 7 503
    Points
    7 503
    Par défaut
    y a un truc que j'ai du mal à comprendre, comment tu fait pour récupérer une variable $_GET['id'] et une autre $id2 = $_POST['id' . $nb_lignes . '']; ton formulaire de base ne t'envoi que du get ou que du post non?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 54
    Points : 72
    Points
    72
    Par défaut
    mon formulaire me renvoie du post et l'adresse m'envoie du get (dans l'adresse j'ai ?id=xx).

    en fait, j'ai ajouté un petit or die(print_r($bdd->errorInfo(), true)) et j'ai directement vu d'où venait mon erreur (le nom de mon champ c'est id_article_presse et non id_article... xD).

    Par contre maintenant j'ai un autre problème :s j'ai utilisé les requêtes préparés comme vous me conseillez mais apparemment je ne peux pas les utiliser pour la variable contenant le nom de ma table, ca donne donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    for ($nb_lignes = 1; $nb_lignes <= $_POST['lien']; $nb_lignes++)
    {
    	$table = $_POST['lien' . $nb_lignes . ''];
    	$id2 = $_POST['id' . $nb_lignes . ''];
    	$req_link = $bdd->prepare("INSERT INTO ".$table." (id_article_presse, id2) VALUES(:id_article_presse, :id2)") or die(print_r($bdd->errorInfo(), true));
    	$req_link->execute(array('id_article_presse' => $_GET['id'], 'id2' => $id2)) or die(print_r($bdd->errorInfo(), true));
    	$req_link->closeCursor();
    }
    ?>
    Le code fonctionne mais ca ne me plait pas de laisser la variable table directement dans la requête. Le problème c'est que si je remplace ".$table." par :table et que j'ajoute 'table' => $table à l'execute, ca ne marche pas...

    J'ai aussi essayer de rajouter la ligne $table = mysql_real_escape_string($table); mais dans ce cas mon code ne fonctionne plus non plus...

    Comment dois-je faire pour sécuriser cette variable ?

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $req_link = $bdd->prepare("INSERT INTO ? (id_article_presse, id2) VALUES(?, ?)") or die(print_r($bdd->errorInfo(), true));
    	$req_link->execute(array($table,$_GET['id'],$id2)) or die(print_r($bdd->errorInfo(), true));
    	$req_link->closeCursor();

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 54
    Points : 72
    Points
    72
    Par défaut
    Je viens d'essayer, ca me renvoie ceci (comme quand j'essaie avec :table) :

    Array ( [0] => 00000 )

  8. #8
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    donne quoi ?

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Le nom de la table ne peut faire l'objet d'un paramètre puisque PDO va le considérer comme une chaîne donc le quoter. Ça ne va donc pas. Même avec l'équivalent de mysql_real_escape_string (qui ne peut fonctionner puisque c'est l'API PDO et non mysql qui est utilisée) : la méthode quote. Le nom de la table ne sera donc plus reconnu comme tel.

    Donc essayer de garder le nom de la table statique ou, au pire, faire une vérification avec une liste blanche (array/in_array) ou contrôler la forme avec une expression régulière ou similaire avant injection dans la requête. Cependant, si le nombre de tables est limité, il doit être possible de créer une requête préparée pour chacune d'elles et de l'exécuter ensuite dynamiquement à partir du nom de la table récupéré du formulaire (via un tableau ou les variables dynamiques).

    PS : cette restriction est valable pour tout nom SQL (base, champ, etc).

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 54
    Points : 72
    Points
    72
    Par défaut
    oki je vais mettre au point un petit regex alors, merci à tous pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Concaténation de chaine dans une requête sql
    Par mauriceletendu dans le forum R
    Réponses: 0
    Dernier message: 13/08/2014, 12h42
  2. Concaténation d'un entier dans une requête SQL
    Par Mariness dans le forum C++Builder
    Réponses: 6
    Dernier message: 10/04/2012, 20h37
  3. Concaténation variable dans une requête sql
    Par pasc06 dans le forum Langage
    Réponses: 4
    Dernier message: 25/11/2008, 18h07
  4. Nom de champ variable dans une requête SQL
    Par stip dans le forum ASP
    Réponses: 2
    Dernier message: 30/09/2004, 19h02
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 19h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo