最終更新日:
公開日:
レシピ
wpdbクラスを使ってデータを削除する
WordPressが標準で用意しているwpdbクラスを使って、データベースに登録されているデータを削除する方法について解説します。
この記事のポイント
- データの削除はwpdbクラスのdeleteメソッドを使う
- deleteメソッドは内部で自動的にプリペアドステートメントを実行する
wpdbクラスを使ってデータを削除する
WordPressでデータベースの操作を行うインターフェースを提供するwpdbクラスは、データベースに登録されているデータを削除するためのdeleteメソッドが用意されています。
deleteメソッドはパラメータを先頭から順に(1)テーブル名(文字列)、(2)削除するデータを特定する条件(配列)、(3)条件のデータタイプを指定します。
(3)はオプションですが、指定しなかった場合は全て文字列(%s)の形式として扱います。
以下の例ではテーブル「table_name」に登録されているidカラムが100のデータを削除します。
index.php
<?php
global $wpdb;
$res = null;
$res = $wpdb->delete(
'table_name',
array(
'id' => 100
),
array(
'%d'
)
);
if( 1 <= $res ) {
// 削除に成功
} else {
// 削除に失敗
}
第2パラメータで削除するデータを特定するための条件を連想配列を使って「カラム名 => 値」のペアで指定します。
SQLのWHERE句に該当します。
第3パラメータの配列ではこの第2パラメータの値の形式を指定し、文字列の「%s」、整数の「%d」、浮動小数点数の「%f」のいずれかを指定します。
条件が複数あるとき、この2つのパラメータは先頭から順番を対応させる必要があります。
deleteメソッドは削除に成功すると削除した行数を整数で返し、もし削除するデータが見つからなかったときは整数の0を返します。
また、SQLなどのエラーで正常に実行できなかったときはfalseを返します。
そのため、削除が成功したときの判定は削除したデータが複数ある場合も考慮して「1 <= $res」のように1つ以上の行数を削除したか確認するようにします。
プリペアドステートメントについて
wpdbクラスはSQLインジェクション対策のプリペアドステートメントを使用するためのprepareメソッドが用意されていますが、deleteメソッドは内部で自動的にprepareメソッドを使うように実装されているため、あえて手動でプリペアドステートメントを実行する必要はありません。
より具体的には、deleteメソッドはwp-includes/wp-db.phpで以下のように実装されています。
wp-includes/wp-db.php
<?php
/**
* WordPress database access abstraction class
*
* Original code from {@link http://php.justinvincent.com Justin Vincent (justin@visunet.ie)}
*
* @package WordPress
* @subpackage Database
* @since 0.71
*/
---- 省略 -----
public function delete( $table, $where, $where_format = null ) {
if ( ! is_array( $where ) ) {
return false;
}
$where = $this->process_fields( $table, $where, $where_format );
if ( false === $where ) {
return false;
}
$conditions = array();
$values = array();
foreach ( $where as $field => $value ) {
if ( is_null( $value['value'] ) ) {
$conditions[] = "`$field` IS NULL";
continue;
}
$conditions[] = "`$field` = " . $value['format'];
$values[] = $value['value'];
}
$conditions = implode( ' AND ', $conditions );
$sql = "DELETE FROM `$table` WHERE $conditions";
$this->check_current_query = false;
return $this->query( $this->prepare( $sql, $values ) );
}
上記のようにdeleteメソッドは最後のreturnの部分でprepareメソッドとqueryメソッドを実行していることが分かります。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。