Détecter clef primaire / auto_increment

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Détecter clef primaire / auto_increment

par Henri » 11 sept. 2006, 21:46

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.

par sadeq » 11 sept. 2006, 15:55

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 

?>

par Ryle » 11 sept. 2006, 15:14

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" ;)

par Invité » 11 sept. 2006, 14:04

je vous remercie pour tout ça !
je vais regarder ;)

par Henri » 11 sept. 2006, 13:39

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

par duj » 11 sept. 2006, 12:31

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 !

par Ryle » 11 sept. 2006, 11:37

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 :)

Détecter clef primaire / auto_increment

par duj » 11 sept. 2006, 11:34

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 !