データの取得や更新の基礎 – カスタムテーブル解説 第2回

WordPressのデータベースに新しいテーブルを!カスタムテーブルについて」の記事では、新規にテーブルを作る仕組みや基礎について解説しました。今回の記事では新規生成したテーブルのデータを操作する方法を解説しています。

今回の記事を読まれる前に

テネーブル

今回の記事内で使用されているカスタムテーブルの新規生成や、データベース操作についてのwpdbクラスなどの解説は「WordPressのデータベースに新しいテーブルを!カスタムテーブルについて」の記事で行っています。
今回の記事を読まれる前にそちらの解説を先にお読みいただければ理解が深まるかもしれません。

テネーブル(アイコン01)
ルミェール

動作する全体のサンプルコードファイルは、記事の最後からダウンロードできるようにしているよ。

動作確認の場合は、そちらを使ってみてね。

ルミェール(アイコン01)

テーブル内にデータを追加・更新してみよう

ルミェール

カスタムテーブルを作った時は、wpdbクラスを使用したよね。データを作成や更新する場合もwpdbクラスを使うのかな?

ルミェール(アイコン01)
テネーブル

そうです。

wpdbクラスのquery関数でSQLクエリを発行する形でデータベース操作としてINSERT(データ追加)やUPDATE(データ更新)を行う形でもデータを追加・更新が可能ですが、今回はreplace関数と言う関数を使用します。

テネーブル(アイコン03)

replaceって置き換えると言う意味だよね?

データを置き換える?

ルミェール(アイコン03)
テネーブル

はい。replace関数は、指定されたデータがある場合にデータを置き換え…つまり、データの更新を行います。

データが無い場合は、空のデータを置き換えると言う意味でデータの作成となります。

WordPress Codexにも記載されています。

テネーブル(アイコン01)
行のReplace – WordPress Codex
テネーブル

実際のコードを見ていきましょう。

テネーブル(アイコン01)
// グローバル変数 wpdbクラスを宣言
global $wpdb;
// テーブル名の設定
$_table_name = $wpdb->prefix . 'customtable_sample';
// オプションの名前
$_option_name = 'test';
// オプションの値
$_option_value = maybe_serialize( 'データの値です' );
// replace関数の実行
$_result = $wpdb->replace(
	$_table_name,
	[
		'option_name'  => $_option_name,
		'option_value' => $_option_value,
	],
	[
		'%s',
		'%s',
	]
);
テネーブル

replace関数の第1引数として、テーブル名を指定しています。

これはデータを操作する対象のテーブル名を設定しています。カスタムテーブルだけではなく標準のテーブルを対象にも出来ますよ。

次の第2引数ではデータを追加・更新するカラム名と値を設定します。

maybe_serialize関数は、必要な場合にデータをシリアル化する関数です。配列などの値をシリアル化する事によりデータベースで保存できる値に変更しているのです。

最後の第3引数は、データのフォーマットとなります。書式の値は以下の通りになります。

テネーブル(アイコン01)

フォーマットで使える書式の値は:
%s – 文字列

%d – 整数(全部が数字)

%f – 浮動小数点数

WordPress Codexより
テネーブル

今回の値はシリアル化も行っておりますので文字列型となります。なので、フォーマットには%sを指定しています。

テネーブル(アイコン01)

insertやupdateは不要なの?

ルミェール

何故、insert関数やupdate関数を使わないの?

ルミェール(アイコン01)
テネーブル

正しく一意性を持つデータであれば、他に重複するデータが存在しない事からreplace関数であってもデータが置換されない為です。

今回はoption_nameは一意となるカラム名ですので、option_nameには同じ値が保存(データが重複)される事は、ありません。

そう言った場合はreplace関数を使う事も可能なのです。


しかし、設定するデータが重複する構造のデータであれば、replace関数ではすべてのデータが置換されてしまいますので、insert関数やupdate関数を正しく使う必要があります。

もし、複雑なテーブル構造を使用する場合はreplace関数を使用せずにトランザクション制御を行った上でinsert関数やupdate関数を使用した方が良いでしょう。

