Recuperer contenu d'une table sans connaitre sa structure

Eléphant du PHP | 398 Messages

20 janv. 2010, 15:13

Bonjour,
Dans le développement de mon blog, je souhaite développer une méthode générique qui récupère le contenu d'une table dont le nom est envoyé en parametre mais dont on ne connait pas le nom des champs.
Cette requete SQL sera utilisé uniquement dans les tables ayant une clé primaire et un champ. Le truc, c est que le champ 1 et le champ 2 sont intitulé "code" et "libelle".

Si je veux lister ma table "table1" avec les champs "code_tab1" et "lib_tab1" ou ma table "table2" avec les champs "code_tab2" et "lib_tab2" ,
je dois recuperer en sortie SQl :

| code | libelle
--------------------------
| 1 | truc
| 2 | test
| 3 | pwet
| 4 | honk

Mon but est de créée une requete SQL la plus générique possible qui soit, en indiquant UNIQUEMENT le nom de la table en paramètre.
Il faut que ce soit compatible MySQL et Postgresql.

(ça commence à faire beaucoup de contrainte...)

En cherchant sur le net, j ai trouvé comment recuperer les champs d'une table mais pas en leur donnant un label ( seclect ... as ...)

Donc est-ce possible ?

Merci d'avance ^^. Si vous voulez plus de précision, demander moi, je ne suis pas sure de m'être bien exprimé :).
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Mammouth du PHP | 2937 Messages

20 janv. 2010, 15:43

As-tu essayé ceci ?
SELECT * FROM nom_de_ta_table
Soit dit en passant, si tu ne connais pas la structure de la table en question, tu peux la connaître en effectuant la requête suivante :
SHOW CREATE TABLE nom_de_ta_table

Eléphant du PHP | 398 Messages

20 janv. 2010, 16:53

Justement non, ce n'est pas si simple que ça sinon je n'aurai pas posté.
Je veux que le premier champ récupéré s'intitule "code" et le deuxieme "libelle", peut importe la table que l'on entre en paramètre.
Je pense qu'il faut dans une sous-requete, recuperer les deux champs, les nommer par les alias "code" et "libelle", puis ensuite recuperer le contenu.
Je viens de tester le "SHOW CREATE TABLE" il ne passe pas avec postgreSQL (pas testé avec MySQL).

Mon but est d'utiliser cette requete SQL pour faire des listes (tableau PHP) contenant les données de la table envoyé en paramètre.
Ma requete sera incluse dans la fonction :
 	function listeTable($table){
 		
 		$tabTable = "";
 		
 		//traitement requete sql
 		$this->m_nAccessBD->connexion();
 		$sql = "SELECT * FROM $table";
 		 /**
 		  * select req.COLUMN_NAME as code FROM(
	select c.COLUMN_NAME
	from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
	where pk.TABLE_NAME = 'r_type_charset'
	and CONSTRAINT_TYPE = 'PRIMARY KEY'
	and c.TABLE_NAME = pk.TABLE_NAME
	and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME)req 
 		  * 
 		  * 
 		  */
 		
 		$this->req = $this->m_nAccessBD->requete($sql);
 		$this->m_nAccessBD->deconnexion();
 		
 		//recuperation des données
 		$tabTable = array();
 		$tabFinal = array();
 		
 		$tabTable = $this->m_nAccessBD->recupDonnesRequete($this->req);
		
 		foreach($tabTable as $key => $tab){
                            //traitement en attente
 		}

 		return $tabFinal;
 	}
Apres n'importe ou dans mon code, si je fais un :
$tab = $this->listeTable('ma_table');
ça me retournera quelquechose comme ça :
$tab = array(1 => 'truc', 2 => 'test'...);
C'est un peu tordu mais j'ai pas trouvé mieux pour recuperer le contenu d'une table de façon générique.
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 398 Messages

25 janv. 2010, 14:44

Je vais utiliser une fonction, mais le probleme reste le même, je ne sais pas comment taper la requete SQL
DROP FUNCTION lister_table(character varying);

CREATE OR REPLACE FUNCTION lister_table(IN nom_table character varying, OUT code integer, OUT libelle character varying)
 RETURNS SETOF record AS
$BODY$
SELECT * FROM $1;
$BODY$
  LANGUAGE 'sql' VOLATILE
  COST 100
  ROWS 1000;
Il n accepte pas $1 en paramètre de nom de table. Une idée de comment sauter ce problème ?

Apres j'aurais juste à faire un
select * from lister_table('ma_table');
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 398 Messages

29 janv. 2010, 11:12

J ai finalement abandonné cette idée, et j ai fais une classe PHP :
<?php
	class rType extends appControl {
		
		private $m_nAccessBD;
		
		protected $table;
		protected $code;
		protected $libelle; 
		
		function __construct(){
			//$this->table = $table;
			//$this->champ = $champ;
			$this->m_nAccessBD = new connexionBD();
		}
		
		public function __setTable($table){ $this->table = $table; }
		public function __setCode($code){ $this->code = $code; }
		public function __setLibelle($libelle){ $this->libelle = $libelle; }
		
		public function __getTable(){ return $this->table; }
		public function __getCode(){ return $this->code; }
		public function __getLibelle(){ return $this->libelle; }
	
		public function __toString(){
			return 'ToString : [ table : ' . $this->__getTable() . 
					' - Code : ' . $this->__getCode() .' - ' .
					' - Libelle : ' . $this->__getLibelle() .' ]';
		}
		
		function __destruct(){
			unset($this);
		}
		
		function affichTable(){
			try{
				$this->m_nAccessBD->connexion();
				
				$sql = "SELECT 
							" . $this->__getCode() . " as code, 
							" . $this->__getLibelle() . " as libelle
						FROM " . $this->__getTable() . " 
						ORDER BY ".$this->__getLibelle()." ASC";
				
				if(DEBUG == 2) echo '<br />' . $sql;
				$this->req = $this->m_nAccessBD->requete($sql);
				$this->tab = $this->m_nAccessBD->recupDonnesRequete($this->req);
				$tabFinal = array();
				foreach($this->tab as $key => $tab){
					$tabFinal[$tab->code] = $tab->libelle;
				}
				if(DEBUG == 1){
					echo '<pre>';
					print_r($tabFinal);
					echo '</pre>';
				}
				$this->m_nAccessBD->deconnexion();
				return $tabFinal;
			}catch(MyException $e){
				echo $e->getError();
			}
		}
}
?>
et l'instance dans ma vue :
<?php
/**
 * Cette page retourne dans un tableau chaque contenu de table r_type_maTable
 */
try{
	//Instance de l'objet' 
	 $oRType = new rType();
	
	//Pour les charset
	$oRType->__setTable('r_type_charset');
	$oRType->__setCode('code_charset');
	$oRType->__setLibelle('lib_charset');
	$aListeCharset = $oRType->affichTable();
	
	//Pour les theme
	
	if(DEBUG == 1) echo $oRType;
	
}catch(MyException $e){
	echo $e->getError();
}
?>
Et ça fonctionne donc problème résolu :)
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe