Обновление из нескольких настраиваемых таблиц массивов

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

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

<input type="hidden" name="file_id[]" value="<?php echo $file_id; ?>"/><input type="text" class="" name="files[]" id="files" value="<?php echo $file_name; ?>" /></p>

Форма затем передаётся следующему коду

   if(isset($_POST['BIM-link'])){
$bim_link = ($_POST['BIM_link'] );

}

if(isset($_POST['BIM'])){
$bim = ($_POST['BIM'] );//echo $bim;

}
$bim_id = $_POST['bim_id'] ;//echo $bim_id;
    }

$total = count($_POST['bim_name']);
 for($i = 0; $i < $total; $i++) {
 $bim = $_POST['BIM'] [$i];
  $bim_link = $_POST['BIM_link'] [$i];
  $bim_id=$_POST['bim_id'] [$i];
  $wpdb->update( 'vo_wp_autodesk', array ('autodesk'=>$bim,'autodesk_link'=>$bim_link),array( 'id' => $bim_id));}

это отлично работает для вставки, так что я упускаю здесь.
В рамках тестирования я убрал оператор for и задал значения жестко – поэтому запрос обновления действительно работает

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

Обновление пользовательской таблицы с использованием данных из нескольких массивов может быть сложной задачей, особенно если вы работаете с формой, которая передает данные в качестве массивов. В данном примере рассмотрим несколько аспектов, которые могут быть полезны в понимании процесса обновления таблицы базы данных WordPress (с помощью $wpdb) из форм, полученных через POST-запрос.

Теория

Когда дело доходит до работы с массивами POST-запроса в PHP, важно правильно обрабатывать передаваемые данные. Если вашему приложению необходимо обновить данные в базе данных, убедитесь, что вы:

  1. Получаете и Проверяете Данные: Каждый массив данных должен быть надежно получен и проверен. Это включает в себя проверку существования переменной с помощью isset() и удостоверение в том, что каждый элемент массива содержит ожидаемое значение.

  2. Безопасность SQL: SQL-инъекции представляют собой серьезную угрозу, поэтому всегда следует использовать подготовленные запросы или функции $wpdb, которые автоматически экранируют входные данные.

  3. Синхронизация Данных: Когда обновляется несколько записей в таблице, убедитесь в том, что количество элементов в массиве совпадает, чтобы избежать ошибок. Длина массивов bim, bim_link и bim_id должна быть одинаковой.

Пример

Рассмотрим пример, представленный в вашем запросе, и проанализируем его:

if(isset($_POST['BIM-link'])){
  $bim_link = ($_POST['BIM_link']);
}

if(isset($_POST['BIM'])){
  $bim = ($_POST['BIM']);
}
$bim_id = $_POST['bim_id'];

Здесь данные получены из POST массива, и если все переменные существуют, происходит их обработка. Однако обратите внимание, что:

  • Следует предварительно убедиться в том, что переменные bim, bim_link, и bim_id действительно массивы. Это важное условие для правильного использования в цикле for.

  • В примере используется метод $wpdb->update для обновления данных в таблице vo_wp_autodesk. Важно, чтобы массивы были синхронизированы по длине.

Применение

Теперь перейдем к исправлениям и улучшениям вашего кода:

  1. Валидация и синхронизация данных:

    Убедитесь, что массивы синхронизированы:

    if (count($_POST['BIM']) === count($_POST['BIM_link']) && count($_POST['BIM']) === count($_POST['bim_id'])) {
       $total = count($_POST['BIM']);
    } else {
       // Обработка ошибки, если массивы не равны по длине
       die('Ошибка: Массивы не синхронизированы.');
    }
  2. Экранирование данных и обновление:

    Используйте $wpdb->prepare для безопасного выполнения запросов:

    for($i = 0; $i < $total; $i++) {
       $bim = sanitize_text_field($_POST['BIM'][$i]);
       $bim_link = sanitize_text_field($_POST['BIM_link'][$i]);
       $bim_id = intval($_POST['bim_id'][$i]);
    
       $result = $wpdb->update(
           'vo_wp_autodesk',
           array(
               'autodesk' => $bim,
               'autodesk_link' => $bim_link,
           ),
           array('id' => $bim_id),
           array('%s', '%s'),
           array('%d')
       );
    
       if ($result === false) {
           // Обработка возможной ошибки обновления
           error_log('Ошибка обновления записи ' . $bim_id);
       }
    }

    В данном коде используется sanitize_text_field для очистки текста и intval для преобразования идентификатора в целое число, что снижает риск SQL-инъекций и обеспечивает безопасное обновление данных в таблице.

Заключение

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

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

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