Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/07/2007, 06h41   #1
Futur Membre du Club
 
Inscription : mars 2005
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 27
Points : 18
Points : 18
Par défaut Exploiter le résultat d'une requête DESCRIBE

Bonjour,

Je cherche à retrouver les noms des colonnes de mes tables.
(Je travaille avec pdo puis j'assigne tout ca dans une variable pour l'utiliser dans un template sous smarty)

donc je fais:
Code :
1
2
3
4
$sql = 'DESCRIBE '.$table;
$sth = $this->dbh->prepare($sql);
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC); //pdo pas plus dur qu'autre chose
Le probleme c'est que je connais pas les index "associatif" de mon tableau $result, c'est alors un peu dur d'exploiter la variable.

Quelqu'un connait-il la réponse ?

Merci.
Kioo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2007, 13h49   #2
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Bonjour,

D'abord voici un print_r(..) du tabelau $result pour une table du projet GLPI (pris pour l'exemple):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
Array
(
    [0] => Array
        (
            [Field] => ID
            [Type] => int(11)
            [Null] => NO
            [Key] => PRI
            [Default] => 
            [Extra] => auto_increment
        )
 
    [1] => Array
        (
            [Field] => name
            [Type] => varchar(255)
            [Null] => YES
            [Key] => MUL
            [Default] => 
            [Extra] => 
        )
 
    [2] => Array
        (
            [Field] => filename
            [Type] => varchar(255)
            [Null] => YES
            [Key] => 
            [Default] => 
            [Extra] => 
        )
 
    [3] => Array
        (
            [Field] => rubrique
            [Type] => int(11)
            [Null] => NO
            [Key] => MUL
            [Default] => 0
            [Extra] => 
        )
 
    [4] => Array
        (
            [Field] => mime
            [Type] => varchar(30)
            [Null] => YES
            [Key] => 
            [Default] => 
            [Extra] => 
        )
 
    [5] => Array
        (
            [Field] => date_mod
            [Type] => datetime
            [Null] => NO
            [Key] => MUL
            [Default] => 0000-00-00 00:00:00
            [Extra] => 
        )
 
    [6] => Array
        (
            [Field] => comment
            [Type] => text
            [Null] => YES
            [Key] => 
            [Default] => 
            [Extra] => 
        )
 
    [7] => Array
        (
            [Field] => deleted
            [Type] => enum('Y','N')
            [Null] => NO
            [Key] => MUL
            [Default] => N
            [Extra] => 
        )
 
    [8] => Array
        (
            [Field] => link
            [Type] => varchar(255)
            [Null] => YES
            [Key] => 
            [Default] => 
            [Extra] => 
        )
 
    [9] => Array
        (
            [Field] => notes
            [Type] => longtext
            [Null] => YES
            [Key] => 
            [Default] => 
            [Extra] => 
        )
 
    [10] => Array
        (
            [Field] => FK_users
            [Type] => int(11)
            [Null] => NO
            [Key] => MUL
            [Default] => 0
            [Extra] => 
        )
 
    [11] => Array
        (
            [Field] => FK_tracking
            [Type] => int(11)
            [Null] => NO
            [Key] => MUL
            [Default] => 0
            [Extra] => 
        )
 
)
Ensuite, un exemple dans lequel je te propose une solution... sachant que les clés du tableau associatif crée pour chaque champ sont fixes.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
	// Nom de la table à décrire 
	$table_name = 'glpi_docs';
 
	try
	{
		// Connexion à la base de données
		$db = new PDO('mysql:host=localhost;dbname=glpidb', 'root', '');
 
		// Configuration du pilote : nous voulons des exceptions
		$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
   	// Préparation de la requête SQL
		$sql = sprintf('DESCRIBE %s', $table_name); 
		$sth = $db->prepare($sql); 
		$sth->execute(); 
		$result = $sth->fetchAll(PDO::FETCH_ASSOC); 
 
		echo("<pre>"); // Pre pour garder le formattage texte (et non html)
 
		// Le tableau généré contient autant d'élements que de champs (tabelau d'index)
		// On itère donc sur l'ensemble des élément du tableau
		for($i=0;$i<count($result);$i++) {
			// Indexe du tabelau
			printf("Champ N°%s\n", $i+1);
 
			// Chaque élément contient un talbeau associatif constitué des clés:
			//  Field, Type, Null, Key, Default, Extra
			printf("\tNom du champ : %s\n", $result[$i]['Field']);
			printf("\tType du champ : %s\n", $result[$i]['Type']);
			printf("\tNull : %s\n", $result[$i]['Null']);
			printf("\tType de clé : %s\n", $result[$i]['Key']);
			printf("\tValeur par défaut : %s\n", $result[$i]['Default']);
			printf("\tExtra : %s\n", $result[$i]['Extra']);                                                  
			print("############################################\n\n");
		}
 
		echo("</pre>");
	}
	catch(Exception $e)
	{
		echo "Échec : " . $e->getMessage();
	}
