最終更新日:
公開日:
レシピ
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メソッドを実行していることが分かります。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。