Вопрос или проблема
Это похоже на вопрос, с которым мне недавно помог 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, важно правильно обрабатывать передаваемые данные. Если вашему приложению необходимо обновить данные в базе данных, убедитесь, что вы:
-
Получаете и Проверяете Данные: Каждый массив данных должен быть надежно получен и проверен. Это включает в себя проверку существования переменной с помощью
isset()
и удостоверение в том, что каждый элемент массива содержит ожидаемое значение. -
Безопасность SQL: SQL-инъекции представляют собой серьезную угрозу, поэтому всегда следует использовать подготовленные запросы или функции $wpdb, которые автоматически экранируют входные данные.
-
Синхронизация Данных: Когда обновляется несколько записей в таблице, убедитесь в том, что количество элементов в массиве совпадает, чтобы избежать ошибок. Длина массивов
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
. Важно, чтобы массивы были синхронизированы по длине.
Применение
Теперь перейдем к исправлениям и улучшениям вашего кода:
-
Валидация и синхронизация данных:
Убедитесь, что массивы синхронизированы:
if (count($_POST['BIM']) === count($_POST['BIM_link']) && count($_POST['BIM']) === count($_POST['bim_id'])) { $total = count($_POST['BIM']); } else { // Обработка ошибки, если массивы не равны по длине die('Ошибка: Массивы не синхронизированы.'); }
-
Экранирование данных и обновление:
Используйте
$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-запросов. Используйте методы экранирования и проверки данных для защиты приложения. Убедитесь, что все массивы, связанные с одной сущностью данных, имеют одинаковую длину и правильно синхронизированы. Это поможет избежать непредвиденных ошибок и обеспечит надежную работу вашего кода.