trouver_table

La fonction trouver_table() (base_trouver_table_dist) est déclarée dans ecrire/base/trouver_table.php et permet d’obtenir une description d’une table SQL. Elle permet de récupérer la liste des colonnes, des clés, des jointures déclarées, et d’autres informations.

En tant que fonction surchargeable, elle s’utilise avec charger_fonction :

$trouver_table = charger_fonction('trouver_table', 'base');
$desc = $trouver_table($table, $serveur);

Ses paramètres sont :

  1. $table : le nom de la table (’spip_articles’ ou ’articles’)
  2. $serveur : optionnel, le nom de la connexion SQL utilisée, qui est par défaut celle de l’installation de SPIP.

Le tableau $desc retourné est de cette forme :

array(
	'field' => array('colonne' => 'description'),
	'key' => array(
		'PRIMARY KEY' => 'colonne',
		'KEY nom' => 'colonne' // ou 'colonne1, colonne2'
	),
	'join' => array('colonne' => 'colonne'),
	'table' => 'spip_tables'
	'id_table' => $table,
	'connexion' => 'nom_connexion',
	'titre' => 'colonne_titre AS titre, colonne_langue AS lang'
);
  • La clé field est un tableau associatif listant toutes les colonnes de la table et donnant leur description SQL,
  • key est un autre tableau listant les clés primaires et secondaires,
  • join liste les colonnes de jointures possibles, si déclarés dans la description des tables principales ou auxiliaires
  • table est le véritable nom de la table (hors préfixe : si le préfixe des tables est différent de « spip », c’est « spip_tables » qui sera tout de même retourné),
  • id_table est le paramètre $table donné,
  • connexion est le nom du fichier de connexion, si différent de celui d’installation,
  • titre est une déclaration SQL de SELECT indiquant où est la colonne titre ou où est la colonne langue (sert entre autre pour calculer les URLs) ; exemples : « titre, lang », « nom AS titre, '' AS lang »

Cette fonction met en cache le résultat de l’analyse afin d’éviter des accès intempestifs au serveur SQL. Pour forcer un recalcul de ce cache, il faut appeler la fonction avec une chaine vide :

$trouver_table = charger_fonction('trouver_table', 'base');
$desc = $trouver_table('');

Note : Lorsqu’une table est demandée sans préfixe « spip_ », c’est le nom de la table avec le préfixe donné pour le site qui sera retourné (pour peu que la table soit déclarée à SPIP). Demander une table « spip_tables » cherchera l’existence véritable de cette table (le préfixe n’est pas remplacé par celui utilisé pour le site). Dans l’avenir, une option sera probablement ajoutée à la fonction trouver_table(), comme pour sql_showtable afin de pouvoir modifier automatiquement le préfixe.

Exemple

La fonction creer_champs_extras() du plugin « Champs Extras » permet de créer les colonnes SQL décrites par les instances d’objets « ChampExtra » transmises ($c->table est le nom de la table SQL, $c->champ celui de la colonne). La fonction renvoie false si une colonne n’a pas été créée :

function creer_champs_extras($champs) {
	// la fonction met a jour les tables concernées avec maj_tables() 
	// [...] 
	// Elle teste ensuite si les nouveaux champs sont bien crees :
	// pour chaque champ a creer, on verifie qu'il existe bien maintenant !
	$trouver_table = charger_fonction('trouver_table','base');
	$trouver_table(''); // recreer la description des tables.
	$retour = true;
	foreach ($champs as $c){ 
		if ($table = table_objet_sql($c->table)) {
			$desc = $trouver_table($table);
			if (!isset($desc['field'][$c->champ])) {
				extras_log("Le champ extra '" . $c->champ . "' sur $table n'a pas ete cree :(", true);
				$retour = false;
			}
		} else {
			$retour = false;
		}
	}
	return $retour;
}

Auteur Matthieu Marcillaud Publié le : Mis à jour : 12/03/23

Traductions : English, français, Nederlands