8722 sujets

Développement web côté serveur, CMS

Bonjour,

Ça fait 2 jours que je cherche en vain. J'ai un problème car je ne sais par comment appeler un champ par son nom sur une table précise alors que deux de mes tables ont un champ avec ce même nom. Je m'explique :

J'ai 3 tables : pro_mbr, pro_stt et pro_cmn. Les 2 dernières tables ont chacune un champ nom.


$ReqMBR = MYSQLI_QUERY ($BDD,
"SELECT * FROM `pro_mbr`
INNER JOIN `pro_stt` ON `pro_mbr`.`str_stt` = `pro_stt`.`stt`
INNER JOIN `pro_cmn` ON `pro_mbr`.`geo_cmn` = `pro_cmn`.`cmn`
ORDER BY `pro_mbr`.`dat_mdf` DESC LIMIT 0 , 5"
) OR DIE (MYSQLI_ERROR ($BDD));

WHILE ($ResMBR = MYSQLI_FETCH_ARRAY ($ReqMBR, MYSQLI_ASSOC)) {ECHO $ResMBR['nom'];}


Ce code me renvoie bien une valeur, mais il s'agit du champs nom qui est dans la table pro_cmn, or moi je veux celui qui est dans la table pro_stt !

Je me doute bien qu'il faut préciser la table mais je ne sais pas comment faire. J'ai essayé :


ECHO $ResMBR['pro_stt.nom'];
ECHO $ResMBR['pro_stt']['nom'];
ECHO $ResMBR['pro_stt'].['nom'];


J'ai aussi tenté d'utiliser les alias, d'enlever les apostrophes, de les remplacer par " ou `, rien ne fonctionne...

Bien sûr je pourrait changer le * de la requête par des table.champ ou même changer le MYSQLI_ASSOC par MYSQLI_NUM et utiliser les index numérotés, mais la base a énormément de champs et d'autres pourraient s'ajouter (pas forcement à la fin), je voudrais vraiment appeler les champs par leurs noms. Comment faire ?

Merci.
Modifié par AlohaThomas (03 Jul 2014 - 12:41)
Hello,

Il faut que tu préfixe le nom de tes champs dans ta requête avec le nom de ta table et que tu vires le " SELECT * ":

SELECT pro_stt.nom , pro_cmn.nom FROM ...


Bye,
Yokii
Oui, je le sais comme je le précise dans le dernier paragraphe... Mais il n'existe pas d'autre solution ? J'ai vraiment beaucoup de champ et je dois tous les afficher. Je tiens vraiment à les appeler par leurs noms de colonne et éviter les :


ECHO $ResMBR[0];
ECHO $ResMBR[1];
ECHO $ResMBR[2];
...
ECHO $ResMBR[53];


C'est vraiment illisible et je dois compter à chaque fois dans mon SELECT pour savoir à quoi correspond chaque index.

Merci.
Modifié par AlohaThomas (03 Jul 2014 - 12:22)
Ce n'est pas PHP le soucis, c'est que dans ta requête, le SGBD ne sait pas dans quelle table se trouve le champ "nom".

Si tu veux absolument garder ton select *, renomme tes champs, je ne vois que ça.
Modifié par Yokii (03 Jul 2014 - 13:21)
Ça fonctionne, mais il faut mettre l'astérisque au début sinon la requête plante :


$ReqMBR = MYSQLI_QUERY ($BDD,
"SELECT *, `pro_stt`.`nom` AS toto, `pro_cmn`.`nom` AS titi FROM `pro_mbr`
INNER JOIN `pro_stt` ON `pro_mbr`.`str_stt` = `pro_stt`.`stt`
INNER JOIN `pro_cmn` ON `pro_mbr`.`geo_cmn` = `pro_cmn`.`cmn`
ORDER BY `pro_mbr`.`dat_mdf` DESC LIMIT 0 , 5"
) OR DIE (MYSQLI_ERROR ($BDD));

WHILE ($ResMBR = MYSQLI_FETCH_ARRAY ($ReqMBR, MYSQLI_ASSOC)) {
ECHO $ResMBR['toto'];
ECHO $ResMBR['titi'];}


Merci à tous !
Modifié par AlohaThomas (03 Jul 2014 - 15:31)