PHP Запрос ОБНОВИТЬ / УДАЛИТЬ динамически сгенерированное поле ввода в таблице - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть таблица, в которой пользователь может создавать строки с динамическим добавлением полей ввода (в сочетании с jquery). Я успешно могу вставить его в базу данных mysql.

Если пользователи хотят редактировать добавленные уже существующие поля, у меня есть страница редактирования, где значения выбираются из базы данных mysql и заполняются снова в динамически создаваемую таблицу. enter image description here

Теперь есть следующие вероятности: -

  1. Пользователь только вносит незначительные изменения в существующий ценности. В этом случае таблица должна быть ОБНОВЛЕНА с измененными значениями
  2. Пользователь Удаляет одну / несколько строк (выбирается случайным образом и в соответствии с пользователями wi sh). Таким образом, при отправке формы запрос php должен УДАЛИТЬ только те перикулярные строки в БД.
  3. Пользователь ДОБАВЛЯЕТ другую строку к предыдущим существующим значениям строки, в этом случае запрос php должен ОБНОВИТЬ предыдущие значения и ВСТАВИТЬ вновь добавленные значения строк.
  4. Приведенная выше последовательность не обязательно ограничена тем же порядком. Пользователь может выполнять все вышеперечисленные три функции одновременно в одно и то же время.

Теперь моя проблема в том, что (только для бэкэнда) я испытываю затруднения с тем, чтобы создать запрос php & sql, чтобы обновить его до mysql.

my php

if(isset($_POST['submit'])){
    $number1 = count($_POST['item']); //
    for($i=0; $i<$number1; $i++){
       $item = strip_tags(trim($_POST['item'][$i]));
       $description = strip_tags(trim($_POST['description'][$i]));
       $unitcost = strip_tags(trim($_POST['unitcost'][$i]));
       $qty = strip_tags(trim($_POST['qty'][$i])); // Quantity
       $sno = strip_tags(trim($_POST['sno'][$i]));// serial number

       //QUERY1 if minor updates to above variable then UPDATE (eg, qty value is changed from 3 to 4)
       //QUERY2 if row is deleted then DELETE that particular row from db (eg, sno 3 deleted from the table should DELETE corresponding mysql DB values also)
       //QUERY3 if row is added then that particular row values should be INSERT (eg, sno 4 is added which is not in the mysql db. So this has to be INSERTED.)
       }
     }

Извините, что задал такой вопрос. Я трачу много времени на приведенные выше запросы, которые не могут быть выполнены должным образом. Мне нужна только идея, а не весь код целиком.

Надеюсь, все вы посоветуете мне несколько идей о том, как это можно реализовать. Спасибо за помощь заранее. Ожидается положительный ответ.

Примечание: просто чтобы напомнить вам еще раз, внешний интерфейс представляет собой таблицу полей ввода динамически ДОБАВИТЬ / УДАЛИТЬ

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Спасибо за ответ, благодарю @ckrudelux и @codefather за их намерение помочь мне. Хотя их советы не помогли мне структурировать мой запрос. Поэтому я долго обходился и нашел решение ниже. Я публикую решение, потому что я не смог найти ни одной статьи в Интернете, когда речь шла об ОБНОВЛЕНИИ / УДАЛЕНИИ динамически генерируемой входной таблицы.

Надеюсь, это кому-нибудь поможет.

Итак, я сделал в основном то, что я взял все значения в массив.

В моем динамически сгенерированном добавляемом входном коде таблицы Я добавил <input type="hidden" name="sno[]" value="newrow">. Так что это будет забито формой поста. Я использую обычный html пост, а не ajax.

