WordPress 管理画面から直接 SQL クエリ―を実行

今回は、管理画面から直接 SQL クエリ―を実行させるという恐ろしい(?)機能を追加しようと思います。

直接 SQL クエリ―を実行するため、使用には十分注意してください。誤ったクエリ―を実行するとデータベースを壊してしまったりします。また、GUI 等によるクエリ―の生成機能もないので SQL の知識が必要です。

スクリーンショット

sql-execute-screenshot

仕様

  • 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' );

コメントを残す

メールアドレスが公開されることはありません。

日本語でコメントを入力してください。