web-dev-qa-db-fra.com

Comment puis-je vérifier si une table MySQL existe avec PHP?

Aussi simple que cela paraisse en théorie, j'ai fait pas mal de recherches et j'ai du mal à comprendre.

Comment puis-je vérifier si une table MySQL existe et si elle fait quelque chose. (Je suppose qu'une simple déclaration php si/else pourrait fonctionner pour cela)

Y a-t-il un moyen de faire cela?

Voici ce que j'ai fait avec la réponse de cwallenpoole:

mysql_connect("SERVER","USERNAME","PASSWORD");
mysql_select_db('DATABASE');

$val = mysql_query('select 1 from `TABLE`');

if($val !== FALSE)
{
   print("Exists");
}else{
   print("Doesn't exist");
}
31
John Doe
// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `table_name` LIMIT 1');

if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
}

Certes, il s'agit davantage de Pythonic que de l'idiome PHP, mais d'un autre côté, vous n'avez pas à vous soucier de gérer une quantité excessive de données supplémentaires.

Modifier

Donc, cette réponse a été notée au moins deux fois à partir du moment où j'écris ce message. En supposant que j’ai commis une erreur gigantesque, j’y suis allé et j’ai passé quelques points de repère , et c’est ce que j’ai trouvé. Ma solution est 10% plus rapide que l’alternative la plus proche lorsque le tableau n’existe pas. plus de 25% plus rapide lorsque la table existe:

:::::::::::::::::::::::::BEGINNING NON-EXISTING TABLE::::::::::::::::::::::::::::::
23.35501408577 for bad select
25.408507823944 for select from schema num rows -- calls mysql_num_rows on select... from information_schema.
25.336688995361 for select from schema fetch row -- calls mysql_fetch_row on select... from information_schema result
50.669058799744 for SHOW TABLES FROM test
:::::::::::::::::::::::::BEGINNING EXISTING TABLE::::::::::::::::::::::::::::::
15.293519973755 for good select
20.784908056259 for select from schema num rows
21.038464069366 for select from schema fetch row
50.400309085846 for SHOW TABLES FROM test

J'ai essayé d'exécuter ceci contre DESC, mais j'avais un délai d'attente après 276 secondes (24 secondes pour ma réponse, 276 pour ne pas terminer la description d'une table non existante).

Pour faire bonne mesure, je compare un schéma avec seulement quatre tables et il s’agit d’une installation presque neuve de MySQL (c’est la seule base de données à ce jour). Pour voir l'exportation, regardez ici .

ET DE PLUS

Cette solution particulière est également plus indépendante de la base de données, car la même requête fonctionnera dans PgSQL et Oracle.

ENFIN

mysql_query() renvoie FALSE pour les erreurs qui ne sont pas "cette table n'existe pas".

Si vous devez vous assurer que la table n’existe pas, utilisez mysql_errno() pour obtenir le code d’erreur et comparez-le au erreurs MySQL } approprié.

64
cwallenpoole

Le moyen le plus simple d’atteindre cet objectif dans PHP est d’utiliser simplement l’instruction DESCRIBE.

if(mysql_query("DESCRIBE `table`")) {
    // Exists
}

Je ne sais pas pourquoi d'autres personnes postent des requêtes compliquées pour un problème aussi simple.

23
Aleksey Korzun
$res = mysql_query("SELECT table_name FROM information_schema.tables WHERE table_schema = '$databasename' AND table_name = '$tablename';");

Si aucun enregistrement n'est renvoyé, il n'existe pas.

13
Nathan Romano

Vérification de la table de 125 microsecondes

.000125 sec. (125µs)

mysql_unbuffered_query("SET profiling = 1");  // for profiling only

@mysql_unbuffered_query("SELECT 1 FROM `table` LIMIT 1 ");
if (mysql_errno() == 1146){

 // NO EXISTING TABLE CODE GOES HERE

}
elseif(mysql_errno() > 0){

  echo mysql_error();    

}

$results = mysql_query("SHOW PROFILE");  // for profiling only

Le temps d'exécution, mesuré avec le profilage mysql, lorsqu'une table existe ou non, est d'environ .000125 sec. (125µs)  

