WordPress

最終更新日:
公開日:

レシピ

wpdbクラスを使ってデータを登録する

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

この記事のポイント

  • 新しいデータの登録はwpdbクラスinsertメソッドを使う
  • 登録したデータのidはwpdbクラスinsert_idから取得する
  • insertメソッドは内部で自動的にプリペアドステートメントを実行する

wpdbクラスを使ってデータを登録する

WordPressでデータベースの操作を行うインターフェースを提供するwpdbクラスは、データベースに新しくデータを登録するためのinsertメソッドが用意されています。
insertメソッドはパラメータで先頭から順に(1)テーブル名(文字列)、(2)登録するデータ(配列)、(3)登録するデータタイプ(配列)を指定します。

以下の例ではテーブル「table_name」にデータを登録します。

index.php

<?php

global $wpdb;

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

$wpdb->insert(
    'table_name',
    array(
        'category' => 5,
        'comment' => 'テストだよ',
        'status_flag' => 1,
        'updated' => $current_datetime,
        'created' => $current_datetime
    ),
    array(
        '%d',
        '%s',
        '%d',
        '%s',
        '%s'
    )
);

// 登録したidを取得
$id = $wpdb->insert_id;

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

insertメソッドは登録に成功すると登録した行数を整数で返し、失敗したときはfalseを返します。
登録する行数は1つなので、成功したときは常に整数で1を返します。

また、テーブルの主キーが自動連番(AUTO_INCREMENT)のときは、wpdbクラスinsert_idプロパティから登録したidを取得することができます。
このプロパティには登録に失敗している場合は0が入ります。

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

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

より具体的には、insertメソッド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 insert( $table, $data, $format = null ) {
	return $this->_insert_replace_helper( $table, $data, $format, 'INSERT' );
}

---- 省略 -----

public function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) {
	$this->insert_id = 0;

	if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ), true ) ) {
		return false;
	}

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

	$formats = array();
	$values  = array();
	foreach ( $data as $value ) {
		if ( is_null( $value['value'] ) ) {
			$formats[] = 'NULL';
			continue;
		}

		$formats[] = $value['format'];
		$values[]  = $value['value'];
	}

	$fields  = '`' . implode( '`, `', array_keys( $data ) ) . '`';
	$formats = implode( ', ', $formats );

	$sql = "$type INTO `$table` ($fields) VALUES ($formats)";

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

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

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