8791 sujets

Développement web côté serveur, CMS

Bonjour

Sur un site Web, j’ai un nombre important de tables qui constituent 5 groupes ; toutes les tables d’un même groupe ont la même structure, en principe, mais un contenu différent.

Comme ces tables ont été créées au fil du temps et qu’une colonne ou une autre a été ajoutée, toujours au fil du temps, à la structure, il arrive qu’une table manque d’une colonne par mégarde.

Plutôt que de vérifier chaque table une par une, je cherche un moyen simple de vérifier que ces tables ont bien toutes leurs colonnes.

Pour le moment, je fais ça pour chaque groupe :
• Lecture de la première ligne de chaque table
• Vérification que la valeur de la dernière colonne existe, isset()
A votre avis, est-ce la bonne solution ?

Par avance merci de votre aide.

Francois
Bonjour François

francoisch a écrit :
A votre avis, est-ce la bonne solution ?

J’ai bien peur que ce ne soit pas la bonne solution.
Poste le code que tu as déjà fait, en précisant le langage serveur que tu utilises (php?), sa version ainsi que le SGBD (mySql, Postgre…) et sa version.
As-tu le nom des tables correspondant à chaque groupe? Parmi ces tables certaines sont-elles vides?
J'ai écrit ça en Php, de manière très classique:

Pour lire la première ligne:
${"requete".$numeroBase} = "SELECT * FROM ".$table." limit 1";

Pour tester si la dernière colonne de la ligne n'existe pas:
if (!isset($myrow[$nbColonne])) 	{ echo "<br>La dernière colonne n'existe pas ....


Les tables sont en MySql, le PHP est 449.

Quand une table existe, elle a souvent au moins une ligne mais elle peut aussi être vide; la dernière colonne de la première ligne, quand elle existe, peut ne pas être renseignée.

Francois
Modifié par francoisch (04 Jan 2011 - 22:19)
Je ferais comme ceci.
// Pour vérifier que la table «personne» contient bien les colonnes «id», «nom», «prenom».
$nomTable = 'personne';
$nomColonnes = sort(array('id', 'nom', 'prenom'));
$resultat = mysql_query("SELECT * FROM $nomTable"); // Le «LIMIT 1» peut être enlevé, car je crois qu’il n’accélère pas la requête.
if ($resultat && mysql_num_rows($resultat) !== 0) {
	if (sort(array_keys(mysql_fetch_assoc($resultat))) == $nomColonnes) {
		echo "La table $nomTable est valide.";
	}
	else {
		echo "La table $nomTable est invalide.";
	}
}
else {
	echo 'Erreur de lecture ou table vide.';
}


et si tu veux vérifier toutes les tables de ta base de données tu peux boucler sur le résultat de la requête
SHOW TABLES

Modifié par adrien881 (05 Jan 2011 - 14:20)
Essai fait, j'ai ce message:

Fatal error: Only variables can be passed by reference in /homez.110/toto/www/admin/verification/verificationDialogue1.php on line 44

sur cette ligne:

$nomColonnes = sort(array('sequence', 'expediteur', 'destinataire', 'message', 'heure', 'date', 'transmis')); 

A ton avis?

Francois
Je suis depuis peu sur la piste de cette commande:

SELECT COLUMN_NAME, ORDINAL_POSITION 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'ma_table'

dont le résultat pourrait utilement être comparé à la structure attendue de chaque table.

A ton avis?

Francois
Salut François,

à propos de l’erreur à la ligne
francoisch a écrit :


$nomColonnes = sort(array('sequence', 'expediteur', 'destinataire', 'message', 'heure', 'date', 'transmis')); 


Il aurait fallu plutôt que j’écrive :

$nomColonnesNonTriees = array('sequence', 'expediteur', 'destinataire', 'message', 'heure', 'date', 'transmis'));
$nomColonnes = sort($nomColonnesNonTriees); 

Smiley confused
J'ai un résultat bizarre qui doit fausser la suite.

La table $nomColonnesNonTriees s'affiche:

Array ( [0] => couleur1 [1] => couleur2 [2] => invisible [3] => libelle [4] => repertoire [5] => sequence )


Une fois triée avec:

$nomColonnes = sort($nomColonnesNonTriees);


La table $nomColonnes s'affiche:

1

alors qu'elle devrait avoir, je crois, le même contenu que la table $nomColonnesNonTriees une fois trié.

J'ai essayé en déclarant juste avant la table $nomColonnes en array(), sans résultat.

A ton avis?

Francois