Vérifier si une table de base de données existe en utilisant PHP/PDO

je veux vérifier si une table avec un nom spécifique existe dans une base de données que j'ai connectée en utilisant PHP et PDO.

il doit fonctionner sur tous les backends de base de données, comme MySQL, SQLite, etc.

24
demandé sur Brian Tompsett - 汤莱恩 2009-11-11 22:29:39
la source

11 ответов

Faire:

select 1 from your_table

et puis de capture de l'erreur. Si vous n'obtenez pas d'erreur, mais que le résultat est avec une colonne contenant "1", alors la table existe.

8
répondu Milan Babuškov 2009-11-11 22:36:42
la source

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;
}

Note: PDO ne lance des exceptions que si on lui dit de le faire, par défaut il est silencieux et ne lance aucune exception. C'est pourquoi nous devons également vérifier le résultat. voir la gestion des erreurs AOP à php.net

30
répondu Esbjörn 2016-11-08 05:02:15
la source

avant de continuer, je me rends compte que c'est une solution spécifique à MySQL.

alors que toutes les solutions mentionnées ici peuvent fonctionner, j'aime (personnellement) empêcher AOP de lancer des exceptions (préférences personnelles, c'est tout).

en tant que tel, j'utilise ce qui suit pour tester la création de table à la place:

SHOW TABLES LIKE 'some_table_of_mine';

Il n'y a pas d'état d'erreur généré si la table n'existe pas, vous obtenez simplement un résultat zéro. Fonctionne rapidement et uniformément pour moi.

9
répondu Nathan Crause 2013-05-04 02:10:28
la source

dans le cadre de votre projet, créez une vue schema.

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 ensuite lancer une requête dans votre code contre la vue.

3
répondu Equistatic 2016-11-08 04:27:00
la source

Une fois que vous avez la gestion de votre base de données via PDO, vous pouvez faire ceci:

$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == 'integer';

Ou de l'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. Finalement vérifier le type de données de la valeur retournée par la dhp exec appel. C'est soit un entier, s'il y a une correspondance sur le nombre select (même si le nombre est 0, ou un booléen de false s'il n'y avait pas résultat.

je pense que cela devrait fonctionner avec tous les types de bases de données que PDO supporte, puisque la syntaxe est vraiment simple.

2
répondu targnation 2013-09-26 17:38:44
la source

vous pourriez être en mesure d'éviter d'avoir à compter sur une erreur en utilisant une requête du type "Afficher des TABLES comme 'your_table'" et puis compter les lignes. J'ai utilisé cette méthode avec succès avec MySQL et PDO mais je n'ai pas encore testé avec d'autres DBs

1
répondu Mat Barnett 2013-02-22 14:13:14
la source

vous pouvez faire une requête" select count(*) from table " à partir de php. Si elle renvoie une erreur ou une exception, la table n'existe pas. Ce pourrait être le dernier recours et je suis sûr que cela fonctionne.

Ou vous pouvez vérifier le schéma de la table directement (probablement nécessite des autorisations supplémentaires pour être fixé par l'admin)

0
répondu Sairam 2009-11-11 22:55:18
la source

je fais quelques choses dans mes applications web avec CodeIgniter pour vérifier que la base de données existe (et est utile), l'un de ces peut fonctionner:

@$this->load->database();
$v = @$this->db->version()
$tables = @$this->db->list_tables();

ajouter le @ supprimera les erreurs si vous les avez activées dans votre configuration PHP, et vérifiera les résultats de version() et list_tables() peut être utilisé non seulement pour déterminer si votre DB est autour (mais que c'est sain aussi).

0
répondu Bruce Alderson 2009-11-11 23:31:35
la source

Au début, j'utilisais la réponse acceptée, mais j'ai remarqué qu'elle ne fonctionnait pas avec des tables vides. Voici le code que j'utilise en ce moment:

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 extension pour PDO. Il va produire une erreur (et retournera false) si la table n'existe pas, mais si la table existe et/ou qu'il est vide

0
répondu Yuri 2018-06-21 17:09:07
la source

cette fonction complète est très similaire à la réponse d'esbite, mais inclut le code à protéger de L'injection SQL. De plus, il se peut que vous n'obteniez pas des résultats cohérents à partir de la réponse acceptée lorsque le tableau en question est vide.

/**
 * This function checks if the table exists in the passed PDO database connection
 * @param PDO $pdo - connection to PDO database table
 * @param type $tableName 
 * @return boolean - true if table was found, false if not
 */
function tableExists(PDO $pdo, $tableName) {
    $mrSql = "SHOW TABLES LIKE :table_name";
    $mrStmt = $pdo->prepare($mrSql);
    //protect from injection attacks
    $mrStmt->bindParam(":table_name", $tableName, PDO::PARAM_STR);

    $sqlResult = $mrStmt->execute();
    if ($sqlResult) {
        $row = $mrStmt->fetch(PDO::FETCH_NUM);
        if ($row[0]) {
            //table was found
            return true;
        } else {
            //table was not found
            return false;
        }
    } else {
        //some PDO error occurred
        echo("Could not check if table exists, Error: ".var_export($pdo->errorInfo(), true));
        return false;
    }
}
-1
répondu RightHandedMonkey 2015-01-30 00:17:13
la source

Voici ce qui a fonctionné pour moi. C'était une combinaison de plusieurs réponses:

$table_name = 'your_table_here'; 
$test = "SELECT 1 FROM " . $table_name . " LIMIT 1";
$test = $db->query($test); //$db needs to be PDO instance

if($test)
{
    return 1; //Table exists
}
else
{
    return 0; //No table in database
}
-1
répondu boomx09 2015-04-03 05:29:08
la source

Autres questions sur