Вопрос или проблема
Проект, над которым я работаю, имеет раздел входа для пользователей. После входа пользователь должен видеть список заказов, которые он сделал в прошлом, и которые хранятся в базе данных. Просмотр списка осуществляется с помощью функции 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". Затем сервер обрабатывает запрос и вставляет данные как новую строку в базу данных.
Основные проблемы в вашем коде:
- Элементы формы должны быть уникальными для каждого заказа в цикле, и для этого вы должны использовать скрытые поля
input
. Это позволит отправить специфичные для заказа данные при нажатии на соответствующую кнопку. - Все манипуляции с данными, включая вставку в базу, должны сопровождаться фильтрацией и валидацией ввода, чтобы обеспечить безопасность данных.
Пример (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 повышает качество программного обеспечения и снижает вероятность ошибок в процессе эксплуатации. Следуя этим рекомендациям, вы создаете надёжное и эффективное решение для повторного бронирования прошлых заказов.