Запись в бд с формы UPDATE + INSERT

Рейтинг: 0Ответов: 1Опубликовано: 30.06.2023

Здраствуйте уважаемые. Проблема такая не могу с модального окна забратьи записать в две таблицы данные (в одну в легкю получается). Есть данные с модального окна, и есть две таблицы одна продукт и туда только колличество нужно записать, в есть история продаж, тада всю информацию с модального окна + в таблице истории продаж стоит дататаим который пишет время все таблицы имеют ИД + автоинкремент.

введите сюда описание изображения

код модального окна :

    <!-- Редактирование --> <div class="modal fade" id="edit_<?php echo $row['id']; ?>" tabindex="-1" aria-labelledby="ModalLabel" aria-hidden="true">   <div class="modal-dialog modal-xl">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title" id="ModalLabel">Редактирование товарной позиции</h5>
            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
          </div>
          <div class="modal-body">
            <form method="POST" action="edit.php?id=<?php echo $row['id']; ?>">
    
    
            <div class="mb-4 row">
                    <label class="col-md-4 col-form-label">Наименование</label>
                          <div class="col-md-6">
                              <input type="text"  name="product_name" class="form-control" value="<?php echo $row['product_name']; ?>">
                            </div>
                </div>
    
                <div class="mb-4 row">
                    <label class="col-md-4 col-form-label">Артикул</label>
                          <div class="col-md-6">
                              <input type="text"  name="product_article" class="form-control" value="<?php echo $row['product_article']; ?>">
                            </div>
                </div>
    
                <div class="mb-4 row">
                    <label class="col-md-4 col-form-label">Категория</label>
                          <div class="col-md-6">
                              <input type="text"  name="product_category" class="form-control" value="<?php echo $row['product_category']; ?>">
                            </div>
                </div>
    
                <div class="mb-4 row">
                    <label class="col-md-4 col-form-label">Поставщик</label>
                          <div class="col-md-6">
                              <input type="text"  name="product_suppliers" class="form-control" value="<?php echo $row['product_suppliers']; ?>">
                            </div>
                </div>
    
                <div class="mb-4 row">
                    <label class="col-md-4 col-form-label">Актуальный курс $</label>
                          <div class="col-md-1">
                          <?php include_once('../database/connection.php');
                                $database = new Connection();
                                $db = $database->open();
                                      try{
                                          $sql = 'SELECT * FROM exchange_rates';
                                  foreach ($db->query($sql) as $row) {
                          ?>
    
                              <input type="text"  name="actuality" class="form-control" value="<?php echo $row['actuality']; ?>">
                              
                            </div>
                </div>
                <?php 
                                        }
                                    }
                                    catch(PDOException $e){
                                        echo "Проверьте соединение с Базой Данных, ошибка при подключении: " . $e->getMessage();
                                    }
                                    //close connection
                                    $database->close();
                                ?>
    
                <div class="mb-4 row">
                      <label class="col-md-4 col-form-label">Введите покупаемое количество</label>
                <div class="col-md-4">
                      <input type="text" class="input-number" name="product_quantity" class="form-control" value="">
                </div>
                </div>
    
                  <div class="mb-4 row">
                      <label class="col-md-4 col-form-label">Введите сумму закупа</label>
                  <div class="col-md-4">
                      <input type="text" class="input-number" name="purchase_price" class="form-control" value="">
                  </div>
                  </div>
    
    
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
            <button type="submit" name="edit" class="btn btn-primary">Обновить</a>
            </form>
          </div>
        </div>   </div> </div>

и вот код обработчика :

<?php
    session_start();
    include_once('../database/connection.php');
 
    if(isset($_POST['edit'])){
        $database = new Connection();
        $db = $database->open();
        try{
            $id = $_GET['id'];
            $product_name = $_POST['product_name'];
            $product_article = $_POST['product_article'];
            $product_category = $_POST['product_category'];
            $product_suppliers = $_POST['product_suppliers'];
            $product_quantity = $_POST['product_quantity'];
            $purchase_price = $_POST['purchase_price'];
            $actuality = $_POST['actuality'];
        
            // Обновление данных в таблице `product`
            $productUpdateSql = "UPDATE product SET 
                product_name = '$product_name', 
                product_article = '$product_article', 
                product_category = '$product_category', 
                product_suppliers = '$product_suppliers', 
                product_quantity = '$product_quantity', 

            WHERE id = '$id'";
            
            // Вставка новой записи в таблицу `purchase_history`
            $purchaseInsertSql = "INSERT INTO purchase_history 
                (rate, purchase_price, purchase_quantity, purchase_name, purchase_category, purchase_suppliers) 
                VALUES 
                ('$actuality', '$purchase_price', '$product_quantity', '$product_name', '$product_category', '$product_suppliers')";

            // Выполнение обоих запросов в одной транзакции
            $db->beginTransaction();
            $db->exec($productUpdateSql);
            $db->exec($purchaseInsertSql);
            $db->commit();

            $_SESSION['message'] = 'Данные успешно обновлены и добавлены в историю покупок';
 
        }
        catch(PDOException $e){
            $db->rollback();
            $_SESSION['message'] = 'Ошибка при обновлении данных и добавлении в историю покупок: ' . $e->getMessage();
        }
 
        $database->close();
    }
    else{
        $_SESSION['message'] = 'Сначала заполните форму редактирования';
    }
 
    header('location: ./product.php');
?>

введите сюда описание изображения

Благодарю всех за подсказки, убрал лишню запятую. И как видно на скрине у меня в таблице purchase_history, было поле data с некоректной для нее настройкой, как только изменил, все заработало. На свои вопрос о том как прибавить к уже имеющемуся количеству вот ответу : product_quantity = product_quantity + '$product_quantity' WHERE id = '$id'";

Так же возникла задача запретить редактирование даннных в инпутах этой формы, что бы не напортачить и к концу инпута добавил readonly

<input type="text"  name="actuality" class="form-control" value="<?php echo $row['actuality']; ?>" readonly>

ВСЕМ ОГРОМНОЕ СПАСИБО, к 5-ти утра голова была просто не какая.

Ответы

▲ 0Принят

Судя по всему ошибка во втором запросе, который делает INSERT

Вот запрос из вашего кода

$purchaseInsertSql = "INSERT INTO purchase_history 
                (rate, purchase_price, purchase_quantity, purchase_name, purchase_category, purchase_suppliers) 
                VALUES 
                ('$actuality', '$purchase_price', '$product_quantity', '$product_name', '$product_category', '$product_suppliers')";

Сразу же вызывает вопрос первое поле. В списке столбцов оно называется rate, а для данных используется переменная $actuality

Значение для этой переменной берется из POST запроса

$actuality = $_POST['actuality'];

Получается, что это значение из поля "Актуальный курс" на форме. А на скриншоте значение указано через запятую. Если предположить, что в таблице purchase_history поле rate имеет тип отличный от текста, то добавление строки '83,91' можн вызывать ошибку SQL.

Но это лишь предположение. А чтобы получить более точную информацию об ошибках - нужно что именно выводится при исключении.

Второй непонятный момент состоит в том что операции делаются в транзакции - тогда ошибка в одном запросе должна привести к тому что и отменятся изменения по всем запросам. А если "обновление работае, а добавление нет", то возможно не там смотрите.

Ну или как версия - при добавлении записи в purchase_history никак не задействован id записи из product. Возможно, все же, что запись добавляется, но, например, ее не видно через пользовательский интерфейс. Поэтому желательно напрямую в базе проверить добавляются записи или нет.

P.S.: все это базовые методы отладки приложений.