?>
Ce qui donne:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
Champ N°1
	Nom du champ : ID
	Type du champ : int(11)
	Null : NO
	Type de clé : PRI
	Valeur par défaut : 
	Extra : auto_increment
############################################
 
Champ N°2
	Nom du champ : name
	Type du champ : varchar(255)
	Null : YES
	Type de clé : MUL
	Valeur par défaut : 
	Extra : 
############################################
 
Champ N°3
	Nom du champ : filename
	Type du champ : varchar(255)
	Null : YES
	Type de clé : 
	Valeur par défaut : 
	Extra : 
############################################
 
Champ N°4
	Nom du champ : rubrique
	Type du champ : int(11)
	Null : NO
	Type de clé : MUL
	Valeur par défaut : 0
	Extra : 
############################################
 
Champ N°5
	Nom du champ : mime
	Type du champ : varchar(30)
	Null : YES
	Type de clé : 
	Valeur par défaut : 
	Extra : 
############################################
 
Champ N°6
	Nom du champ : date_mod
	Type du champ : datetime
	Null : NO
	Type de clé : MUL
	Valeur par défaut : 0000-00-00 00:00:00
	Extra : 
############################################
 
Champ N°7
	Nom du champ : comment
	Type du champ : text
	Null : YES
	Type de clé : 
	Valeur par défaut : 
	Extra : 
############################################
 
Champ N°8
	Nom du champ : deleted
	Type du champ : enum('Y','N')
	Null : NO
	Type de clé : MUL
	Valeur par défaut : N
	Extra : 
############################################
 
Champ N°9
	Nom du champ : link
	Type du champ : varchar(255)
	Null : YES
	Type de clé : 
	Valeur par défaut : 
	Extra : 
############################################
 
Champ N°10
	Nom du champ : notes
	Type du champ : longtext
	Null : YES
	Type de clé : 
	Valeur par défaut : 
	Extra : 
############################################
 
Champ N°11
	Nom du champ : FK_users
	Type du champ : int(11)
	Null : NO
	Type de clé : MUL
	Valeur par défaut : 0
	Extra : 
############################################
 
Champ N°12
	Nom du champ : FK_tracking
	Type du champ : int(11)
	Null : NO
	Type de clé : MUL
	Valeur par défaut : 0
	Extra : 
############################################


Voilà ... @+
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2007, 14h16   #3
Futur Membre du Club
 
Inscription : mars 2005
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 27
Points : 18
Points : 18
Merci,

Ca ne peut être on ne peut plus complet.
Une petite question tout de même.

Code :
$sql = sprintf('DESCRIBE %s', $table_name);
Quel est l'avantage de cette forme ? sécurité....


nb: Bien vu le changement du titre, je savais pas trop quoi écrire.
Kioo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2007, 15h06   #4
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
De sécurité non c'est plus une question de lisibilité, par principe j'aime séparer les données de la présentation... je reconnais cependant que dans le cas d'un seul paramètre c'est peut-être un peu "too much"... quoique

@++
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 00h28   #5
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Note : Avec PDO, il vaut mieux utiliser une requête préparée plutôt que sprintf, qui n'apporte rien en sécurité contrairement aux requêtes préparées. Avec un driver natif il pourraît être intéressant d'utiliser sprintf pour construire les requêtes, mais avec PDO je pense que ce n'est pas adapté.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h20.


 
 
 
 
Partenaires

Hébergement Web