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

PHP & Base de données Discussion :

problème nom de table en SQL parce que le nom est une variable [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut problème nom de table en SQL parce que le nom est une variable
    Bonjour,

    J'ai un petit souci avec une variable dans une requête SQL. En effet, ça fait plusieurs heures que je cherche, que j'essaie plusieurs syntaxes et rien n'y fait je suis toujours bloquée.
    Mon problème est que la variable qui me permet de donner un nom à ma table doit avoir une mauvaise syntaxe et donc me crée une erreur dans la requête. Je pense que c'est parce que la valeur de ma variable est entourée par des quotes et SQL n'aime pas ça

    Voici mon bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    $req = "select m.id_etudiant, nom, prenom, adresse from mail AS m, identification AS i where m.id_etudiant = i.id and nom='$nom' AND prenom='$prenom'";
    $res = mysql_query($req);
     
    $mail = $_POST['adresse'];
     
     
     
    while($ligne = mysql_fetch_object($res))
    {$id_etudiant=$ligne->id_etudiant;}
     
    mysql_query("CREATE TABLE IF NOT EXISTS ".$id_etudiant."(`index` int NOT NULL auto_increment, `adresse_mail` text NOT NULL, PRIMARY KEY (`index`)")or die(mysql_error());
     
    $sql = "INSERT INTO ".$id_etudiant."(`index`,`adresse_mail`) VALUES('','$mail')";
    mysql_query($sql) or die(mysql_error());
    Ah ouii j'allais oublier, si je remplace ma variable par une chaîne de caractères alors là ça fonctionne.. Donc le problème vient vraiment de la variable.

    Si quelqu'un pouvait m'aider, ça serait trop cool

    Merci en tout cas pour vos futures réponses

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    A la vu de ton code, il me vient pas mal de questions, car certains points me paraissent pas très clairs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while($ligne = mysql_fetch_object($res))
    {$id_etudiant=$ligne->id_etudiant;}
    Une 1ère requête SQL est faite avec une jointure sur 2 tables (mail et identification, or, une boucle est faite pour juste récupérer l'identifiant d'un étudiant selon son nom et prénom.
    Pour quoi alors faire une jointure sur la table mail et récupérer le nom, prénom, adresse si c'est juste l'id_etudiant qui est à récupérer ?

    Donc il y a aurait une table "mail" liées à la table "identifications", donc aux étudiants.
    Ceci suppose que cette table "mail" pourrait stocker les différents mail de chaque étudiant.

    Pourquoi alors créer une table par étudiant pour stocker une adresse mail ?
    Ceci va provoquer des données redondantes par rapport à la table "mail", ce qui serait un défaut de conception normalement.

    Ne faudrait il pas tout simplement ajouter le nouveau mail reçu en POST dans la table "mail" pour cet étudiant là ? (sans créer de table par étudiant).

    Ma question est donc :
    Pourquoi créer 1 table par étudiant ? (alors qu'une table stockant ces étudiants existe)


    Aussi, la recherche de l'id_etudiant ce ferait par le nom et prénom.
    N'y a t-il pas un risque d'avoir 2 (voire plus) étudiants ayant le même nom et prénom ? (DURANT Jean)
    S'il y a aucun risque, alors c'est bon.
    S'il y en a un (même 1 seul), alors il y a un problème dans la manière de procéder.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Salut

    A la vu de ton code, il me vient pas mal de questions, car certains points me paraissent pas très clairs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while($ligne = mysql_fetch_object($res))
    {$id_etudiant=$ligne->id_etudiant;}
    Une 1ère requête SQL est faite avec une jointure sur 2 tables (mail et identification, or, une boucle est faite pour juste récupérer l'identifiant d'un étudiant selon son nom et prénom.
    Pour quoi alors faire une jointure sur la table mail et récupérer le nom, prénom, adresse si c'est juste l'id_etudiant qui est à récupérer ?
    je n'ai pas tout afficher, dans mon script je récupère aussi le nom et le prénom pour autre chose.

    Citation Envoyé par RunCodePhp Voir le message
    Donc il y a aurait une table "mail" liées à la table "identifications", donc aux étudiants.
    Ceci suppose que cette table "mail" pourrait stocker les différents mail de chaque étudiant.

    Pourquoi alors créer une table par étudiant pour stocker une adresse mail ?
    Ceci va provoquer des données redondantes par rapport à la table "mail", ce qui serait un défaut de conception normalement.

    Ne faudrait il pas tout simplement ajouter le nouveau mail reçu en POST dans la table "mail" pour cet étudiant là ? (sans créer de table par étudiant).

    Ma question est donc :
    Pourquoi créer 1 table par étudiant ? (alors qu'une table stockant ces étudiants existe)


    Aussi, la recherche de l'id_etudiant ce ferait par le nom et prénom.
    N'y a t-il pas un risque d'avoir 2 (voire plus) étudiants ayant le même nom et prénom ? (DURANT Jean)
    S'il y a aucun risque, alors c'est bon.
    S'il y en a un (même 1 seul), alors il y a un problème dans la manière de procéder.

    En fait j'ai déjà essayé la méthode où je me sers de la table "mail". J'ai tenté d'insérer plusieurs adresses mails pour un même identifiant mais le résultat obtenu était que ça créait autant de lignes que j'entrais de mails :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    $req = "select m.id_etudiant, nom, prenom, adresse from mail AS m, identification AS i where m.id_etudiant = i.id and nom='$nom' AND prenom='$prenom'";
    	$res = mysql_query($req);
     
    	$mail = $_POST['adresse'];
     
     
     
    	while($ligne = mysql_fetch_object($res))
        {$id_etudiant=$ligne->id_etudiant;
    	$adresse=$ligne->adresse;
    	$nom=$ligne->nom;
    	$prenom=$ligne->prenom;}
     
    	$adresse .= ', ';
    	$adresse .=$mail;
     
     
        $sql = "INSERT INTO mail(id,id_etudiant,adresse) VALUES('','$id_etudiant','$mail')";
        mysql_query($sql) or die(mysql_error());

    du coup j'ai choisi la solution de créer une nouvelle table à pour chaque identifiant

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    serait-il possible de me dire comment faire pour nommer une table par une variable?
    merci

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    J'ai tenté d'insérer plusieurs adresses mails pour un même identifiant mais le résultat obtenu était que ça créait autant de lignes que j'entrais de mails
    ...
    du coup j'ai choisi la solution de créer une nouvelle table à pour chaque identifiant
    Je ne comprends pas.
    Lorsqu'on fait in INSER INTO, une insertion, c'est justement pour créer une nouvelle ligne.

    Donc même en créant une nouvelle table par étudiant, la 1ère ligne du 1er mail sera une nouvelle ligne.
    Si on souhaite ajouter un 2ème mail à un étudiant existant, cela rajoutera une nouvelle ligne pour cette même table (c'est à dire autant ligne qu'il y aura de mail pour un même étudiant).
    Il y rien d'anormal à cela, au contraire, c'est bien ça de but recherché.
    Si on a une table "articles", on ne va surtout pas créer une nouvelle table par articles.

    Ou alors, ce n'est pas une création que tu souhaites faire, mais une modification, une mise à jour, un remplacement.
    Si c'est cela alors c'est un UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE mail SET adresse_mail = 'un@nouveau.mail' WHERE id_etudiant = un_id_etudiant

    En créant autant de table qu'il y aura d'étudiants, tu vas considérablement te compliquer la tâche à gérer ces étudiants, de ces mails.
    Comment procèderas tu pour rechercher un étudiant si tu as uniquement un mail comme info ?
    Lancer autant de requête SQL qu'il y aura d'étudiants (de tables) ? (ça va pas)


    Si tu rencontres un problème d'insertion dans cette table "mail", explique plus en détail l'erreur que tu obtiens.
    (Tu risque fort d'avoir ce même problème pour d'autres tables, voire même pour ces tables étudiants).


    Au passage :
    Cette table "mail" a un champ "id" qui à mon sens est un champ auto_increment, donc cela veut dire que c'est à la Bdd d'accorder automatiquement un nouvel identifiant unique.
    Du coup il suffit de na pas renseigner ce champ "id" dans la requête d'insertion, ou alors indiquer NULL comme valeur.

    Exemple (sans renseigner le champ "id") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "INSERT INTO mail (id_etudiant, adresse) VALUES ('$id_etudiant', '$mail')";
    Exemple (champ "id" avec NULL comme valeur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "INSERT INTO mail (id, id_etudiant, adresse) VALUES (NULL, '$id_etudiant', '$mail')";

    Aussi, il est recommander d'utiliser mysql_real_escape_string() sur les données coté Bdd, pour des raisons de sécurité entre autre (sql injection).
    La doc : http://fr2.php.net/manual/fr/functio...ape-string.php


    Fais en sorte que l'insertion (ou modification) se fasse comme cela doit ce faire, et ton problème sera résolu.


    Mise à part cela, si tu tiens à créer autant de table que d'étudiant, fait un copier/coller ici de l'erreur que tu obtiens.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    je pense que je vais faire comme tu me conseilles.

    Je ne vais pas créer de nouvelles tables pour chaque étudiant, ça serait trop compliqué à exploiter après.

    Je pense que pour chaque nouveau mail inscrit par l'étudiant, je créerai une ligne avec l'adresse mail nouvelle et l'identifiant de l'étudiant dans la table mail.

    Et après il suffira d'une requête pour récupérer toutes les adresses mails d'un même étudiant.

    Je vais réécrire mon script maintenant, j'informerai sur la discussion si ça fonctionne ou pas

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    problème résolu, je te remercie en tout cas

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

Discussions similaires

  1. Problème création des tables en SQL-Server
    Par pizzaman dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/02/2012, 22h58
  2. Réponses: 2
    Dernier message: 23/07/2010, 20h40
  3. requête SQl pour récupérer les noms des tables
    Par taher84 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/07/2010, 22h07
  4. Réponses: 5
    Dernier message: 12/09/2008, 16h30
  5. Scripts PL/SQL et récupération de noms de tables
    Par sam.fet dans le forum PL/SQL
    Réponses: 1
    Dernier message: 25/07/2007, 14h21

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