Page 1 sur 1

Détecter clef primaire / auto_increment

Posté : 11 sept. 2006, 11:34
par duj
Bonjour,

j'aimerais savoir si'l est possible de détecter le nom du champs qui est clef primaire d'une table en PHP. (base MySQL)
Exemple :

Code : Tout sélectionner

Table CATEGORIE numero primary auto_increment nom
je voudrais détecter automatiquement le fait que numéro soit clef primaire et auto incrémenté.

Merci !

Posté : 11 sept. 2006, 11:37
par Ryle
Hello :)

La commande "DESC nom_table" en SQL va te retourner les informations relatives aux champs de la table (nom, type, null, clé, ...). Tu devrais y trouver les infos dont tu as besoin :)

Posté : 11 sept. 2006, 12:31
par duj
salut,

en effet la commande marche très bien sous MySQL ! je connaissais desc pour trier mais pas pour récupérer les informations !

Connais-tu un endroit ou je peux voir l'utlisation de cette commande avec PHP. J'ai regardé sur le manuel PHP pas trouvé :?

Merci !

Posté : 11 sept. 2006, 13:39
par Henri
La commande desc[ribe] nom_de_table est une commande de SQL*PLUS, l'outil interactif d'accès à Oracle. Il existe peut être dans des outils interactifs MySQL, mais ce n'est pas du SQL.

Pour accéder aux informations, il faut utiliser la commande SHOW qui fonctionne comme un SELECT

Par exemple, cette fonction qui vérifie qu'une colonne existe dans une table
function _is_column_in_table ($table, $column) {
	$colflag = false;
	$sql = "SHOW COLUMNS FROM $table";
	$rs = mysql_query($sql);
	while ($row=mysql_fetch_assoc($rs)) {
		$colname = $row["Field"];
		if ($colname == $column) {
			$colflag = true;
		}
	}
	return $colflag;
}
l'information sur les clés primaires et les autoincrément se trouve (me semble t'il) sur le SHOW COLUMNS ; mais regarde également le SHOWX TABLE

Tu peux également regarder la fonction PHP my_fetch_field

Posté : 11 sept. 2006, 14:04
par Invité
je vous remercie pour tout ça !
je vais regarder ;)

Posté : 11 sept. 2006, 15:14
par Ryle
C'est vrai que describe provient d'oracle (pas spécialement de sqlplus mais bien d'oracle vu qu'à priori n'importe quel requêteur peut l'exécuter) et a également été implémenté dans MySQL :)

Je ne connaissais pas "SHOW COLUMNS" mais apparement il ne fonctionne ni sous oracle ni sous sql server (j'ai pas de db2 sous la main mais connaissant ibm, c'est pas gagné non plus)... je note que cela fonctionne également pour MySQL, mais je ne suis du coup pas spécialement convaincu par l'argument "c'est du sql" ;)

Posté : 11 sept. 2006, 15:55
par sadeq
Sous php, on peut accèder aux attributs de champ d'une table à partir du résultat d'une requête SELECT en utilisant mysql_field_flags()

Un exemple:
<?php 
//Soit la table suivante : 
/* 
CREATE TABLE `client` ( 
  `code` int(11) NOT NULL auto_increment, 
  `nom` varchar(20) default NULL, 
  `prenom` varchar(20) default NULL, 
  `email` varchar(50) default NULL, 
  `adresse` varchar(100) default NULL, 
  `ville` varchar(50) default NULL, 
  `code_postal` int(11) default NULL, 
  `telephone` varchar(20) default NULL, 
  `code_ville` varchar(255) default NULL, 
  PRIMARY KEY  (`code`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
*/ 

//Lecture des attributs des champs 
$res = mysql_db_query("test", "select * from client", mysql_connect("localhost","root","")); 
$flags = mysql_field_flags($res, 0); //récupère les attributs du champ n°0 (premier champ 'code' de la table 'client') 
echo "<p>Attributs du champ 'code' : $flags"; 
//décomposition des attributs sous forme de tableau 
$tableau_flags = explode(' ', $flags); //les attributs sont séparés par un espace dans la chaine originale
echo "<p><pre>"; print_r($tableau_flags); echo "</pre>"; //affichage du tableau 

?>

Posté : 11 sept. 2006, 21:46
par Henri
C'est vrai que describe provient d'oracle (pas spécialement de sqlplus mais bien d'oracle vu qu'à priori n'importe quel requêteur peut l'exécuter) et a également été implémenté dans MySQL

Je ne connaissais pas "SHOW COLUMNS" mais apparement il ne fonctionne ni sous oracle ni sous sql server (j'ai pas de db2 sous la main mais connaissant ibm, c'est pas gagné non plus)... je note que cela fonctionne également pour MySQL, mais je ne suis du coup pas spécialement convaincu par l'argument "c'est du sql"
Describe est une commande de SQL*Plus ; elle a peut être été implémentée dans d'autres requêteurs. Mais il ne s'agit pas de SQL : c'est juste un raccourci qui va lancer une commande SQL, récupérer le résultat et l'afficher. Tu ne peux pas faire
oci_parse ($conn, "describe ma_table");
Tu dis que tu doutes que SHOW COLUMNS soit du SQL. Et pourtant ... Bien sûr, ce n'est pas du SQL normalisé (lequel d'ailleurs a une syntaxe tellement réduite qu'on se demande si le SQL standard existe vraiment), mais c'est le dialecte SQL parlé par MySQL. Tout comme les ordres FLASHBACK DATABASE, EXPLAIN PLAN ou encore CREATE TYPE BODY sont des ordres du dialecte SQL vu par Oracle. En plus du CREATE, DROP, SELECT, INSERT, UPDATE et DELETE, chacun a monté son propre SQL. Et encore, même les syntaxes "évoluées" de ces 6 ordres de base sont entièrement différentes d'une base à l'autre.

Voici les ordres SQL d'Oracle (chapitre 10). La commande describe n'y figure pas, pas plus que la commande SHOW. Mais on y trouve des ordres SQL qui ne tourneront pas ailleurs.

Concernant la recherche d'informations similaires sur la description des champs dans d'autres bases de données que MySQL, il n'y a aucune règle commune : chacun stocke les descriptions de tables comme il l'entend. Par exemple, sous Oracle, il faut aller faire des SELECT dans des vues du style ALL_TAB_COLUMNS, USER_TAB_COLUMNS ou USER_IND_COLUMNS.