URLをコピーしました!
スキルアップを始める!

【WordPress】SQLのクエリ内で変数のデータを渡す方法|PHP&SQL

WordPress(ワードプレス)
\ワードプレスのスキルアップはこちら!/ WordPress入門読本

ワードプレスのデータベース内で、例えば「クエリの中に変数の値を渡したい」と思った時に、これ一体どうやれば…?というところで躓いたいので、まとめてみました。

クエリでレコード数を抽出する(num_rows)

こちらは前回のおさらいですが、クエリを使ってレコード数を取得する時にはnum_rowsを使って取得することができました。

$query = 'SELECT * FROM wp_posts WHERE post_author=15';
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;

クエリに変数を渡す時は…?

例えば「ログインユーザーの投稿数を取得したい」と思った時には、クエリのWHEREの中に変数を入れる方法を思いつきましたが(きっと他にもあるだろうとは思いますが…!)、これ一体どうやれば?ということで躓きました。

はて・・・ここから、どうやってpost_authorに渡せば?

$uu_id = get_current_user_id();
echo "ユーザーID:";
echo $uu_id;
echo "<br>";
$query = 'SELECT * FROM wp_posts WHERE post_author=15';
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;

ということで、色々と試してみたいと思います。

[rml_read_more]

そのまま渡してもダメな様子

とりあえず変数を渡せないのかな…?と思って渡してみたところ、ダメでした。

$uu_id = get_current_user_id();
echo "ユーザーID:";
echo $uu_id;
echo "<br>";
$query = 'SELECT * FROM wp_posts WHERE post_author=$uu_id';
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;

レコード数は4つあるはずですが・・・0となりました。

区切ってカンマで連結

変数をつなげる時は「.(カンマ)」で区切って、連結させることで読み込むことができます。

$uu_id = get_current_user_id();
echo "ユーザーID:";
echo $uu_id;
echo "<br>";
$query = 'SELECT * FROM wp_posts WHERE post_author='.$uu_id;
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;

できました・・・!!

prepare処理をした方がよさそう

話はこれで終わり…でしたが、追記です。mysqlへの変数データの受け渡しはprepare処理をした方が良さそうです。というのもユーザーが入力をしてクエリを実行する場合に、そのまま変数を受け渡すと、SQLで悪意のある処理を実行できてしまうためです。

‘prepare’ メソッドを使うのは、不正な操作や不正な文字を処理しないためです

SQL インジェクション攻撃からクエリを保護するためには、実行する前にクエリデータをすべて SQL エスケープする必要があります。 WordPress では prepare メソッドがこの機能を提供します。

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

ということで、下記のように変えてみました(合ってるのかな…?)。

$uu_id = get_current_user_id();
echo "ユーザーID:";
echo $uu_id;
echo "<br>";
$sql = 'SELECT * FROM wp_posts WHERE post_author = %d';
$query = $wpdb->prepare($sql,$uu_id);
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;

出力結果

レコード数が取れました!

まとめ

ということで、SQLインジェクション対策で最後追記してみましたが、このような感じでユーザーデータや特定の条件のデータをデータベースから抽出することができました。次回は別の抽出パターンなども色々と試していきたいと思います。

ご参考ください😃

Kindle Unlimited 会員は無料で購読できます
購読はこちら
Kindle Unlimited 会員は無料で購読できます
購読はこちら