Как обновить несколько строк с помощью $wpdb->update

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

Я создал динамические поля добавления/удаления на странице отправки постов на фронтенде. Используя $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, важно правильно настроить ваш цикл и убедиться, что вы обновляете каждую строку отдельно, используя уникальные идентификаторы. В вашем коде есть несколько проблем, которые могут приводить к тому, что обновляется только последняя запись.

Шаги для правильного обновления нескольких строк

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

  2. Обновление по уникальному ID: Каждое обновление должно происходить для каждого уникального идентификатора. Если у вас больше одного элемента, вам нужно перебрать их все.

  3. Код примера:
    Вот переработанный код, который должен помочь вам правильно обновить несколько строк в вашей таблице 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");
}

Разбор изменений

  1. Проверка наличия наград: Прежде чем мы начнем обновление, имеет смысл проверить, были ли найдены награды для проекта. Если результирующий массив пуст, можно вывести сообщение в логи для диагностики.

  2. Использование цикла for и корректное обращение к индексу: Внутри цикла мы используем индекс $i, чтобы получить уникальный ID для каждого обновления. Это позволяет вам обновлять каждую строку индивидуально.

  3. Функции очистки данных: Представленный код использует функции sanitize_text_field и sanitize_textarea_field, чтобы защищать входящие данные от XSS-уязвимостей, что очень важно для безопасности.

  4. Логгирование ошибок: Добавив механизмы логирования, вы можете быстро выявлять проблемы в процессе выполнения.

С учетом этих рекомендаций, у вас будет корректный и безопасный метод для обновления нескольких строк в базе данных с помощью $wpdb->update.

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

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