WordPress

最終更新日:
公開日:

レシピ

wpdbクラスを使ってデータを更新する

WordPressが標準で用意しているwpdbクラスを使って、データベースに登録されているデータを更新する方法を解説します。

この記事のポイント

  • データの更新はwpdbクラスupdateメソッドを使う
  • updateメソッドは内部で自動的にプリペアドステートメントを実行する

wpdbクラスを使ってデータを更新する

WordPressでデータベースの操作を行うインターフェースを提供するwpdbクラスは、データベースに登録されているデータを更新するためのupdateメソッドが用意されています。

updateメソッドはパラメータを先頭から順に(1)テーブル名(文字列)、(2)更新するカラム名と値のペア(配列)、(3)更新するデータを特定する条件(配列)、(4)登録するデータタイプ(配列)、(5)条件のデータタイプを指定します。
(4)と(5)はオプションですが、指定しなかった場合は全て文字列(%s)として扱われるため、できるだけ指定するようにした方が確実です。

以下の例ではテーブル「table_name」に登録されているidカラム5のデータを更新します。

index.php

<?php

global $wpdb;
$res = null;

// 現在の日付を取得
$current_datetime = date('Y-m-d H:i:s');

$res = $wpdb->update(
    'table_name',
    array(
        'comment' => '更新してみよう',
        'updated' => $current_datetime
    ),
    array(
        'id' => 5
    ),
    array(
        '%s',
        '%s'
    ),
    array(
        '%d'
    )
);

if( 1 <= $res ) {
    // 更新に成功
} else {
    // 更新に失敗
}

第2パラメータとして渡す登録するデータは連想配列で「カラム名 => 値」のペアを指定します。
第4パラメータの配列ではこの第2パラメータの値の形式を指定し、文字列の「%s」、整数の「%d」、浮動小数点数の「%f」のいずれかを指定します。
この2つのパラメータは先頭から順番を対応させる必要があります。

第3パラメータは更新するデータを特定する条件を、「カラム名 => 値」のペアで指定します。
SQLのWHERE句に該当します。
第5パラメータの配列はこの第3パラメータの値の形式を指定します。

updateメソッドは更新を成功すると更新した行数を整数で返し、更新するデータが見つからなかったときは整数の0を返します。
また、SQLなどのエラーで正常に実行できなかったときはfalseを返します。
更新する行数が複数ある場合もあるため、更新が成功したときの判定は「1 <= $res」のように1つ以上の行数を更新したか確認するようにします。

プリペアドステートメントについて

wpdbクラスはSQLインジェクション対策のプリペアドステートメントを使用するためのprepareメソッドが用意されていますが、updateメソッドは内部で自動的にprepareメソッドを使うように実装されているため、あえて手動でプリペアドステートメントを実行する必要はありません。

より具体的には、updateメソッド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 update( $table, $data, $where, $format = null, $where_format = null ) {
	if ( ! is_array( $data ) || ! is_array( $where ) ) {
		return false;
	}

	$data = $this->process_fields( $table, $data, $format );
	if ( false === $data ) {
		return false;
	}
	$where = $this->process_fields( $table, $where, $where_format );
	if ( false === $where ) {
		return false;
	}

	$fields     = array();
	$conditions = array();
	$values     = array();
	foreach ( $data as $field => $value ) {
		if ( is_null( $value['value'] ) ) {
			$fields[] = "`$field` = NULL";
			continue;
		}

		$fields[] = "`$field` = " . $value['format'];
		$values[] = $value['value'];
	}
	foreach ( $where as $field => $value ) {
		if ( is_null( $value['value'] ) ) {
			$conditions[] = "`$field` IS NULL";
			continue;
		}

		$conditions[] = "`$field` = " . $value['format'];
		$values[]     = $value['value'];
	}

	$fields     = implode( ', ', $fields );
	$conditions = implode( ' AND ', $conditions );

	$sql = "UPDATE `$table` SET $fields WHERE $conditions";

	$this->check_current_query = false;
	return $this->query( $this->prepare( $sql, $values ) );
}

上記のようにupdateメソッドは最後のreturnの部分でprepareメソッドqueryメソッドを実行していることが分かります。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。

前のページへ 一覧に戻る 次のページへ