Выберите данные из цикла foreach и отправьте их в базу данных WordPress.

Вопрос или проблема

Проект, над которым я работаю, имеет раздел входа для пользователей. После входа пользователь должен видеть список заказов, которые он сделал в прошлом, и которые хранятся в базе данных. Просмотр списка осуществляется с помощью функции foreach. В этом случае пользователь должен иметь возможность повторно забронировать любой из предыдущих заказов одним кликом, и те же данные должны быть отправлены обратно в базу данных в виде новой строки или дублирования той же строки с новым идентификатором. Мой код выглядит так:

<form method="post" action="">           
 foreach ( $row as $row ){ ?>
    <div> Предыдущая поездка из:
    <?php echo $row-> your_departing .' до : '.$row-> your_destination; ?>
    <?php $depart = $row-> your_departing;
          $dest = $row-> your_destination;
          ?>
      <button type="submit" name="rebook" class="signupbtn">REBOOK</button>
    </div>

<?php  }    ?>
</form>

 if ( isset( $_POST["rebook"] ) != "" ) {
      $table = $wpdb->prefix."Savedata";
      $wpdb->insert(
          $table,
          array(
              'your_destination' => $dest,
              'your_departing' => $depart
          )
      );
  }
 ?>

Я написал этот код для вставки данных как новой строки.
Не хватает ли мне чего-то в этом коде? Можете предложить простой способ сделать это? Любая помощь будет полезна. Спасибо

Чтобы вставить что-то в базу данных, нужно отправить данные с помощью POST-запроса, получить эти данные из запроса и сохранить их. Вы создали код, который будет вставлять последнюю строку вашего цикла по запросу POST.

Вы должны создать форму для каждой из ваших предыдущих поездок и добавить скрытые поля ввода, чтобы иметь возможность получить их по запросу POST.

<?php
    // Обработка запроса и сохранение в базу данных не должны находиться в шаблоне,
    // но для простоты примера я оставлю это здесь.
    if( isset( $_POST['rebook'] ) ) {

        // Получить значение из массива $_POST безопасным способом после очистки
        $destination = filter_input( INPUT_POST, 'destination', FILTER_SANITIZE_STRING );
        $departing   = filter_input( INPUT_POST, 'departing', FILTER_SANITIZE_STRING );

        $table = $wpdb->prefix . "table_name";
        $wpdb->insert(
            $table,
            array(
              'your_destination' => $destination,
              'your_departing' => $departing
            )
        );
    }
?>
 <?php $rows = array(); // Получите данные из базы данных ?>
 <?php foreach ( $rows as $row ): // Итерация данных ?>
    <?php
        // Создайте форму для каждой предыдущей поездки, чтобы
        // была возможность сохранить каждую
    ?>
    <form method="post" action="">
        <div> Предыдущая поездка из:

          <?php echo $row->your_departing .' до : '.$row->your_destination; ?>
          <?php // Создайте скрытые поля, чтобы отправлять 'departing' и 'destination' с $_POST данными ?>
          <input type="hidden" name="departing" value="<?php esc_attr( $row->your_departing ); ?>">
          <input type="hidden" name="destination" value="<?php esc_attr( $row->your_destination ); ?>">

          <button type="submit" name="rebook" class="signupbtn">REBOOK</button>

        </div>
    </form>
<?php endforeach; ?>

Есть более лучший способ сделать это. Ваш подход не является неправильным. Но вы можете написать код так, чтобы вставить данные, передавая третий аргумент $format в $wpdb->insert. Это будет более безопасно.

    if ( empty( $row->your_departing ) || empty( $row->your_destination ) ) {
        return; // Вернуть, если your_departing или your_destination одно из этих полей пустое
    }

    $defaults = array(
        'your_destination' => '',
        'your_departing'  => '',
    );

    $args = array(
        'your_destination' => $row->your_departing;
        'your_departing' => $row->your_destination;
    );

    $data = wp_parse_args( $args, $defaults );

    $wpdb->insert(
            $wpdb->prefix . 'Savedata',
            $data,
            array(
                '%s',
                '%s',
            )
    ); // %s обеспечивает, что эти два значения будут строками

Вы можете посмотреть документацию здесь для получения более подробной информации.

.

Ответ или решение

Когда речь идет о программировании на PHP в контексте WordPress, особенно с использованием глобального объекта $wpdb, важно обеспечивать безопасность, эффективность и читаемость кода. Рассмотрим, как корректно реализовать вставку данных из цикла foreach в базу данных WordPress.

Теория (T)

Вы используете цикл foreach для отображения списка прошлых заказов, которые пользователи могут повторно бронировать. Чтобы сделать это, необходимо собрать данные о заказе и отправить их на сервер с помощью POST-запроса при нажатии кнопки "REBOOK". Затем сервер обрабатывает запрос и вставляет данные как новую строку в базу данных.

Основные проблемы в вашем коде:

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

Пример (E)

Вот пример правильной реализации:

<?php
// Обработка данных после отправки формы
if ( isset( $_POST['rebook'] ) ) {
    // Получаем и безопасно очищаем данные из POST запроса
    $destination = filter_input( INPUT_POST, 'destination', FILTER_SANITIZE_STRING );
    $departing = filter_input( INPUT_POST, 'departing', FILTER_SANITIZE_STRING );

    // Проверка на пустые значения
    if ( empty( $departing ) || empty( $destination ) ) {
        return; // Выход, если одно из полей пустое
    }

    // Вставка данных в базу данных
    $table = $wpdb->prefix . "Savedata";
    $wpdb->insert(
        $table,
        array(
            'your_destination' => $destination,
            'your_departing' => $departing
        ),
        array(
            '%s',
            '%s'
        ) // Указываем, что оба значения - строки
    );
}
?>

<!-- Цикл для вывода форм -->
<?php foreach ( $rows as $row ): ?>
    <form method="post" action="">
        <div>Прошлая поездка из:
            <?php echo esc_html($row->your_departing) . ' в: ' . esc_html($row->your_destination); ?>

            <!-- Скрытые поля для передачи данных о поездке -->
            <input type="hidden" name="departing" value="<?php echo esc_attr( $row->your_departing ); ?>">
            <input type="hidden" name="destination" value="<?php echo esc_attr( $row->your_destination ); ?>">

            <button type="submit" name="rebook" class="signupbtn">REBOOK</button>
        </div>
    </form>
<?php endforeach; ?>

Применение (A)

Применение этого подхода гарантирует, что ваша система будет не только функциональной, но и безопасной. Используя фильтрацию и валидацию входящих данных, вы снижаете риск атак, таких как XSS и SQL Injection. Формирование форм на каждой итерации цикла foreach и применение скрытых полей позволяет четко и безопасно ассоциировать каждую кнопку "REBOOK" с конкретными данными поездки.

Подробная проработка процессов получения, обработки и сохранения данных в WordPress повышает качество программного обеспечения и снижает вероятность ошибок в процессе эксплуатации. Следуя этим рекомендациям, вы создаете надёжное и эффективное решение для повторного бронирования прошлых заказов.

Оцените материал
Добавить комментарий

Капча загружается...