Вопрос или проблема
Я создал динамические поля добавления/удаления на странице отправки постов на фронтенде. Используя $wpdb->insert, система работает отлично.
Я также создал страницу редактирования черновика на фронтенде. На этой странице я хочу, чтобы эти динамические поля обновлялись. Я пробовал $wpdb->update, но он обновляет только последнее поле. Короче говоря, я хочу обновлять несколько строк по одному клику.
мой код:
$project_id = $_SESSION['project_id'];
global $wpdb;
$reward_ids = $wpdb->get_results("SELECT * FROM wpxa_rewards WHERE project_id = $project_id");
foreach($reward_ids as $reward_id); $r_id = $reward_id->ID;
$count = count( $project_reward_title );
for ( $i = 0; $i < $count; $i++ ) {
global $wpdb;
$wpdb->update( 'wpxa_rewards',
array(
'reward_title' => "$project_reward_title[$i]",
'reward_description' => "$project_reward_description[$i]",
'reward_amount' => "$project_reward_amount[$i]",
'reward_shipping' => "$project_reward_shipping[$i]",
'est_date' => "$project_est_date[$i]"
),
array( 'ID' => $r_id ),
array(
'%s',
'%s',
'%d',
'%s',
'%s'
),
array( '%d' )
);
}
Пожалуйста, помогите.. Спасибо
Это немного наугад, но я довольно уверен, что проблема в вашем цикле foreach. Он сломан (он ничего не выполнит, потому что затрагивается только пустое выражение (;
), и, вероятно, вы захотите, чтобы у него был блок, содержащий остальной код.
В качестве примера:
<?php
foreach(array(1, 2, 3) as $test);
print $test . "\n";
выведет только 3, в то время как
<?php
foreach(array(1, 2, 3) as $test) // обратите внимание на отсутствие точки с запятой.
print $test . "\n";
выведет строку для 1, 2 и 3. Как общее правило, я рекомендую всегда явно указывать, что вы хотите повторять в цикле. Используйте фигурные скобки, например:
<?php
foreach(array(1, 2, 3) as $test) {
print $test . "\n";
}
Это легко читать и защищает вас от подобных ошибок. Если вам нужно добавить другую строку в цикл, просто добавьте ее перед закрывающими фигурными скобками.
Этот код, вероятно, будет тем, что вам нужно.
$project_id = $_SESSION['project_id'];
global $wpdb;
$reward_ids = $wpdb->get_results("SELECT * FROM wpxa_rewards WHERE project_id = $project_id");
foreach($reward_ids as $reward_id) {
$r_id = $reward_id->ID;
$count = count( $project_reward_title );
for ( $i = 0; $i < $count; $i++ ) {
$wpdb->update( 'wpxa_rewards',
array(
'reward_title' => $project_reward_title[$i],
'reward_description' => $project_reward_description[$i],
'reward_amount' => $project_reward_amount[$i],
'reward_shipping' => $project_reward_shipping[$i],
'est_date' => $project_est_date[$i]
),
array( 'ID' => $r_id ),
array(
'%s',
'%s',
'%d',
'%s',
'%s'
),
array( '%d' )
);
}
}
Ответ или решение
Для обновления нескольких строк в базе данных WordPress с использованием $wpdb->update
, важно правильно настроить ваш цикл и убедиться, что вы обновляете каждую строку отдельно, используя уникальные идентификаторы. В вашем коде есть несколько проблем, которые могут приводить к тому, что обновляется только последняя запись.
Шаги для правильного обновления нескольких строк
-
Использование правильного цикла: Необходимо правильно организовать цикл, чтобы обновления проходили для каждого элемента. Ваша исходная конструкция
foreach
имеет неправильную синтаксическую структуру, и в итоге обновляется только последний элемент. -
Обновление по уникальному ID: Каждое обновление должно происходить для каждого уникального идентификатора. Если у вас больше одного элемента, вам нужно перебрать их все.
-
Код примера:
Вот переработанный код, который должен помочь вам правильно обновить несколько строк в вашей таблицеwpxa_rewards
.
$project_id = $_SESSION['project_id'];
global $wpdb;
// Получаем все награды для данного проекта
$reward_ids = $wpdb->get_results("SELECT * FROM wpxa_rewards WHERE project_id = $project_id");
// Проверяем, были ли найдены награды
if ($reward_ids) {
$count = count($project_reward_title); // Количество наград для обновления
for ($i = 0; $i < $count; $i++) {
// Используем ID для обновления конкретной записи
$r_id = $reward_ids[$i]->ID;
// Обновляем данные в таблице
$wpdb->update(
'wpxa_rewards',
array(
'reward_title' => sanitize_text_field($project_reward_title[$i]),
'reward_description' => sanitize_textarea_field($project_reward_description[$i]),
'reward_amount' => intval($project_reward_amount[$i]),
'reward_shipping' => sanitize_text_field($project_reward_shipping[$i]),
'est_date' => sanitize_text_field($project_est_date[$i])
),
array('ID' => $r_id),
array(
'%s',
'%s',
'%d',
'%s',
'%s'
),
array('%d')
);
}
} else {
// Логируем информацию, если наград не найдено
error_log("No rewards found for project ID: $project_id");
}
Разбор изменений
-
Проверка наличия наград: Прежде чем мы начнем обновление, имеет смысл проверить, были ли найдены награды для проекта. Если результирующий массив пуст, можно вывести сообщение в логи для диагностики.
-
Использование цикла
for
и корректное обращение к индексу: Внутри цикла мы используем индекс$i
, чтобы получить уникальныйID
для каждого обновления. Это позволяет вам обновлять каждую строку индивидуально. -
Функции очистки данных: Представленный код использует функции
sanitize_text_field
иsanitize_textarea_field
, чтобы защищать входящие данные от XSS-уязвимостей, что очень важно для безопасности. -
Логгирование ошибок: Добавив механизмы логирования, вы можете быстро выявлять проблемы в процессе выполнения.
С учетом этих рекомендаций, у вас будет корректный и безопасный метод для обновления нескольких строк в базе данных с помощью $wpdb->update
.