Le LIMIT 1 est important pour la vitesse. Cela minimise les temps de l'état de la requête Résultat de tri et Envoi de données. Et la taille de la table n'est pas un facteur. 

J'utilise toujours une requête sans tampon quand aucun résultat n'est requis. 

PROFIL RESULTATS LORSQUE LE TABLEAU N'EXISTE PAS

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000025  
checking permissions  0.000006  
Opening tables        0.000065  
query end             0.000005  
closing tables        0.000003  
freeing items         0.000013  
logging slow query    0.000003  
cleaning up           0.000003  
TOTAL                 0.000123  <<<<<<<<<<<< 123 microseconds

QUAND EXISTE TABLE  

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000024
checking permissions  0.000005
Opening tables        0.000013
System lock           0.000007
init                  0.000006
optimizing            0.000003
statistics            0.000009
preparing             0.000008
executing             0.000003
Sending data          0.000019
end                   0.000004
query end             0.000004
closing tables        0.000006
freeing items         0.00001
logging slow query    0.000003
cleaning up           0.000003
TOTAL                 0.000127 <<<<<<<<<<<< 127 microseconds
10
Misunderstood
mysql_query("SHOW TABLES FROM yourDB");
//> loop thru results and see if it exists
//> in this way with only one query one can check easly more table 

ou mysql_query("SHOW TABLES LIKE 'tblname'");

N'utilisez pas mysql_list_tables(); car il est obsolète

9
dynamic

Encore plus vite qu'une mauvaise requête:

SELECT count((1)) as `ct`  FROM INFORMATION_SCHEMA.TABLES where table_schema ='yourdatabasename' and table_name='yourtablename';

De cette façon, vous pouvez simplement récupérer un champ et une valeur. .016 secondes pour mon système plus lent.

5
JasonMichael

AFFICHER LES TABLEAUX COMME 'NomTable'

Si vous avez des résultats, la table existe.

Pour utiliser cette approche dans le PDO:

$pdo         = new \PDO(/*...*/);
$result      = $pdo->query("SHOW TABLES LIKE 'tableName'");
$tableExists = $result !== false && $result->rowCount() > 0;

Pour utiliser cette approche avec DEPRECATED mysql_query

$result      = mysql_query("SHOW TABLES LIKE 'tableName'");
$tableExists = mysql_num_rows($result) > 0;
4
Kevin Nelson

C'était déjà posté mais ici c'est avec PDO (même requête) ...

$connection = new PDO ( "mysql:Host=host_db; dbname=name_db", user_db, pass_db );

if ($connection->query ("DESCRIBE table_name"  )) {
    echo "exist";
} else {
    echo "doesn't exist";
}

Fonctionne comme un charme pour moi ....

Et voici une autre approche (je pense que c'est plus lent) ...

if ($connection->query ( "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name' AND table_name ='tbl_name'" )->fetch ()) {
    echo "exist";
} else {
    echo "doesn't exist";
}

Vous pouvez aussi jouer avec cette requête:

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'

Je pense que cela a été suggéré d'utiliser dans la page mysql.

3
I_Minkov

N'UTILISEZ JAMAIS PLUS MYSQL. Si vous devez utiliser mysqli mais que PDO est préférable:

$pdo = new PDO($dsn, $username, $pdo); // proper PDO init string here
if ($pdo->query("SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name'")->fetch()) // table exists.
2
chx

Ou vous pouvez utiliser 

show tables where Tables_in_ {insert_db_name} = 'Nomtable';

0
DanielM

Vous pouvez utiliser de nombreuses requêtes différentes pour vérifier si une table existe. Vous trouverez ci-dessous une comparaison entre plusieurs:

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');

mysql_query("DESCRIBE `table_name`");  
70000   rows: 24ms  
1000000 rows: 24ms  
5000000 rows: 24ms

mysql_query('select 1 from `table_name`');  
70000   rows: 19ms  
1000000 rows: 23ms  
5000000 rows: 29ms

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');  
70000   rows: 18ms  
1000000 rows: 18ms  
5000000 rows: 18ms  

Ces repères ne sont que des moyennes:

0
Mantra