Recuperer contenu d'une table sans connaitre sa structure

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 : Recuperer contenu d'une table sans connaitre sa structure

Re: Recuperer contenu d'une table sans connaitre sa structure

par BaLiSTiK » 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 :)

Re: Recuperer contenu d'une table sans connaitre sa structure

par BaLiSTiK » 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');

Re: Recuperer contenu d'une table sans connaitre sa structure

par BaLiSTiK » 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.

Re: Recuperer contenu d'une table sans connaitre sa structure

par Victor BRITO » 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

Recuperer contenu d'une table sans connaitre sa structure

par BaLiSTiK » 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é :).