WordPress

SQL:select文を実行してデータを取得・表示してみる。その3:【35日目】WordPress1日1プラグイン

更新日:

ようこそのお運びで、厚く御礼申し上げます。
34日目です。前回前々回とデータベースを取り扱ってます。
※あくまでも検証用のスクリプト・プログラムです。開発環境推奨。

SQL(select文)を入力、取得形式を選択して、データベースからデータを取得・表示してみる。

要はselect文限定のなんちゃってクエリーブラウザを作ってみようと思います。
(なので、建前上、開発環境推奨ということでお願いします。)

※今回のスクリプトはほぼ、趣味に近いものがあるので説明を省略します。
一通りの流れは前回までのスクリプトを参照してください。

概要は、以下の通りです

管理メニュー「SQL実行」を作成します。
140221-0001

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

「SQL文を実行する」をクリックした後、結果を出力します。
140221-0004
結果は、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
&lt;?php
global &#36;wpdb;
&#36;r = &#36;wpdb->get_results(
       &#36;wpdb->prepare("{$paka3_sql}"),
       ARRAY_N
     );
print_r(&#36;r);
?&gt;
EOS;

      }else{

        echo '<div class="updated fade"><p><strong>';
        echo "sqlがselectではじまっていません";
        echo "</strong></p></div>";
      }
    }
  //3.表示する内容(HTML)
    $data = array(
		 array("get_results(&#36;sql,OBJECT)","results-OBJECT",""),
		 array("get_results(&#36;sql,OBJECT_K)","results-OBJECT_K",""),
		 array("get_results(&#36;sql,ARRAY_A)","results-ARRAY_A",""),
		 array("get_results(&#36;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>
             テーブル名は、&#36;wpdbを使って「<b>&#36;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

また、これまでの復習とデータベースについて書いたものを使った応用ですので以下の記事を参照。

  1. SQL:select文を実行してデータを取得・表示してみる。その1
  2. SQL:select文を実行してデータを取得・表示してみる。その2

コードをプラグイン用のファイルにします

それではfunction.phpに書いたコードを消して、
paka3_sql_select_query.php」というファイルを作成し、以下のコードを記入します。

このファイルを[wp-content]>「plugins」ディレクトリに入れ、管理画面で有効にして完了です。

今回のまとめ

今回は…趣味の範囲内ですね。クエリーブラウザもどき...SQLガリガリ書いたデータ検証にはよいです。でも...セキュリティ云々の問題が出てくるので運用サーバーに残さない方がよいでしょうね、きっと。あと、細かいSQLは検証していないのでもしエラーが出る場合は、生成されたSQLを確認・修正する必要があります。

-WordPress
-, , , ,

Copyright© アルパカ@ラボ:大分県臼杵市でホームページ運営やWordPressやってます。 , 2019 All Rights Reserved Powered by AFFINGER5.