Je souhaite vérifier si une table portant un nom spécifique existe dans une base de données à laquelle je me suis connecté à l'aide de PHP et de PDO.
Il doit fonctionner sur toutes les bases de données, comme MySQL, SQLite, etc.
Faire:
select 1 from your_table
et ensuite attraper l'erreur. Si vous n'obtenez aucune erreur, mais si la colonne de résultats contient 1, la table existe.
Voici une fonction complète pour vérifier si une table existe.
/**
* Check if a table exists in the current database.
*
* @param PDO $pdo PDO instance connected to a database.
* @param string $table Table to search for.
* @return bool TRUE if table exists, FALSE if no table found.
*/
function tableExists($pdo, $table) {
// Try a select statement against the table
// Run it in try/catch in case PDO is in ERRMODE_EXCEPTION.
try {
$result = $pdo->query("SELECT 1 FROM $table LIMIT 1");
} catch (Exception $e) {
// We got an exception == table not found
return FALSE;
}
// Result is either boolean FALSE (no table found) or PDOStatement Object (table found)
return $result !== FALSE;
}
Remarque: PDO ne lève les exceptions que si on le lui dit. Par défaut, il est silencieux et ne lève aucune exception. C’est la raison pour laquelle nous devons également vérifier le résultat. Voir la gestion des erreurs PDO sur php.net
Avant de poursuivre, je réalise que cette solution est spécifique à MySQL.
Bien que toutes les solutions mentionnées ici puissent fonctionner, j’aimerais (personnellement) garder PDO de ne pas lancer d’exceptions (préférence personnelle, c’est tout).
En tant que tel, j'utilise plutôt les éléments suivants pour tester la création de table:
SHOW TABLES LIKE 'some_table_of_mine';
Si la table n'existe pas, aucun état d'erreur n'est généré. Vous obtenez simplement un résultat nul. Travaille vite et régulièrement pour moi.
Dans le cadre de votre projet, créez une vue de schéma.
Pour Oracle, ce serait quelque chose comme
SELECT TABLE_NAME FROM ALL_TABLES
Pour Mysql:
SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'mydbname'
ETC..
Et puis exécutez une requête dans votre code contre la vue.
Une fois que vous avez votre handle de base de données via PDO, vous pouvez le faire:
$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == 'integer';
Ou envelopper dans une fonction.
J'ai essayé de jouer avec try/catch au début, mais même si la table n'existait pas, il n'y avait pas d'exception. Enfin, nous avons fini par vérifier le type de données de la valeur renvoyée par l'appel exec de dbh. C'est soit un entier, s'il y a une correspondance sur le compte sélectionné (même si le compte est 0, ou un booléen de false s'il n'y a pas de résultat.
Je pense que cela devrait fonctionner avec tous les types de bases de données pris en charge par PDO, car la syntaxe est très simple.
Vous pourrez peut-être éviter de vous fier à une erreur en utilisant une requête du type "AFFICHER LES TABLES COMME" votre_table "", puis en comptant les lignes. J'utilise cette méthode avec succès avec MySQL et PDO, mais je n'ai pas encore testé avec d'autres bases de données.
Je fais quelques choses dans mes applications Web avec CodeIgniter pour vérifier que la base de données existe (et est utile), toutes ces choses peuvent fonctionner:
@$this->load->database();
$v = @$this->db->version()
$tables = @$this->db->list_tables();
L'ajout du @
supprimera les erreurs si vous les avez activées dans votre configuration PHP, et la vérification des résultats de version()
et list_tables()
peut être utilisée pour déterminer non seulement si votre base de données est active (mais également saine).
Vous pourriez faire une requête "select count (*) from table" de php. S'il renvoie une erreur ou une exception, la table n'existe pas. Cela pourrait être le dernier recours possible et je suis sûr que cela fonctionne.
Ou, vous pouvez vérifier directement la table de schéma (nécessite probablement que des autorisations supplémentaires soient définies par l'administrateur)
Au début, j’utilisais la réponse acceptée, mais j’ai remarqué qu’il échouait avec des tables vides. Voici le code que j'utilise actuellement:
function DB_table_exists($db, $table){
GLOBAL $db;
try{
$db->query("SELECT 1 FROM $db.$table");
} catch (PDOException $e){
return false;
}
return true;
}
Ce code est un extrait de ma classe d'extension pour PDO. Il produira une erreur (et retournera false) si la table n'existe pas, mais réussira si la table existe et/ou est vide