web-dev-qa-db-fra.com

MySQL vérifie si une table existe sans lever d'exception

Quel est le meilleur moyen de vérifier si une table existe dans MySQL (de préférence via PDO en PHP) sans lever d'exception. Je n'ai pas envie d'analyser les résultats de "SHOW TABLES LIKE", etc. Il doit y avoir une sorte de requête booléenne?

121
clops

Je ne connais pas la syntaxe PDO pour cela, mais cela semble assez simple:

$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;
198
nickf

Si vous utilisez MySQL 5.0 et versions ultérieures, vous pouvez essayer:

SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '[table name]';

Tous les résultats indiquent que la table existe.

De: http://www.electrictoolbox.com/check-if-mysql-table-exists/

39
Michael Todd

En utilisant mysqli, j'ai créé la fonction suivante. En supposant que vous avez une instance de mysqli appelée $ con.

function table_exist($table){
    global $con;
    $table = $con->real_escape_string($table);
    $sql = "show tables like '".$table."'";
    $res = $con->query($sql);
    return ($res->num_rows > 0);
}

J'espère que ça aide.

Attention: tel que suggéré par @jcaron, cette fonction pourrait être vulnérable aux attaques par sqlinjection. Assurez-vous donc que votre $tablevar est propre ou encore mieux utilisez des requêtes paramétrées.

8
Falk

Ceci est affiché simplement si quelqu'un vient à la recherche de cette question. Même si sa été un peu répondu. Certaines réponses le rendent plus complexe que nécessaire.

Pour mysql * j'ai utilisé:

if (mysqli_num_rows(
    mysqli_query(
                    $con,"SHOW TABLES LIKE '" . $table . "'")
                ) > 0
        or die ("No table set")
    ){

En AOP j'ai utilisé:

if ($con->query(
                   "SHOW TABLES LIKE '" . $table . "'"
               )->rowCount() > 0
        or die("No table set")
   ){

Avec cela, je pousse simplement la condition else dans ou. Et pour mes besoins, je n'ai besoin que de mourir. Bien que vous puissiez définir ou à d'autres choses. Certains pourraient préférer le if/else if/else. Ce qui est alors à supprimer ou et puis fournir si/else si/else.

3
Esoterica

Voici la solution que je préfère lorsque j'utilise des procédures stockées. Fonction mysql personnalisée pour vérifier que la table existe dans la base de données actuelle.

delimiter $$

CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE _exists  TINYINT(1) DEFAULT 0;

    SELECT COUNT(*) INTO _exists
    FROM information_schema.tables 
    WHERE table_schema =  DATABASE()
    AND table_name =  _table_name;

    RETURN _exists;

END$$

SELECT TABLE_EXISTS('you_table_name') as _exists
3
erandac

Dans la mesure où "Afficher les tables" peut être lent sur des bases de données plus importantes, je vous recommande d'utiliser "DESCRIBE" et de vérifier si vous obtenez true/false à la suite.

$tableExists = mysqli_query("DESCRIBE `myTable`");
2
Martin Lisicki