今回は、管理画面から直接 SQL クエリ―を実行させるという恐ろしい(?)機能を追加しようと思います。
直接 SQL クエリ―を実行するため、使用には十分注意してください。誤ったクエリ―を実行するとデータベースを壊してしまったりします。また、GUI 等によるクエリ―の生成機能もないので SQL の知識が必要です。
スクリーンショット
仕様
- SQL クエリ―を実行します。
- SELECT, SHOW, DESCRIBE や EXPLAIN ステートメント、その他結果セットを返すステートメントでは結果を表示します。表示する件数は最大 1000 件までです。
- 結果セットを返さないステートメントは変更された行数を表示します。
- SQL クエリ―は単一のステートメントとします。
使い方
管理画面->[ツール]->[SQL 実行] メニューを選択します。SQL 実行ページが表示されます。
SQL クエリ―欄に SQL クエリ―(単一のステートメント)を記述し、[実行] ボタンをクリックします。
SQL クエリ―の実行に成功すると結果が表示されます。
sql-execute.php
<?php
class SqlExecute {
function __construct() {
add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
}
function add_admin_menu() {
add_management_page( 'SQL 実行', 'SQL 実行', 'manage_options', 'sql-execute', array( $this, 'admin_page' ) );
}
function admin_page() {
$sql = '';
$results = false;
if ( isset( $_POST['sql'] ) ) {
$sql = trim( stripslashes( $_POST['sql'] ) );
if ( check_admin_referer( 'sql-execute' ) ) {
$link = mysql_connect( DB_HOST, DB_USER, DB_PASSWORD, true );
mysql_select_db( DB_NAME, $link );
mysql_set_charset( 'utf8', $link );
$results = array();
$results['columns'] = array();
$results['rows'] = array();
$result = mysql_query( $sql, $link );
if ( $result === false ) {
$results['error'] = mysql_error( $link );
} else if ( $result === true ) {
$results['count'] = mysql_affected_rows( $link );
} else {
$counter = 0;
while ( $row = mysql_fetch_assoc( $result ) ) {
if ( $counter == 0 ) {
$results['columns'] = array_keys( $row );
}
$results['rows'][] = array_values( $row );
$counter++;
if ( $counter >= 1000 )
break;
}
}
mysql_close( $link );
}
}
$this->form( $sql, $results );
}
function form( $sql, $results ) {
?>
<div class='wrap'>
<h1>SQL 実行</h1>
<form method="post" name="sql-execute">
<?php wp_nonce_field( 'sql-execute' ); ?>
<div class="form-field">
<h2 class="title">SQL クエリ―</h2>
<p><textarea id='sql' name='sql' rows="5" cols="60" style="width: 100%;"><?php print esc_html( $sql ); ?></textarea></p>
</div>
<input type="submit" class="button button-primary" value="実行" />
</form>
<?php if ( $results !== false ): ?>
<h2>実行結果</h2>
<?php if ( isset( $results['error'] ) ): ?>
<p>エラー: <?php echo esc_html( $results['error'] ); ?></p>
<?php elseif ( isset( $results['count'] ) ): ?>
<p>実行結果: <?php echo $results['count']; ?> 件</p>
<?php elseif ( isset( $results['rows'] ) ): ?>
<p>実行結果: <?php echo count( $results['rows'] ); ?> 件 (最大 1000 件)</p>
<table class="widefat fixed striped">
<thead>
<tr>
<?php foreach ( $results['columns'] as $column ): ?>
<th><?php echo $column; ?></th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ( $results['rows'] as $rows ): ?>
<tr>
<?php foreach ( $rows as $row ): ?>
<td><?php echo esc_html( $row ); ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
<?php endif; ?>
</div>
<?php
}
}
new SqlExecute();
※ ここではテーマの inc フォルダに配置した場合を想定して説明します。
functions.php
functions.php などに下記のコードを記述します。
require_once( get_template_directory() . '/inc/sql-execute.php' );