Jump to content
lorik

$row['table.field']- Undefined index:

Rate this topic

Recommended Posts

Hello les génies :)

Bon, problème de CE2 :

J'ai une requete basique avec jointure sur 2 tables. Pas de Pb. Par contre, sur les 83 champs des 2 tables, j'en ai 3 qui ont le même nom.

Pour par me taper les 83 champs dans le select, avec 6 alias, je fais un basic 'select * blabla'.

 

Je recupere là aussi basiquement (j'ai un niveau très très basique :) ) avec un mysql_fetch_array.

 

Et là je coince, pour récuperer les données de mes 6 champs :
$row['table.field'] me renvoi une erreur Undefined index...

 

Bref, ma quesiton : ya une methode pour arriver à ne pas devoir se taper la saisie des 83 champs dans la requete ??

Pitié, dites moi que 'oui, t'es une quiche, ya une soluce !' pitié :D

Share this post


Link to post
Share on other sites

Salut,

Problème classique...

Tu fais ca :

Select MT1.*, MT2.*, MT1.Champ1 as Champ1_Matable1, MT2.Champ1 as Champ1_Matable2  from Matable1 MT1 INNER JOIN Matable2 MT2 ON BLABLABLA

Apres tu appelle chaque champ via son alias : print $row['Champ1_Matable1'] et print $row['Champ1_Matable2']

C'est un peu brut de décoffrage comme explication mais sur le principe c'est ca^^

Tu devrais t'en sortir facilement, si c'est pas le cas, poste ta requète et je la remanierai.

Bon courage !

Share this post


Link to post
Share on other sites

Bonjour,

 

Tout d'abord, je ne peut que te suggérer de laisser tomber mysql_*.  Ces méthodes sont déjà dépréciées en 5.X et totalement désactivées en 7.0, ce qui causera une armée de FATAL ERROR: MYSQL_FETCH_ARRAY IS NOT A FUNCTION et autres joyeusetés si ton projet venait à tourner dans un environnement 7.0.

 

Ensuite, en effet, tu as la possibilité de re-sélectionner une colonne d'une table sous un autre nom grâce au mot clé AS. Comme indiqué par BlackPage, qui te propose une solution.

 

Pour résumer:

* Emploie une requête SQL similaire à ceci:

SELECT test1.*, test2.*, test2.name AS t2name 
	FROM test1 
	INNER JOIN test2 
	ON test2.test1_id = test1.id;

* Le résultat sera semblable à celui-ci (utilisant des dummy-data)

MariaDB [db]> select test1.*, test2.*, test2.name as t2name FROM test1 INNER JOIN test2 ON test2.test1_id = test1.id;
+----+---------+--------+----+---------+----------+----------+---------+
| id | name    | potato | id | name    | pccotato | test1_id | t2name  |
+----+---------+--------+----+---------+----------+----------+---------+
|  3 | Test1-3 | C      |  1 | Test2-1 | D        |        3 | Test2-1 |
|  2 | Test1-2 | B      |  2 | Test2-2 | E        |        2 | Test2-2 |
|  1 | Test1-1 | A      |  3 | Test2-3 | F        |        1 | Test2-3 |
+----+---------+--------+----+---------+----------+----------+---------+
3 rows in set (0.01 sec)

* N'utilise plus mysql_ en PHP. Privilégie la librairie PDO qui elle est supportée, et te permet de faire l'échappement des données bien plus facilement, en orienté objet.

http://php.net/manual/en/ref.pdo-mysql.php

 

* Utilise des préfixes ou suffixes dans tes colonnes, pour chaque table. Par exemple:

MariaDB [db]> describe users;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| usr_id       | int(11)      | YES  |     | NULL    |       |
| usr_name     | varchar(30)  | YES  |     | NULL    |       |
| usr_email    | varchar(240) | YES  |     | NULL    |       |
| usr_password | varchar(150) | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

MariaDB [db]> describe vehicles;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| veh_id    | int(11)     | YES  |     | NULL    |       |
| veh_color | varchar(40) | YES  |     | NULL    |       |
| veh_year  | int(4)      | YES  |     | NULL    |       |
| veh_km    | int(11)     | YES  |     | NULL    |       |
| veh_usr   | int(11)     | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

Cela te permet, non seulement de toujours savoir à quelle table la colonne corresponds, mais cela évite tout doublon entre deux tables, le préfixe (ou suffixe) étant unique à une table.

Dans mon exemple, j'utilise un préfixe, mais les gens ont plutôt tendance à utiliser un suffixe, tel que IDUSR, NAMEUSR, EMAILUSR, PASSWORDUSR, IDVEH, COLORVEH, YEARVEH, etc.

 

Bonne journée!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...