WordPress SQL サンプル

1Reading Time

下記サンプルの前提条件
global $wpdb; //グローバル宣言
$table_name = $wpdb->prefix . ‘wp-を除いたテーブル名’; // テーブル名のプレフィックスを作成

SELECT文

 

通常のSELECT文

//重複を削除して、キャリアを取り出す
$results = $wpdb->get_results($wpdb->prepare("SELECT DISTINCT pl_maker FROM $table_name WHERE pl_career = %s", $career ), ARRAY_A); 

 

  • query
    (文字列) 実行したい SQL クエリ。
  • output_type
    以下の4つの定数のいずれか。初期値は OBJECT。詳細および例については、行の SELECT セクションを参照。
    OBJECT – 結果をインデックス配列として出力。要素は行オブジェクト。
    OBJECT_K – 結果を連想配列として出力。第1カラムの値をキー(重複は無視される)、行オブジェクトを値とする。
    ARRAY_A – 結果をインデックス配列として出力。要素は1行を表す連想配列で、そのキーはカラム名。
    ARRAY_N – 結果をインデックス配列として出力。要素は1行を表すインデックス配列。
$results = $wpdb->get_results("SELECT pl_career FROM $table_name", ARRAY_A);

行を取り出す

<?php $wpdb->get_row( $query, $output_type, $row_offset ); ?>

  • query
    (文字列) 実行したいクエリ。
  • output_type
    以下の定数のいずれか。初期値は OBJECT。
    OBJECT – 結果をオブジェクトとして出力。
    ARRAY_A – 結果を連想配列として出力。
    ARRAY_N – 結果をインデックス配列として出力。
  • row_offset
    (整数) 必要としている行のオフセット (一つ目は 0)。初期値は 0。

クエリから行全体を取り出すには、「get_row」を使います。連想配列、またはインデックス配列として返されます。クエリが2行以上にマッチする場合は、後から使えるようにすべての行がキャッシュされますが、実際に返されるのは指定された行のみです。マッチする行がなければ NULL を返します。

条件を入力値から渡す場合は、「prepare」を使う。また、下記の例ではSELECT DISTINCTとすることで、重複データを削除しています。




条件なしの場合

$results = $wpdb->get_row("SELECT * FROM $table_name", ARRAY_A); 

検索に使用するSELECT文

テーブルのフィールドを結合してlikeで検索。

//SQL文の組み立て
$search = '';
if ( ! empty( $_REQUEST['s'] ) ) {
	$search = "AND  CONCAT (cs_last_name,cs_first_name,cs_email,cs_tel1) LIKE '%%" . esc_sql( $wpdb->esc_like( $_REQUEST['s'] ) ) . "%%'";
}		
$items = $wpdb->get_results( "SELECT * FROM $table_name WHERE 1=1 {$search}" . $wpdb->prepare( "ORDER BY ID DESC LIMIT %d OFFSET %d;", $per_page, $offset ),ARRAY_A);
	

3つのフィールド

LIKE検索と条件一致が混在するクエリ

    $career = esc_html($career);
    $maker = esc_html($maker); //無害化
    $model = '%%' . $wpdb->esc_like($model) . '%%'; //LIKE検索に使うための無害化 $wpdb->esc_like()
    $sql = "
	SELECT pl_career, pl_maker, pl_model, pl_image, pl_new_price ,pl_used_high_price, pl_used_low_price
	FROM $table_name 
	WHERE (pl_model LIKE %s)
        AND pl_maker = %s 
        AND pl_career = %s
	";
    $sql = $wpdb->prepare( $sql, $model, $maker, $career );
    $lists = $wpdb->get_results(($sql), ARRAY_A);

$search_word = '%%' . $wpdb->esc_like($search_word) . '%%'; //LIKE検索に使うための無害化 $wpdb->esc_like()
$sql = "
      SELECT *
      FROM $table_name
      WHERE CONCAT (pl_model,pl_keyword) LIKE %s
      AND pl_career = %s
      ";
$sql = $wpdb->prepare( $sql, $search_word, $career_word );
$items = $wpdb->get_results(($sql), ARRAY_A);

2つのフィールドにわたってLIKE検索を行う。
$wpdb->esc_like()はLIKE検索の為の無害化処理

除外条件があるSELECT文

    $results = ''; //初期化等
    $exclusion = '処理済み'; //除外したいワードを入れる
    global $wpdb;
    $table_name = $wpdb->prefix . 'summary'; // テーブル名のプレフィックスを作成
    
    //重複を削除して、データを取り出す
    $query = "SELECT DISTINCT product, size FROM $table_name WHERE status = %s AND status NOT LIKE %s";
    $results = $wpdb->get_results( $wpdb->prepare( $query, $status, $exclusion ),ARRAY_A );

UPDATE文

//更新したい内容
$data = array(
 'cs_temp_pass' => $temp_pass,
 'cs_temp_datetime' => $temp_datetime
);
//更新したい行の条件
 $condition = array(
 'ID' => $check_acount['ID']
);
$dataFormat = array('%s');
$conditionsFormat = array('%d');
$wpdb->update($table_name, $data, $condition,$dataFormat,$conditionsFormat);

//又は
//更新したい内容
$data = array(
 'cs_temp_pass' => $temp_pass,
 'cs_temp_datetime' => $temp_datetime
);
//更新したい行の条件
 $condition = array(
 'ID' => $check_acount['ID']
);
//データ型指定
 $dataformat = array(
 '%s',
 '%s'
);
//条件のデータ型
 $conditionformat = array('%d');
$result = $wpdb->update($table_name, $data, $condition, $dataformat, $conditionformat);

INSERT文

$wpdb->query( $wpdb->prepare( 
"
INSERT INTO $table_name
( cs_last_name, cs_first_name, cs_last_name_furi, cs_first_name_furi, cs_email, cs_pass )
VALUES ( %d, %s, %s, %s, %s, %s )
", 
array(
 $cs_last_name,
 $cs_first_name,
 $cs_last_name_furi,
 $cs_first_name_furi,
 $cs_email,
 $cs_pass,
 ) 
 ) );
 $cs_ID = $wpdb->insert_id; //インサートしたIDを取得