mysqliクラスでテーブルのカラム名を取得する
ちょっとしたシステム作っているときにviewへのマスタテーブルのデータを表示する際、mysqliクラスでSELECTしてきたデータがarray(0)で空っぽであるときでも配列を有効にして表示する必要があった。
そのため、テーブルのカラム名を引数の添字として、添字に対応するデータを空白で出すために、指定したテーブルのカラム名を実際に使えるデータとして取得したくなった。
MySQL上ではINFOMATION_SCHEMAを使ってクエリを出してくるのがよくある方法。
SELECT COLUMN_NAME AS colname FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name' ;
PHPベースのシステム開発はもとより、CMSとかでもコマンドラインやらSQL実行ツールよりこれを行うパターンはよく知られていると思う。
今回のケースだとmysqliクラスからこれを利用したクエリを発行させて、指定したテーブルのカラム名を全て取得しなければならない。
その場合、こんな感じでコードを作成する。
function get_table_columns( $table_name = '' ) { $result = null; $sql = ''; // DB接続 (このあたり適当) $host = 'host_name'; $user = 'user'; $pass = 'password'; $dbname = 'dbname'; // ←SQL文で使用する $db = new mysqli( $host, $user, $pass, $dbname ); if ( $db->connect_errno ) die(); // いちおうテーブルの存在チェックをしておく if ( ! empty( $table_name ) && 1 === $db->query( sprintf( 'SHOW TABLES LIKE \'%s\';', $db->real_escape_string( $table_name ) ) )->num_rows ) { // SQL文を作成 (フォームから直接実行するパターンは考えられないが念の為エスケープ) $sql = sprintf( 'SELECT COLUMN_NAME AS colname FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = \'%1$s\' AND TABLE_NAME = \'%2$s\';', $db->real_escape_string( $dbname ), $db->real_escape_string( $table_name ) ); $exec = $db->query( $sql ); if ( false !== $exec ) { $result = array(); while ( $row = $exec->fetch_assoc() ) { $result[] = $row['colname']; } } } $db->close(); return $result; }
コード単体で成立させるためにとりあえずは手続き式とした。
せっかくmysqliクラスを利用しているので、実際はメソッドに組み込んだものとして使用したほうがいいと思う。
あとは、
$table_cols = get_table_columns( 'TableName' ); var_dump( $table_cols ); /* * 結果 * array(xx){ [0] => 'col_1', [1] => 'col_2', [2] => 'col_3', etc.... } */
とかなんとかやっておけばOK。
今回触れているのはmysqliだけど、PDOを使う場合も同じような要領でいけるはず。