PHP & SQL for WordPress TIPS


### 基本Tips
```hoge.php

//変数の値をチェック・確認する
var_dump($results);

//改行コードの前に<br>を挿入してくれる関数
$kaigyo=nl2br($hoge);
```

### クラスファイルを読み込んだ後にインスタンス化して利用

```hoge.php
     //クラスを読み込む
     include(plugin_dir_path( __FILE__ )."contents.php");
     //クラスをインスタンス化
     $C_contents = new contents();
     //実行
     $C_contents->main_contents();

//--------------------------------------------------------------------

     //phpファイルを読み込む
     include(plugin_dir_path( __FILE__ )."class_info.php");

     //登録情報クラスをインスタンス化
     $regis_info = new C_info();
   //登録テーブル
    $h_option=$regis_info->h_option;
		
    //参照テーブル情報取得
    $get_row =$regis_info->get_row ;

   //テーブル名取得
   $table_name =$regis_info->table_name;

   //キー項目名
   $key_name=$regis_info->key_name;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/3334125a-e7d6-3692-a483-7ab9e47f9108.png)

```class_info.php
<?php
//接続するテーブルの登録情報を"h_option"から取得するクラス
class C_info
{
	//登録テーブル	
	public	$h_option;
	//参照テーブル情報取得	
	public	$get_row;
	//テーブル名取得	
	public	$table_name;
	//キー項目名	
	public	$key_name;
	//テーブル項目取得	
	public	$query;
	public	$colInfo;
	//テキストエリア項目の取得	
	public	$area;
	public	$txt_area;
	
//コンストラクタ
public function __construct() {
	global $wpdb;
		
	//登録テーブル
	$this->h_option=$wpdb->prefix."h_option";

	//参照テーブル情報取得
	$this->get_row =  $wpdb->get_row("SELECT * FROM $this->h_option WHERE option_id = 1");

	//テーブル名取得
	$this->table_name = $wpdb->prefix.$this->get_row->table_name; 

	//キー項目名
	$this->key_name=$this->get_row->key_name;	

	//テーブル項目取得
	$this->query = "DESC $this->table_name";	
	$this->colInfo = $wpdb->get_col($this->query);	

	//テキストエリア項目の取得
	$this->area = $this->get_row->txt_area;
	$this->txt_area = explode(',', $this->area);
  }
	
//テーブルのカラムを取得
function read_col($tb_name){
		global $wpdb;	
		return $col_list = $wpdb->get_col("DESC $tb_name");	
	}
}
```

### $wpdbに含まれるテーブル名を全部取得したい場合

```hoge.php
	function main_contents(){
		global$wpdb;
		foreach($wpdb->tables as $key=>$value){
		  echo'<p>['.$key.'] => '.$value.'</p>';
		}
	}

```
```hoge.php
		//データベースのテーブル名を取得して配列に入れる処理
		$cols = array();
		foreach($wpdb->tables as $key=>$value){
		  array_push($cols,$value);
		}
```
### テーブルのフィールド（カラム）を一覧取得する
以下の例では[shops]テーブルを指定しています

```hoge.php
$query = "DESC $wpdb->shops";
$colInfo = $wpdb->get_col($query);
foreach ($colInfo as $col){
	echo "<p>$col</p>";
}
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class#.E5.A4.96.E9.83.A8.E8.B3.87.E6.96.99
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class#Getting_Column_Information
//-------テーブル名を変数にするときはprefixをつける--------
$query = "DESC $wpdb->prefix$senTbNam";
$check_list = $wpdb->get_col($query);
$c_dataform->form_check($check_list);
```

###　レコード数を取得する
```xxx.php
global $wpdb;  
  $record_count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->reviews WHERE field_name ='$atai'
