web-dev-qa-db-ja.com

$ wpdb-> last_errorはエラー時にクエリを表示しない

$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に変更したところ、挿入はエラーなしで成功しました。

1
Ghazanfar Mir

これを試して

$wpdb->show_errors();
$result = $wpdb->insert($this->table, $data_);
1
user5200704

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サーバに送信されなかったので)。

0
TheDeadMedic

https://core.trac.wordpress.org/ticket/323​​15

列の入力の1つが列より大きい場合があります。 Wordpressはこれを検出してもDBにクエリを送信しません。

そこのDiffは、last_errorメッセージの中でより多くの情報を得るために入れることができるwp-dbのためのパッチを示しているので、それは空にはならないでしょう。

enter image description here 

0
Liam Mitchell