Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.04.2019, 16:27
Новичок на форуме
Отправить личное сообщение для web2k99 Посмотреть профиль Найти все сообщения от web2k99
 
Регистрация: 02.04.2019
Сообщений: 1

Как написать корректный ajax-запрос для записи в бд?
Помогите, пожалуйста, корректно подключить ajax к кнопке записи данных в бд. Есть таблица, в которую в цикле выводятся данные из бд. Вот код:
<table class="table text-center">
 <thead class="text-uppercase">
  <tr>
   <th scope="col">ID</th>
   <th scope="col">Дата</th>
   <th scope="col">Метро</th>
   <th scope="col">Время</th>
   <th scope="col">Номер</th>
   <th scope="col">Фамилия</th>
   <th scope="col">Имя</th>
   <th scope="col">Отчество</th>
   <th scope="col">Сумма</th>
   <th scope="col">Комментарий</th>
   <th scope="col">Курьер</th>
   <th scope="col"> </th>
    <?php $post = get_delivery_users(); ?>
    <?php foreach ($post as $users): ?>
<form method="post" action="courier.php">
<tbody>
<tr>
 <th scope="row"><input type="hidden" name="form_id" value="<?=$users['id']?>"></th>
 <td><div class="form-group">
   <input class="form-control" type="date" name="delivery_date" value="<?=htmlspecialchars($users['delivery_date'], ENT_QUOTES)?>" id="example-date-input"></div></td>
  <td><select name="delivery_adress" class="form-control">
  <? foreach(get_delivery_addresses() as $delivery_address): ?>
  <option <?if ($delivery_address == $users['delivery_adress']) echo ' selected'?>><?=htmlspecialchars($delivery_address, ENT_QUOTES)?></option>
 <? endforeach;?>
 </select></td>

<td><input class="form-control" type="text" name="delivery_time" value="<?=htmlspecialchars($users['delivery_time'], ENT_QUOTES)?>" id="example-text-input"></td>
<td><input class="form-control" type="text" name="phone" value="<?=htmlspecialchars($users['phone'], ENT_QUOTES)?>" id="example-text-input"></td>
<td><input class="form-control" type="text" name="surname" value="<?=htmlspecialchars($users['surname'], ENT_QUOTES)?>"></td>
<td><input class="form-control" type="text" name="name" value="<?=htmlspecialchars($users['name'], ENT_QUOTES)?>"></td>
<td><input class="form-control" type="text" name="second_name" value="<?=htmlspecialchars($users['second_name'], ENT_QUOTES)?>"></td>
<td><input class="form-control" type="text" name="sum" value="<?=htmlspecialchars($users['sum'], ENT_QUOTES)?>"></td>
<td><input class="form-control" type="text" name="manager_comment" value="<?=htmlspecialchars($users['manager_comment'], ENT_QUOTES)?>"></td>
<td><div class="form-group">
<select name="courier" class="form-control">
<? foreach(get_couriers() as $couriers): ?>
<option <?if ($couriers == $users['courier']) echo ' selected'?>><?=htmlspecialchars($couriers, ENT_QUOTES)?></option>
<? endforeach;?>
</select>
</div></td>
<td><button type="submit" formmethod="post" name="couriers" class="btn btn-xs btn-warning mb-3">На доставку</button></td>
</tr>
</tbody>
</form>
<?php endforeach; ?>
</table>


А вот код, который выполняется в courier.php:
<?php

    require_once('db.php');

    if(isset($_POST['couriers']))
    {
        $form_id = (int)$_POST['form_id'];
        $sum = (int)$_POST['sum'];
        $manager_comment = strip_tags(trim($_POST['manager_comment']));
        $phone = strip_tags(trim($_POST['phone']));
        $name = strip_tags(trim($_POST['name']));
        $surname = strip_tags(trim($_POST['surname']));
        $second_name = strip_tags(trim($_POST['second_name']));
        $manager_comment = strip_tags(trim($_POST['manager_comment']));
        $delivery_adress = strip_tags(trim($_POST['delivery_adress']));
        $delivery_time = strip_tags(trim($_POST['delivery_time']));
        $delivery_date = strip_tags(trim($_POST['delivery_date']));
        $courier = strip_tags(trim($_POST['courier']));
        $SQL = "UPDATE Users SET phone='$phone', sum='$sum', name='$name', surname='$surname', second_name='$second_name', manager_comment='$manager_comment', delivery_adress='$delivery_adress', delivery_time='$delivery_time', delivery_date='$delivery_date', courier='$courier' WHERE id='$form_id'";
        $result = mysqli_query($link, $SQL);

        if ($result) {
            header('Location:delivery.php');
        }
        else {
            printf("Ошибка: %s\n", mysqli_error($link));
        }
    }

?>


Помогите, пожалуйста, составить корректный ajax-запрос для записи в бд данных из таблицы. Я не понимаю, как это делать, если все данные в цикле, как и кнопки
Ответить с цитированием
  #2 (permalink)  
Старый 03.04.2019, 01:08
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

htmlspecialchars - это нужно, а strip_tags зачем? Вы ведь ожидаете разные форматы данных, а при этом банально вырезаете теги, которых по условию формат просто не может содержать, совсем не проверяя данные. Более того, опасаясь вставки тегов, которые как раз нивелирует htmlspecialchars, подставляете данные в запрос как есть, тем самым создаете предпосылку для sql инъекции.

<?php foreach ($post as $users): ?> - откуда $post? Можно конечно и кучу форм иметь, отправляя каждую отдельно, но можно иметь и одну форму, в которой одноименные поля будут иметь ключ, в вашем случае это $users['id']. То есть именовать поля будут так: name="delivery_time[<?=$users['id']?>]" и сервер получит массив, в котором под первичными ключами равными ID будут содержаться соответствующие поля. А далее в цикле производится обновление ранее подготовленным запросом. Можно обновить и одним запросом, используя не UPDATE, а INSERT с многострочной вставкой и ON DUPLICATE KEY UPDATE.

Но одной ли формой, несколькими ли, входные данные обязательно нужно проверять, тем более что они у вас разного формата. Сделать это можно по разному, но в РНР уже есть целое расширение - фильтры. Если какое либо значение ну будет пройдено фильтром, значит клиенту возвращается ошибка. Данные в базу нужно записывать только если они соответствуют ожидаемым условиям.

Указанные разделы изучить, тестовым скриптом выполняя запросы, а уж отправлять ajax запросом форму/формы, это пустяк, который легок для усвоения.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Асинхронный ajax запрос imonzx AJAX и COMET 3 13.06.2015 00:02
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00
Как написать регулярное выражение для поиска до конца строки isqad88 Общие вопросы Javascript 3 11.02.2012 15:34
Как отправить Ajax запрос от плагина Chrome к веб серверу? fedotxxl AJAX и COMET 0 29.11.2011 20:53
Как написать get запрос не обновляя страницу Joshka Элементы интерфейса 7 16.06.2011 11:36