, теперь моя отправка. php изменился до ниже

 if(isset($_POST['submit'])){

     $productid = $_POST['productd'];// No striptag functions 
                                     // due to illustration purpose

     // First of all, we need to fetch the querying db table. 
     // This is required in order to compare the existing row values 
     // with the posted values
     $fetchproduct  = $link->prepare("SELECT * FROM product WHERE productid=?");
     $fetchproduct  ->bind_param('s',$productid);
     $fetchproduct  ->execute();
     $fetchresult   = $fetchproduct ->get_result();

     $serialnumber=array(); // Assigning array to fetch the primary key: Serial Number
     while($row = $fetchresult->fetch_assoc()){
        $serialnumber[]         = $row["sno"];
     }

     //Newly Inserted Values

     //$_POST['sno'] is taken from the dynamic input field defined earlier in this post. 
     //Basically what we are doing here is we are comparing (the values 
     //which have been posted from the primary page) and (values present in the db table). 
     //The difference will give an array of newly inserted table input field values

     $insert = array_diff($_POST['sno'],$serialnumber); 


     //Deleted Values

     // This will Difference those values in the db table and values which are 
     // deleted from the primary dynamic table page
     $delete = array_diff($serialnumber,$_POST['sno']); 
     $countdelete = count($delete);  // Counting how many values have been
                                     // lined up for deleting   

     //Updated Values

      // array_intersect will give us the common values present in both the array.
      // This means that there is no deletion or insertion to the dynamic table fields.
      $intersect = array_intersect($serialnumber, $_POST['sno']);
      $update = array_values($intersect);
      $countupdate = count($update);

     //INSERT ADDED VALUES TO DB
     foreach($insert as $key=>$ivalue){
        // ID       
        if(isset($_POST['id'][$key]) && !empty($_POST['id'][$key])) {
            $id = strip_tags(trim($_POST['id'][$key]));
        }
        // ITEM
        if(isset($_POST['item'][$key]) && !empty($_POST['item'][$key])) {
            $item = strip_tags(trim($_POST['item'][$key]));
        }
        // DESCRIPTION
        if(isset($_POST['description'][$key]) && !empty($_POST['description'][$key])) {
            $description = strip_tags(trim($_POST['description'][$key]));
        }
        // UNITCOST
        if(isset($_POST['unitcost'][$key]) && !empty($_POST['unitcost'][$key])) {
            $unitcost = strip_tags(trim($_POST['unitcost'][$key]));
        }
        // QUANTITY
        if(isset($_POST['qty'][$key]) && !empty($_POST['qty'][$key])) {
            $qty = strip_tags(trim($_POST['qty'][$key]));
        }
        // AMOUNT
        if(isset($_POST['amount'][$key]) && !empty($_POST['amount'][$key])) {
            $amount = strip_tags(trim($_POST['amount'][$key]));
        }

        // INSERT INTO THE DATABASE
        $inserttable = $link->prepare("INSERT INTO product (productid, item, description, unitcost, qty, amount) VALUES(?,?,?,?,?,?)");
        $inserttable->bind_param('ssssss', $id, $item, $description, $unitcost, $qty, $amount);
        $inserttable->execute();
        if($inserttable){
            header( 'Location:to/your/redirect page.php' ) ; // NOT MANDADTORY, You can put whatever you want
            $_SESSION['updatemsg'] = "Success";
        }
     }  

     //UPDATE EXISTING VALUES TO DB
     for($j=0; $j<$countupdate; $j++){
        // ID       
        if(isset($_POST['id'][$j]) && !empty($_POST['id'][$j])) {
            $uid = strip_tags(trim($_POST['id'][$j]));
        }
        // ITEM
        if(isset($_POST['item'][$j]) && !empty($_POST['item'][$j])) {
            $uitem = strip_tags(trim($_POST['item'][$j]));
        }
        // DESCRIPTION
        if(isset($_POST['description'][$j]) && !empty($_POST['description'][$j])) {
            $udescription = strip_tags(trim($_POST['description'][$j]));
        }
        // UNITCOST
        if(isset($_POST['unitcost'][$j]) && !empty($_POST['unitcost'][$j])) {
            $uunitcost = strip_tags(trim($_POST['unitcost'][$j]));
        }
        // QUANTITY
        if(isset($_POST['qty'][$j]) && !empty($_POST['qty'][$j])) {
            $uqty = strip_tags(trim($_POST['qty'][$j]));
        }
        // AMOUNT
        if(isset($_POST['amount'][$j]) && !empty($_POST['amount'][$j])) {
            $uamount = strip_tags(trim($_POST['amount'][$j]));
        }

        // UPDATE THE DATABASE      
        $updatetable = $link->prepare("UPDATE product SET item=?, description=?, unitcost=?, qty=?, amount=? WHERE sno=?");
        $updatetable->bind_param('ssssss', $uitem, $udescription, $uunitcost, $uqty, $uamount, $update[$j]);
        $updatetable->execute(); 
        if($updatetable){
            $_SESSION['updatemsg'] = "Success";
        }
      }

      //DELETE VALUES FROM DB
      foreach($delete as $sno){
      $deletetable = $link->prepare("DELETE FROM product WHERE sno=?");
      $deletetable->bind_param('s', $sno);
      $deletetable->execute();
      if($deletetable){
        $_SESSION['updatemsg'] = "Success";
      }
    }
   }else {
       $_SESSION['updatemsg'] = "Error";
   }
    }
0 голосов
/ 04 апреля 2020

Звучит как проблема внешнего интерфейса. Вам нужно определить, как вы сообщаете бэкэнду, что происходит.

<input name="items[$i][name]" />

Это будет отображаться как хороший массив для l oop через php.

foreach($_POST[items] AS $item){
    if( $item['delete'] ){
        //delete code
    }
}else{
    //Insert/Update
}

Если вы Чтобы удалить что-то, просто сделайте поле скрытым и добавьте к нему флаг.

<input type="hidden" name="items[$i][delete]" value="1" />
<input type="hidden" name="items[$i][id]" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...