ようこそのお運びで、厚く御礼申し上げます。
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を確認・修正する必要があります。