PHPとPDOを使用して接続したデータベースに特定の名前のテーブルが存在するかどうかを確認したい。
MySQL、SQLiteなどのすべてのデータベースバックエンドで動作する必要があります。
行う:
select 1 from your_table
エラーをキャッチします。エラーが発生せず、1つの列に「1」が含まれる結果セットである場合、テーブルは存在します。
これは、テーブルが存在するかどうかをチェックするための完全な関数です。
/**
* 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;
}
注:PDOは、指示された場合にのみ例外をスローします。デフォルトでは、サイレントで例外はスローされません。そのため、結果も確認する必要があります。 php.netのPDOエラー処理を参照
先に進む前に、これはMySQL固有のソリューションであることを理解しています。
ここで述べた解決策はすべてうまくいくかもしれませんが、私は(個人的に)PDOが例外をスローしないようにします(個人的な好み、それだけです)。
そのため、代わりに以下を使用してテーブル作成をテストします。
SHOW TABLES LIKE 'some_table_of_mine';
テーブルが存在しない場合でもエラー状態は生成されず、結果セットはゼロになります。高速で一貫して動作します。
プロジェクトの一部として、スキーマビューを作成します。
Oracleの場合、それは次のようなものになります
SELECT TABLE_NAME FROM ALL_TABLES
Mysqlの場合:
SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'mydbname'
等..
次に、コードに対してビューに対してクエリを実行します。
PDOを介してデータベースハンドルを取得したら、次の操作を実行できます。
$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == 'integer';
または、関数でラップします。
最初はtry/catchをいじってみましたが、テーブルが存在しなくても例外はありませんでした。最後に、dbh exec呼び出しからの戻り値のデータ型をチェックすることになりました。選択カウントが一致する場合(カウントが0であっても)は整数であり、結果がなかった場合はfalseのブール値です。
構文は本当にシンプルなので、PDOがサポートするすべてのデータベースタイプでこれは機能するはずです。
"SHOW TABLES LIKE 'your_table'"の行に沿ってクエリを使用し、行をカウントすることで、エラーに依存する必要を回避できる場合があります。私はこの方法をMySQLとPDOでうまく使用していますが、他のDBでまだテストしていません
最初は受け入れられた回答を使用していましたが、空のテーブルで失敗することに気付きました。これが私が今使っているコードです:
function DB_table_exists($db, $table){
GLOBAL $db;
try{
$db->query("SELECT 1 FROM $db.$table");
} catch (PDOException $e){
return false;
}
return true;
}
このコードは、PDOの拡張クラスの抜粋です。テーブルが存在しない場合はエラーが発生し(falseが返されます)、テーブルが存在する場合や空の場合は成功します
WebアプリでCodeIgniterを使用していくつかのことを行い、データベースが存在する(そして有用である)ことを確認します。これらのいずれでも機能します。
_@$this->load->database();
$v = @$this->db->version()
$tables = @$this->db->list_tables();
_
_@
_を追加すると、PHPセットアップでそれらを有効にし、version()
とlist_tables()
canの結果を確認するとエラーが抑制されますあなたのDBが周りにあるかどうかを決定するだけでなく(それがまた正気であるか)使用されます。
PHPから「select count(*)from table」クエリを実行できます。エラーまたは例外を返す場合、テーブルは存在しません。これが最後の手段となる可能性があり、私はこれがうまくいくと確信しています。
または、スキーマテーブルを直接確認することもできます(おそらく、管理者が設定する追加の権限が必要です)。
これは、少なくともSQLite3で例外なく動作するようです。
$select =
"SELECT CASE WHEN EXISTS (SELECT * FROM SQLITE_MASTER WHERE TYPE = 'table' AND NAME = :tableName) THEN 1 ELSE 0 END AS TABLE_EXISTS;";
テーブルが存在しない場合は、データベースにテーブルの作成を依頼するクエリを実行します。
$string = "CREATE TABLE IF NOT EXISTS " .$table_name . " int(11) NOT NULL AUTO_INCREMENT,
`id` int(3) NOT NULL,
`blabla` int(2) NOT NULL,
`blabla1` int(2) NOT NULL,
`blabla3` varchar(3) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
AUTO_INCREMENT=1 ";
$sql = $conection->prepare($string);
$sql->execute();
この完全な関数はesbiteの回答と非常に似ていますが、SQLインジェクションから保護するためのコードが含まれています。また、問題のテーブルが空の場合、受け入れられた回答から一貫した結果が得られない場合があります。
/**
* 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;
}
}