```

#### その他
```hoge.php
//mysql_connectでMySQLに接続
function shortcode_MySQLConnect(){
  global $wpdb;
  $db_user = $wpdb->dbuser;       //データベース接続ユーザーの取得
  $db_passwd = $wpdb->dbpassword; //データベース接続用パスワードの取得
  $db_host = $wpdb->dbhost;       //データベースホストの取得
  $db_dbname = $wpdb->dbname;     //データベース名の取得
     
  $link = mysqli_connect($db_host, $db_user, $db_passwd, $db_dbname);
  if (!$link) {
    return '接続失敗です。'.mysqli_error();
  }
```
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class#.E5.A4.96.E9.83.A8.E8.B3.87.E6.96.99


### Update Insert構文
```hoge.php
//変更・追加処理
	function save_record($wpdb,$table_name,$key_name,$colInfo) {

		//レコードをセットするための配列
		$set_arr = array();
		//配列にループ代入
		foreach ($colInfo as $col){
			$set_arr[$col]= stripslashes(isset($_POST['label_'.$col])) ? stripslashes($_POST['label_'.$col]) : null;
		}

		//キーの値を取得
		$key_data = isset($_POST['label_'.$key_name]) ? $_POST['label_'.$key_name] : null;

		//該当のレコードがあるかどうか
		$get_id = $wpdb->get_var(
					$wpdb->prepare("SELECT * FROM
					  $table_name WHERE 
					  $key_name = %d", $key_data)
		);
		//レコードがなかったら新規追加あったら更新
		if ($get_id) {

		  $wpdb->update($table_name, $set_arr, array($key_name => $key_data));
		  return	"更新しました";
		} else {

		  $wpdb->insert($table_name, $set_arr);
		  return	"追加しました";
		}
	  }

	//削除処理
	function dalete_record($wpdb,$table_name,$key_name) {
		$meta_id = isset($_POST['label_'.$key_name]) ? $_POST['label_'.$key_name] : null;
		$wpdb->delete($table_name,array( $key_name => $meta_id ));
		return	"削除しました";
	}
```

## form関係
### ボタン処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/a41b3ba0-e3ad-4eda-28a1-8ac5adb75827.png)

```hoge.php
//選択ボタンを押したかどうか
		$senInfo=filter_input(INPUT_POST,"sentaku");
		if($senInfo=="選択") {
			$senFlg=1;
			$senTbNam=isset($_POST['テーブルを選択してください']) ? htmlspecialchars($_POST['テーブルを選択してください']) : null;
			echo $senTbNam;
		}		
```
```hoge.html
<tbody>
<form method="POST" action=""></form>
	<tr>				
		<!--プルダウンとテキストボックス-->
		<td style="border-style: none;">テーブル選択：</td>
		<td style="border-style: none;"><select name="テーブルを選択してください">
			<option value=""></option>
			<option value="posts">posts</option>
			<option value="comments">comments</option>
			<option value="links">links</option>
			<option value="options">options</option>
			<option value="postmeta">postmeta</option>
			<option value="terms">terms</option>
			<option value="term_taxonomy">term_taxonomy</option>
			<option value="term_relationships">term_relationships</option>
			<option value="termmeta">termmeta</option>
			<option value="commentmeta">commentmeta</option>
			<option value="shops">shops</option>
		</select>
		</td>
			<td style="border-style: none;"><input type="submit" name="sentaku" value="選択">
		</td>
	</tr>
</tbody

```
## CSVインポート
以下の例ではCSVをインポートしてデータをTable（html)で出力している。
```hoge.php

function read_csvimport($filepath){
	

//CSVの取り込みには、「SplFileObject」を使うと便利です。（PHP5.1以上）
  $file = new SplFileObject($filepath); 
  $file->setFlags(SplFileObject::READ_CSV);
  $i = 0;
  $html="";
	// ファイル取得
  foreach ($file as $key => $line) {
    // ヘッダを読込
    if ( $i === 3 ) {
      $csv_heads = $line;
      $csv_heads_key = array_flip($csv_heads);  // ←ここがポイント！！
      $head_count = count($csv_heads);
      $i ++;
      continue;
    }
    if( $i > 3 ){
		$html=$html."<tr>";
		$html=$html."<td>".$line[$csv_heads_key['送信者タイプ']]."</td>";
		$html=$html."<td>".$line[$csv_heads_key['送信者タイプ']]."</td>";
		$html=$html."<td>".$line[$csv_heads_key['送信者名']]."</td>";
		$html=$html."<td>".$line[$csv_heads_key['送信日']]."</td>";
		$html=$html."<td>".$line[$csv_heads_key['送信時刻']]."</td>";
		$html=$html."<td>".$line[$csv_heads_key['内容']]."</td>";
		$html=$html."</tr>";
	} 
    $i++;
  }
?>
		<!--出力-->
		<div class="wrap">
		<div class="wrap">
		<table class="wp-list-table widefat striped posts">
		<?php echo $html; ?>
		</table>
		</div>
		</div>
<?php
}