Как получить сообщения об ошибках, когда $wpdb->insert() возвращает false?
$wpdb->insert()
возвращает false
, что, как я узнал, означает, что вставка не удалась. Теперь я хотел бы знать, почему происходит сбой при вставке.
Согласно этому тикету https://core.trac.wordpress.org/ticket/32315 проблема может быть в том, что значение либо слишком длинное, либо содержит недопустимые символы.
Вот запрос на вставку:
$result = $wpdb->insert('table', $ins_args, array('%d', '%d', '%s', '%s', '%s', '%s'));
Сложно показать значения массива $ins_args
, так как некоторые значения довольно длинные. Особенно для поля с названием value
. Но я использую тип longtext
для этого поля. И эта вставка используется часто. И в большинстве случаев она работает успешно. Поэтому действительно похоже на проблему с кодировкой или размером.
Как мне узнать, в чем проблема? $wpdb->last_error
пустой

Метод $wpdb->insert()
возвращает false
, если строка не была вставлена. В противном случае он возвращает количество затронутых строк (которое всегда будет равно 1).
Вы можете включать и выключать отображение ошибок с помощью методов show_errors
и hide_errors
соответственно.
<?php $wpdb->show_errors(); ?>
<?php $wpdb->hide_errors(); ?>
Также можно вывести ошибку (если она есть), сгенерированную последним запросом, с помощью метода print_error
.
<?php $wpdb->print_error(); ?>
Вы также можете использовать поле $last_error
, которое будет содержать текст последней ошибки, сгенерированной MySQL.

Было бы полезно увидеть пример поля $last_error
. Это просто $wpdb->last_error
?

К сожалению, wp-db.php
возвращает false без ошибки, если данные, которые вы пытаетесь записать в столбец, слишком длинные и не помещаются. Это превращается в кошмар при отладке без явной проверки длины каждого столбца (хотя узнать длины сложно, хотя wp-db.php предоставляет внутренние функции).
Я создал небольшой переопределяющий файл, который изменяет поведение wpdb, чтобы возвращать ошибку в этом сценарии. Чтобы установить его, вам просто нужно скопировать и вставить его в файл WordPress wp-content/db.php. Он переопределяет только один короткий метод wpdb (process_fields()
), чтобы добавить сообщение об ошибке, идентифицирующее слишком длинный столбец. Обратите внимание, что db.php сохранится при обновлениях ядра, и вы можете просто удалить файл wp-content/db.php в любое время, чтобы вернуться к чистому wpdb из ядра.
Хотя я сам использую это, как обычно, протестируйте перед использованием, и использование осуществляется на ваш страх и риск.
Код ошибки изначально взят из идеи Лиама Мерфи здесь.

Наконец исправлено в WordPress v5.9. https://core.trac.wordpress.org/ticket/32315#comment:82
