ようこそのお運びで、厚く御礼申し上げます。
34日目です。前回、前々回とデータベースを取り扱ってます。
※あくまでも検証用のスクリプト・プログラムです。開発環境推奨。
SQL(select文)を入力、取得形式を選択して、データベースからデータを取得・表示してみる。
要はselect文限定のなんちゃってクエリーブラウザを作ってみようと思います。
(なので、建前上、開発環境推奨ということでお願いします。)
※今回のスクリプトはほぼ、趣味に近いものがあるので説明を省略します。
一通りの流れは前回までのスクリプトを参照してください。
概要は、以下の通りです
管理メニュー「SQL実行」を作成します。

テキストエリアにSQL(select文限定)を入力します。
また、セレクトボックスで取得する形式を選択します(前回参照)。

「SQL文を実行する」をクリックした後、結果を出力します。

結果は、phpの実行スクリプト、実際に実行したSQL、取得データを表示します。
まずは、function.phpに書いてみました。
では、function.phpに以下のコードを書きました。
//オブジェクトを生成
new Paka3SQLSelectQuery;
//クラス定義
class Paka3SQLSelectQuery {
//コンストラクタ
function __construct() {
add_action('admin_menu', array($this, 'adminAddMenu'));
}
//管理メニューの設定
function adminAddMenu() {
add_submenu_page("options-general.php", 'SQL:select文', 'SQL実行', 'edit_themes', 'selectquery_setting', array($this,'paka3_sql_page'));
}
//表示する内容と処理
function paka3_sql_page() {
//**管理画面SQL文を実行する(select文のみ)の処理
$paka3_sql = null;
//1.sqlがあった場合の処理
if(isset($_POST['paka3_sql']) && $_POST['paka3_sql'] && check_admin_referer('paka3sql')){
//値の取得
$paka3_sql = $_POST['paka3_sql'];
$r_type = $_POST['r_type'];
//2.値の設定
//a.表示用//半角変換//スペース削除
$paka3_sql = stripslashes(mb_convert_kana($paka3_sql, "s"));
$paka3_sql = trim($paka3_sql);
//b.実行用SQL
global $table_prefix;
$paka3_sql_func=preg_replace("/[$]wpdb->/",$table_prefix,$paka3_sql);
$paka3_sql_func=preg_replace("/[}]/","",$paka3_sql_func);
$paka3_sql_func=preg_replace("/[{]/","",$paka3_sql_func);
//c.select検証用:小文字変換
$paka3_sql_check = strtolower(trim($paka3_sql_func));
if(preg_match('/^select/',$paka3_sql_check)){
global $wpdb;
//$wpdb->get_results('query', output_type);
//連想配列、またはインデックス配列のいずれかを指定
$r_type_check = mb_split('-',$r_type);
if($r_type_check[0]=="results"){
$r = $wpdb->get_results(
$paka3_sql_func,
$r_type_check[1]);
}elseif($r_type_check[0]=="col"){
$r = $wpdb->get_col(
$paka3_sql_func);
}elseif($r_type_check[0]=="row"){
$r = $wpdb->get_row(
$paka3_sql_func);
}elseif($r_type_check[0]=="var"){
$r = $wpdb->get_var(
$paka3_sql_func);
}
$paka3_sql_result=$r;
$sql_function =<<<EOS
<?php
global $wpdb;
$r = $wpdb->get_results(
$wpdb->prepare("{$paka3_sql}"),
ARRAY_N
);
print_r($r);
?>
EOS;
}else{
echo '<div class="updated fade"><p><strong>';
echo "sqlがselectではじまっていません";
echo "</strong></p></div>";
}
}
//3.表示する内容(HTML)
$data = array(
array("get_results($sql,OBJECT)","results-OBJECT",""),
array("get_results($sql,OBJECT_K)","results-OBJECT_K",""),
array("get_results($sql,ARRAY_A)","results-ARRAY_A",""),
array("get_results($sql,ARRAY_N)","results-ARRAY_N",""),
array("get_col","col",""),
array("get_row","row",""),
array("get_var","var",""),
);
$wp_n = wp_nonce_field('paka3sql');
echo <<<EOS
<style type="text/css">
.paka3sql b,
.paka3sql h4{color:#f00}
.paka3sql textarea{width:100%;}
.sql_r pre{background:#fff;
color:#333;
padding:5pt;
font-size:12pt;
border:1px solid #ccc}
</style>
<div class="wrap">
<h2>SQL文を実行する(select文のみ)</h2>
<form method="post" action="" class="paka3sql">
{$wp_n}
<h4>SQL(select文)を入力してください(一つの命令のみ)</h4>
<textarea name="paka3_sql">{$paka3_sql}</textarea>
テーブル名は、$wpdbを使って「<b>$wpdb->postmeta</b>」のような書き方もできますし、
通常のテーブル名「<b>wp_postmeta</b>」といった書き方でも入力できます。<br />
<br />
<b>取得する形式:</b><select name="r_type">
EOS;
foreach($data as $d){
if($d[1]==$r_type) $d[2] ="selected";
echo <<<EOS
<option value="{$d[1]}" {$d[2]}>{$d[0]}
EOS;
}
echo <<<EOS
</select>
<p class="submit"><input type="submit" name="Submit" class="button-primary" value="SQL文を実行する" /></p>
<div class="sql_r">
<h3>スクリプト(function.phpやプラグインに)</h3>
<pre>{$sql_function}</pre>
<h3>実行されたSQL</h3>
<pre>{$paka3_sql_func}</pre>
<h3>結果</h3>
<pre>
EOS;
if(!$paka3_sql_result) {
echo "<span>結果なし</span>";
}else{
print_r($paka3_sql_result);
}
echo <<<EOS
</pre>
</div>
</form>
</div>
EOS;
}
}
ポイントはどこ?
今回もデータベースを扱うので、こちらのwpdbクラスについて一読してください。(WordPress Codex日本語版:wpdb Class)
また、これまでの復習とデータベースについて書いたものを使った応用ですので以下の記事を参照。
コードをプラグイン用のファイルにします
それではfunction.phpに書いたコードを消して、
「paka3_sql_select_query.php」というファイルを作成し、以下のコードを記入します。
このファイルを[wp-content]>「plugins」ディレクトリに入れ、管理画面で有効にして完了です。
今回のまとめ
今回は…趣味の範囲内ですね。クエリーブラウザもどき...SQLガリガリ書いたデータ検証にはよいです。でも...セキュリティ云々の問題が出てくるので運用サーバーに残さない方がよいでしょうね、きっと。あと、細かいSQLは検証していないのでもしエラーが出る場合は、生成されたSQLを確認・修正する必要があります。