$wpdb->insert
を使用してカスタムテーブルにデータを挿入しています。しかし、エラーが発生した場合、私は$wpdb->last_error
から情報を得ていないようです。この原因は何でしょうか。
私はすでにこの設定をwp-config
に設定しています
define('WP_DEBUG', false);
define('SAVEQUERIES', true);
コードは以下のとおりです。
$result = $wpdb->insert($this->table, $data_);
if (false === $result) {
error_log($wpdb->last_error);
}
$this->table
および$data_
は、正常に実行されたときに正しく取り込まれます。しかし、失敗したクエリに関する情報は得られないようです。実際のクエリを$wpdb->insert
で実行する方法はありますか。
解決策
それで私は問題を解明しました。列データの1つが巨大でデータベースの列サイズを超えているため、挿入クエリは失敗しました。列はvarchar(500)
でしたが、実際のデータは500文字を超えているため、クエリは失敗しました。列をTEXT
に変更したところ、挿入はエラーなしで成功しました。
これを試して
$wpdb->show_errors();
$result = $wpdb->insert($this->table, $data_);
query が必要な場合、それは$wpdb->last_query
になります(SAVEQUERIES
も必要ありません。 every query($wpdb->queries
)のログが必要な場合のみです)。
last_error
は...えーと、エラーです!
更新: / last_error
が空である可能性のある説明 - これがwpdb::query()
のソースです:
// If we're writing to the database, make sure the query will write safely.
if ( $this->check_current_query && ! $this->check_ascii( $query ) ) {
$stripped_query = $this->strip_invalid_text_from_query( $query );
// strip_invalid_text_from_query() can perform queries, so we need
// to flush again, just to make sure everything is clear.
$this->flush();
if ( $stripped_query !== $query ) {
$this->insert_id = 0;
return false;
}
}
// Redacted code
// Keep track of the last query for debug..
$this->last_query = $query;
$this->_do_query( $query );
// Redacted code
// If there is an error then take note of it..
if ( $this->use_mysqli ) {
$this->last_error = mysqli_error( $this->dbh );
} else {
$this->last_error = mysql_error( $this->dbh );
}
言い換えれば、WordPressは先を見越してクエリをチェックし、失敗すると思われる場合は中止するようです - この場合あなたはreturn false
を取得しますが、エラーは設定されません(MySQLサーバに送信されなかったので)。
https://core.trac.wordpress.org/ticket/32315
列の入力の1つが列より大きい場合があります。 Wordpressはこれを検出してもDBにクエリを送信しません。
そこのDiffは、last_errorメッセージの中でより多くの情報を得るために入れることができるwp-dbのためのパッチを示しているので、それは空にはならないでしょう。