saber - Verifique si existe una tabla de base de datos usando PHP/PDO
php mysql comprobar si existe registro (11)
Al principio, estaba usando la respuesta aceptada, pero luego noté que estaba fallando con tablas vacías. Aquí está el código que estoy usando en este momento:
function DB_table_exists($db, $table){
GLOBAL $db;
try{
$db->query("SELECT 1 FROM $db.$table");
} catch (PDOException $e){
return false;
}
return true;
}
Este código es un extracto de mi clase de extensión para PDO. Producirá un error (y devolverá falso) si la tabla no existe, pero tendrá éxito si la tabla existe y / o está vacía.
Quiero verificar si existe una tabla con un nombre específico en una base de datos a la que me he conectado usando PHP y PDO.
Tiene que funcionar en todos los backends de bases de datos, como MySQL, SQLite, etc.
Antes de continuar, me doy cuenta de que esta es una solución específica de MySQL.
Si bien todas las soluciones mencionadas aquí pueden funcionar, a mí (personalmente) me gusta evitar que PDO arroje excepciones (preferencia personal, eso es todo).
Como tal, utilizo lo siguiente para probar la creación de tabla:
SHOW TABLES LIKE ''some_table_of_mine'';
No se genera ningún estado de error si la tabla no existe, simplemente obtiene un conjunto de resultados cero. Funciona de manera rápida y consistente para mí.
Aquí hay una función completa para verificar si existe una tabla.
/**
* 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;
}
Nota: PDO solo lanzará excepciones si se le dice que, de manera predeterminada, es silenciosa y no arroja excepciones. Es por eso que necesitamos verificar el resultado también. Ver el manejo de errores de PDO en php.net
Como parte de su proyecto, cree una vista de esquema.
Para Oracle sería algo así como
SELECT TABLE_NAME FROM ALL_TABLES
Para Mysql:
SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = ''mydbname''
ETC ..
Y luego ejecute una consulta en su código contra la vista.
Es posible que pueda evitar tener que confiar en un error mediante una consulta en la línea de "MOSTRAR TABLAS COMO ''su_tabla''" y luego contar las filas. He estado utilizando este método con éxito con MySQL y PDO pero aún no lo he probado con otros DB
Esta función completa es muy similar a la respuesta de esbite, pero incluye código para proteger de la inyección de SQL. Además, es posible que no obtenga resultados consistentes de la respuesta aceptada cuando la tabla en cuestión esté vacía.
/**
* 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;
}
}
Esto es lo que funcionó para mí. Fue una combinación de varias respuestas:
$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
}
Hacer:
select 1 from your_table
y luego captar el error. Si no obtiene ningún error, sino resultados con una columna que contenga "1", entonces la tabla existe.
Hago algunas cosas en mis aplicaciones web con CodeIgniter para verificar que la base de datos exista (y sea útil), cualquiera de estas puede funcionar:
@$this->load->database();
$v = @$this->db->version()
$tables = @$this->db->list_tables();
Agregar el @
suprimirá los errores si los tiene habilitados en su configuración de PHP, y la verificación de los resultados de la version()
y list_tables()
puede usarse no solo para determinar si su DB está cerca (pero también es sensato).
Puede hacer una consulta "select count (*) from table" desde php. Si devuelve un error o excepción, la tabla no existe. Este podría ser el último recurso posible y estoy seguro de que esto funciona.
O bien, puede verificar la tabla de esquema directamente (probablemente requiera permisos adicionales para ser configurada por el administrador)
Una vez que tenga su manejador de base de datos a través de PDO, puede hacer esto:
$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == ''integer'';
O envuélvalo en una función.
Intenté jugar con try / catch al principio, pero incluso si la tabla no existía, no había ninguna excepción. Finalmente terminé buscando el tipo de datos del valor devuelto de la llamada de dbh exec. Es un número entero, si hay una coincidencia en el recuento de selección (incluso si hay recuento es 0, o un booleano de falso si no hubo resultados.
Creo que esto debería funcionar con todos los tipos de bases de datos que admite PDO, ya que la sintaxis es realmente simple.