MySQL vérifier si une table existe sans lancer une exception
Quelle est la meilleure façon de vérifier si une table existe dans MySQL (de préférence via PDO en PHP) sans lancer une exception. Je n'ai pas envie d'analyser les résultats de "montrer des tableaux comme" et cetera. Il doit y avoir une sorte de requête booléenne?
10 réponses
Je ne connais pas la syntaxe AOP pour cela, mais cela semble assez simple:
$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;
si vous utilisez MySQL 5.0 et plus tard, 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 le tableau existe.
de: http://www.electrictoolbox.com/check-if-mysql-table-exists /
en utilisant mysqli j'ai créé la fonction suivante. En supposant que vous avez une instance 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 aidera.
avertissement: comme suggéré par @jcaron cette fonction pourrait être vulnérable aux attaches sqlinjection, donc assurez-vous que votre $table
var est propre ou utilisez encore mieux les requêtes paramétrisées.
Voici la solution que je préfère en utilisant des procédures stockées. Fonction mysql personnalisée pour vérifier que la table existe dans la base de données courante.
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
ceci est affiché simplement si quelqu'un vient chercher cette question. Même si sa déjà été répondu un peu. Certaines réponses de la rendre 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")
){
dans L'AOP I utilisé:
if ($con->query(
"SHOW TABLES LIKE '" . $table . "'"
)->rowCount() > 0
or die("No table set")
){
avec ça, je pousse l'autre condition en salle d'op. Et pour mes besoins je n'simplement besoin de mourir. Bien que vous pouvez définir ou à d'autres choses. Certains préféreront peut-être le SI/ AUTREMENT SI/AUTREMENT. Qui est ensuite de supprimer ou puis de fournir si/sinon si / sinon.
comme un "Afficher les tables" pourrait être lent sur les grandes bases de données, je recommande d'utiliser "décrire" et de vérifier si vous obtenez vrai / faux en conséquence
$tableExists = mysqli_query("DESCRIBE `myTable`");
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
foreach( $row as $key => $value )
{
if ( $value = BTABLE ) // BTABLE IS A DEFINED NAME OF TABLE
echo "exist";
else
echo "not exist";
}
}
Zend framework
public function verifyTablesExists($tablesName)
{
$db = $this->getDefaultAdapter();
$config_db = $db->getConfig();
$sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}' AND table_name = '{$tablesName}'";
$result = $db->fetchRow($sql);
return $result;
}
si la raison de vouloir faire ceci est la création conditionnelle de table, alors 'créer TABLE si non existe' semble idéal pour le travail. Jusqu'à ce que je découvre ceci, j'ai utilisé la méthode "décrire" ci-dessus. Plus d'informations ici: MySQL "créer une TABLE si elle N'existe pas" -> erreur 1050
Pourquoi est-ce si difficile à comprendre?
function table_exist($table){
$pTableExist = mysql_query("show tables like '".$table."'");
if ($rTableExist = mysql_fetch_array($pTableExist)) {
return "Yes";
}else{
return "No";
}
}