今回は、そう言った解説は行いません。それらは今後の記事で解説を行っていく予定です。

テネーブル(アイコン01)

動作の確認をしてみよう

ルミェール

この処理の実行だけを行うと、データベースにデータが生成されてるのが確認できるよ。
また、値を変更して実行してみると実際に変更された値が保存されるようになってるよね。

確認してみよう!

ルミェール(アイコン01)

テーブル内のデータを取得してみよう

テネーブル

テーブル内のデータを取得する為に、wpdbクラスではget_row関数やget_results関数等が用意されています。

一意性のデータであればデータは1つしか存在しませんので今回の場合であれば1つのデータを取得するget_row関数で取得が可能です。

今回は、get_row関数についてのみ解説しています。

複数のデータ取得に対応したget_results関数については次回以降の記事で解説します。

テネーブル(アイコン01)
global $wpdb;
// テーブル名の設定
$_table_name = $wpdb->prefix . 'customtable_sample';
// option_nameの値を設定
$_option_name = 'test';
// SQLクエリ文の設定
$_query = $wpdb->prepare(
"
	SELECT *
	FROM  %s
	WHERE option_name = %s
",
 	$_table_name,
	$_option_name
);
// get_row関数の実行を行い、_option_rowに結果を設定
$_option_row = $wpdb->get_row( $_query, ARRAY_A );
テネーブル

データを取得する為にはSELECTと言ったSQL構文を使用してSQLクエリ文の記述を行います。

しかしそのまま記述を行うと脆弱性対策が出来ません。その為、prepare関数によってSQLインジェクションなどの脆弱性対策を行いましょう。

prepare関数の書き方については詳細は次回以降の記事で解説していきますが、dbDelta関数のように制約があると思って良いです。SELECT文を1カラム1行で記述し、変数を文字フォーマット値で設定する形で覚えておけば良いでしょう。

テネーブル(アイコン01)
ルミェール

データが取得できない場合はNULL、取得できた場合はARRAY_Aを第2引数に設定していると連想配列で返却されるよ!

$_option_row[‘option_value’]のように各カラムの値が扱えるね!

ルミェール(アイコン01)

テーブル内のデータを削除してみよう

テネーブル

データを削除するにはwpdbクラスのdelete関数を使用します。

テネーブル(アイコン01)
global $wpdb;
// テーブル名の設定
$_table_name = $wpdb->prefix . 'customtable_sample';
// option_nameの値を設定
$_option_name = 'test';
// delete関数の実行
$_result = $wpdb->delete(
	$_table_name,
	[
		'option_name' => $_option_name
	],
	[
		'%s'
	]
);
テネーブル

このdelete関数は、指定した条件に一致するデータをすべて削除されますのでご注意ください。

条件はreplace関数などの指定方法とほぼ変わりません。

テネーブル(アイコン02)
ルミェール

標準で用意されているテーブルをテーブル名に指定して、テストなどはしないように注意しないとね!

重要なデータが消えてしまったら大変。

ルミェール(アイコン04)

データベース操作用のクラスを作ると便利

ルミェール

データベース操作を行う為のクラスを作ってると便利に使用出来るよ!
それもこの処理を基に作ってみると良いかも!

ルミェール(アイコン01)

サンプルコードのダウンロード

次回予告!

テネーブル

今回、割愛していたinsert関数とupdate関数をトランザクション制御する方法について解説します。

また、get_results関数を使用して複数のデータを処理してみましょう!

テネーブル(アイコン01)

今回の記事を振り返って

記事の難易度について(カスタムテーブル 第2回)

この記事はどうでしたか?

回答いただき、ありがとうございました!
回答結果は、次回の記事制作の参考にさせていただきます。

テネーブル

ご質問などはお問い合わせやTwitterのダイレクトメッセージ(DM)、Slackのプライベートメッセージなどでケミ宛に送ってください。回答をできる範囲で行っております。

テネーブル(アイコン01)