Как проверить успешность выполнения $wpdb->insert() в WordPress?

20 июл. 2016 г., 22:10:47
Просмотры: 16.5K
Голосов: 3

Я пытаюсь написать небольшой скрипт в своем footer.php (который позже преобразую в плагин), который отправляет два поля формы в пользовательскую таблицу (wp_newsletter). Форма уже отправляется и записывает данные в таблицу, но я не знаю, как отправить пользователю сообщение об успехе или ошибке. Мой текущий код выглядит так:

<form method="post">
  <input type="text" name="user_name">Имя
  <input type="text" name="user_email">Email
  <input type="submit">
  <?php echo $message;  ?>
</form>

<?php
global $wpdb;
$table   = $wpdb->prefix . "newsletter";
$name    = sanitize_text_field( $_POST["user_name"] );
$email   = sanitize_email( $_POST["user_email"] );
$message = "";


if( isset($_POST["submit"]) ) {
  if ( is_email($email) && isset($name)) {
    if ( $wpdb->insert( $table, array("name"  => $name, "email" => $email)) != false ) {
      $message = "Ваша подписка успешно отправлена.";
    }
  }
  else {
    if ( !is_email($email) ) {
        $message = "Некорректный email адрес.";
    } elseif ( !isset($name) ) {
        $message = "Поле имени обязательно для заполнения.";
    } else {
        $message = "Оба поля - имя и email - обязательны для заполнения.";
    }
  }
} else {
    $message = "Пожалуйста, попробуйте позже.";
}
?>


<?php wp_footer(); ?>

</body>
</html>

Я (думаю) правильно проверяю результат, согласно документации $wpdb, где сказано:

Эта функция возвращает false, если строка не может быть вставлена. В противном случае она возвращает количество затронутых строк (которое всегда будет равно 1).

3
Комментарии

Где вы хотели, чтобы сообщение появилось? У вас есть echo $message до того, как $message создана.

czerspalace czerspalace
20 июл. 2016 г. 22:22:24

Хм, я не был уверен, можно ли использовать это до объявления... Но я хотел показать его под формой.

vcamargo vcamargo
20 июл. 2016 г. 23:03:10

используйте !== FALSE и попробуйте

User User
21 июл. 2016 г. 05:24:07
Все ответы на вопрос 3
0

Возвращает либо количество вставленных строк, либо false в случае ошибки.

Можно получить ID вставленной записи или false, если вставка не удалась:

Ссылка для справки: https://developer.wordpress.org/reference/classes/wpdb/insert/#return

Таким образом, проверка может выглядеть следующим образом:

$result_check = $wpdb->insert( $table, array("name"  => $name, "email" => $email));
if($result_check){
   //успешно вставлено
}else{
  //что-то пошло не так
}
12 апр. 2019 г. 14:57:56
6

Когда я осознал, что PHP — это акроним для "PHP: Hypertext Preprocessor" (с акцентом на "препроцессор"), я наконец понял, что нельзя просто смешивать PHP и HTML и ожидать какой-либо интерактивности с пользователем. Когда веб-страница загружается, PHP генерирует HTML, который затем отображается браузером. Если пользователь совершает действие, на которое должен отреагировать PHP, это обязательно должно вызывать новую PHP/HTML страницу, чтобы обеспечить какой-то ответ. (Альтернативой может быть использование AJAX для обмена данными без загрузки новой страницы. WordPress хорошо работает с AJAX, и руководства можно легко найти через поиск в Google.)

Для простой формы, подобной вашей, я бы использовал JavaScript для проверки ошибок. Если форма не заполнена, предотвращайте её отправку с помощью JS. Если форма заполнена корректно, её действие (action) может указывать на .php файл, который выполняет вставку в базу данных и отображает сообщение об успехе/ошибке в HTML.

21 июл. 2016 г. 01:04:59
Комментарии

Спасибо за совет, scott. Как я могу создать такой .php файл, который будет отображать пользователю сообщение об успехе/ошибке?

vcamargo vcamargo
21 июл. 2016 г. 03:52:00

Извините за поздний ответ. В веб-среде я бы указал в атрибуте action формы файл .php. Данные отправляются через GET в целевой файл. Затем данные обрабатываются и вставляются в БД. После этого .php файл выводит HTML в новый веб-документ, который указывает на успех или ошибку. Обратите внимание, что это не дает пользователю много возможностей исправить ошибки для достижения лучшего результата после загрузки новой страницы.

scott scott
25 июл. 2016 г. 19:38:09

Однако в WordPress я бы рассмотрел возможность использования AJAX. Есть много хороших руководств, и я бы также посмотрел в Кодексе, но вот два, которые сработали у меня: https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/ и https://premium.wpmudev.org/blog/using-ajax-with-wordpress/

AJAX позволяет получать доступ к БД без загрузки новой веб-страницы. Так что у вас может быть элемент без HTML-содержимого до тех пор, пока AJAX не вернет результат об успехе/ошибке: document.getElementById("results-div").innerHTML = content.result;

scott scott
25 июл. 2016 г. 19:42:15

Логика обработки формы находится в том же файле, что и сама форма: footer.php. Я просто пытаюсь заставить это работать таким образом, а потом смогу разделить это лучше, когда закончу тесты. Несмотря на это, я не хочу отправлять данные моей формы через GET.

vcamargo vcamargo
25 июл. 2016 г. 23:09:00

Моя ошибка. Вы можете использовать POST. Похоже, вы хотите сделать AJAX внутри footer.php, чтобы не происходила перезагрузка страницы. Вам придется использовать javascript для отправки/получения данных AJAX, но вы можете создать новый .php файл для обработки AJAX-запроса. (Я размещаю свои .php файлы внутри плагина, чтобы все зависимости обрабатывались системой WP.)

scott scott
25 июл. 2016 г. 23:13:42

Спасибо, scott. Я почитаю, как правильно отправлять POST через AJAX внутри WP. Пока у меня нет представления.

vcamargo vcamargo
25 июл. 2016 г. 23:15:26
Показать остальные 1 комментариев
0

Я попал сюда через Google, и мне помогло использование свойств объекта $wpdb:

$wpdb->last_error 

показывает последнюю ошибку, если она есть

$wpdb->last_query 

показывает последний запрос, который вызвал указанную выше ошибку

17 янв. 2018 г. 15:17:17