Tester l'existence d'une table
Fermé
schlim
-
8 avril 2004 à 09:52
pymmac Messages postés 1 Date d'inscription mardi 21 avril 2015 Statut Membre Dernière intervention 21 avril 2015 - 21 avril 2015 à 01:32
pymmac Messages postés 1 Date d'inscription mardi 21 avril 2015 Statut Membre Dernière intervention 21 avril 2015 - 21 avril 2015 à 01:32
A voir également:
- Tester l'existence d'une table
- Table ascii - Guide
- Table des matières word - Guide
- Flash drive tester - Télécharger - Divers Utilitaires
- Tester son pc - Guide
- Tester composant pc - Guide
11 réponses
Les réponses ci-dessus ne sont pas bonnes, car elles considèrent qu'une table n'existe pas quand elle est vide...
La bonne solution :
function mysql_table_exists($table , $db) {
$tables=mysql_list_tables($db);
while (list($temp)=mysql_fetch_array($tables)) { if($temp == $table) { return 1; } }
return 0;
}
La bonne solution :
function mysql_table_exists($table , $db) {
$tables=mysql_list_tables($db);
while (list($temp)=mysql_fetch_array($tables)) { if($temp == $table) { return 1; } }
return 0;
}
gregouille73
Messages postés
1
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
23 avril 2010
6
23 avril 2010 à 08:49
23 avril 2010 à 08:49
Petite modification lorsque l'on utilise la classe PDO
$bdd = new PDO("mysql:host=localhost;dbname=$db", 'root', 'password');
$requete = 'SHOW TABLES FROM '. $db . ' LIKE \''. $table. '\'';
$exec = $bdd ->query($requete);
$exec->rowCount();
$bdd = new PDO("mysql:host=localhost;dbname=$db", 'root', 'password');
$requete = 'SHOW TABLES FROM '. $db . ' LIKE \''. $table. '\'';
$exec = $bdd ->query($requete);
$exec->rowCount();
ludvo
Messages postés
65
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
5 août 2004
7
8 avril 2004 à 10:06
8 avril 2004 à 10:06
Hello
Je ne sais pas s'il y a un fonction qui fait ca mais tu peux faire une requete toute bete (je ne sais pas si ca peut marcher sous MySql) :
select count(table_name) from user_tables;
where table_name ="nom de ta table";
group by table_name;
Si ca te renvoie 0, elle n'existe pas sinon elle existe
vala :)
----------
A computer lets you make more mistakes faster than any inven
Je ne sais pas s'il y a un fonction qui fait ca mais tu peux faire une requete toute bete (je ne sais pas si ca peut marcher sous MySql) :
select count(table_name) from user_tables;
where table_name ="nom de ta table";
group by table_name;
Si ca te renvoie 0, elle n'existe pas sinon elle existe
vala :)
----------
A computer lets you make more mistakes faster than any inven
flokocha
Messages postés
1510
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
10 octobre 2015
281
8 avril 2004 à 10:15
8 avril 2004 à 10:15
Ou bien tu peux essayer
Ca devrait fonctionner ça non?
mysql_query("SELECT * FROM tatable") or die ("La table n'existe pas")
Ca devrait fonctionner ça non?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
jipegz
Messages postés
2
Date d'inscription
samedi 4 août 2007
Statut
Membre
Dernière intervention
9 août 2007
4 août 2007 à 19:55
4 août 2007 à 19:55
flokocha, je te remercie, tu viens de me sortir d'une journée de recherche presque complète. :)
aurora45
Messages postés
2
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
25 juin 2011
24 juin 2011 à 20:28
24 juin 2011 à 20:28
Bonjour
Je vous propose :
function isTable($base,$table,$champ){
$b=sqlConnect($base);if(!$b)return null;
$sql="SELECT MAX('".$champ."') FROM '".$table."'";$res=mysql_query($sql);
if(mysql_errno($b))return false;
$t=array();$t=mysql_fetch_array($res, MYSQL_NUM);
if(!is_bool($res))mysql_free_result($res);
return $t[0]+1;
}
$base : nom de la base
$table = nom de la table
$champ : nom du champ à tester
Je fais cela sur le champ 'index' pour mes tables où j'incrémente de 1 en 1 l'index, ce qui me permet d'obtenir l'index dont je vais probablement avoir besoin dans la suite de mon algorithme principal.
L'objectif est de mettre une requête sql qui nous sera utile par la suite afin de ne pas utiliser des ressources inutilement.
Je vous propose :
function isTable($base,$table,$champ){
$b=sqlConnect($base);if(!$b)return null;
$sql="SELECT MAX('".$champ."') FROM '".$table."'";$res=mysql_query($sql);
if(mysql_errno($b))return false;
$t=array();$t=mysql_fetch_array($res, MYSQL_NUM);
if(!is_bool($res))mysql_free_result($res);
return $t[0]+1;
}
$base : nom de la base
$table = nom de la table
$champ : nom du champ à tester
Je fais cela sur le champ 'index' pour mes tables où j'incrémente de 1 en 1 l'index, ce qui me permet d'obtenir l'index dont je vais probablement avoir besoin dans la suite de mon algorithme principal.
L'objectif est de mettre une requête sql qui nous sera utile par la suite afin de ne pas utiliser des ressources inutilement.
Salut, j'ai une solution qui marche avec MySQL et qui est TRES rapide...
car il faut absolument proscrire les tests du genre SELECT * FROM matable
qui sont trop gourmands en ressource...
car il faut absolument proscrire les tests du genre SELECT * FROM matable
qui sont trop gourmands en ressource...
/** * Permet de tester la présence d'une table * @param string $table le nom de la table (avec ou sans le préfix de la base) * @return boolean */ function table_exists($table) { // reformatage du nom de la table if (strpos($table,'.')===false) $table = '''.trim($table,''').'''; // simplement le nom de la table sans la base else { list($nom_base,$nom_table) = explode('.',$table); $nom_base = '''.trim($nom_base,''').'''; $nom_table = '''.trim($nom_table,''').'''; $table = $nom_base .'.'. $nom_table; // le nom de la table avec le préfix de la base } // test si on a déjà voulu connaitre la présence de cette table static $presence_des_tables; if (empty($presence_des_tables)) $presence_des_tables = array(); if (in_array($table,$presence_des_tables)) return $presence_des_tables[ $table ]; // test la présence de la table $sql = "SHOW COLUMNS FROM $table"; if (mysql_query($sql)) { // ça a marché donc la table existe $presence_des_tables[ $table ] = true; return true; } else { // ça a planté donc la table n'exite pas $presence_des_tables[ $table ] = false; return false; } }
aurora45
Messages postés
2
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
25 juin 2011
25 juin 2011 à 17:22
25 juin 2011 à 17:22
bonjour,
c'est une autre solution, meilleure, lorsque l'on n'a besoin d'aucun résultat dans la suite de l'algorithme.
Je ferais les modifications suivantes :
. isset($presence_des_tables[$table]) au lieu du in_array
. je laisserais la fonction en multi-base, parce que c'est bien utile de gérer plusieurs bases (c'est assez pratique de gérer plusieurs bases au lieu d'une)
attention a bien gérer le $presence_tables lors de la suppression de la table. Une petite erreur et c'est fini. Attention au conflit entre un internaute qui utilise le logiciel et la personne qui réalise la maintenance qui supprimerait/renomerait intentionnellement ou non la table : çà ce n'est pas gérable d'un point de vue logiciel. Il vaut peut-être mieux consommer de la ressource en faisant plusieurs fois le show columns.
Je retiens le show_colums pour une isTable econome.
c'est une autre solution, meilleure, lorsque l'on n'a besoin d'aucun résultat dans la suite de l'algorithme.
Je ferais les modifications suivantes :
. isset($presence_des_tables[$table]) au lieu du in_array
. je laisserais la fonction en multi-base, parce que c'est bien utile de gérer plusieurs bases (c'est assez pratique de gérer plusieurs bases au lieu d'une)
attention a bien gérer le $presence_tables lors de la suppression de la table. Une petite erreur et c'est fini. Attention au conflit entre un internaute qui utilise le logiciel et la personne qui réalise la maintenance qui supprimerait/renomerait intentionnellement ou non la table : çà ce n'est pas gérable d'un point de vue logiciel. Il vaut peut-être mieux consommer de la ressource en faisant plusieurs fois le show columns.
Je retiens le show_colums pour une isTable econome.
Et que pensez-vous de :
$sql="CREATE TABLE IF NOT EXISTS ".$bdtbl. " LIKE _abonnes2;";
mysql_query($sql) or die(mysql_error());
$sql="CREATE TABLE IF NOT EXISTS ".$bdtbl. " LIKE _abonnes2;";
mysql_query($sql) or die(mysql_error());
pymmac
Messages postés
1
Date d'inscription
mardi 21 avril 2015
Statut
Membre
Dernière intervention
21 avril 2015
21 avril 2015 à 01:32
21 avril 2015 à 01:32
perso je dirais qu'un num_rows suffit.
$s = mysql_query("SHOW TABLES LIKE 'MaTable'");
if (mysql_num_rows($s) == 1) {
// la table existe
}
else {
// la table n'existe pas
}
29 juil. 2007 à 03:39
en fait pour que le test à l'aide d'un SELECT fonctionne, il aurait fallu tester le code d'erreur MySQL retourné. Il me semble que c'est 2 si la table n'existe pas.
Ta petite fonction est bien (déjà c'est réutilisable et tout), mais la fonction PHP est dépréciée : https://www.php.net/manual/fr/function.mysql-list-tables.php
Ils suggèrent d'utiliser la requête :
SHOW TABLES [FROM db_name] [LIKE 'pattern']
Ce qui nous donnerait ta fonction actualisée :
++
Edit : en fait j'ai relu plus attentivement et le SHOW TABLE est la bonne syntaxe de la solution proposé en 1. Quant au 2, il n'aurait pas renvoyé d'erreur si la table était vide, mais par contre il aurait considéré que la table n'existe pas alors que la requête aurait pu échouer pour mille autres raisons :)
6 avril 2008 à 12:27
je découvre cette solution à ce problème qui m'intéresse.
Et j'aurais voulu savoir (car je débute aussi)
s'il possible d'écrire ceci?
Merci à bientôt
24 mars 2012 à 11:24