Цикл по сериализованным данным для вставки обновлений в БД MySQL - PullRequest
0 голосов
/ 19 октября 2018

Благодаря приведенной ниже справке я переключил свой код на использование serlize (), но у меня все еще есть похожая проблема: только при получении последней строки, вот что я делаю сейчас

<form id="test_table">
<table>
  <thead>
    <tr>
      <th> ID </th>
      <th> col2 </th>
      <th> col3 </th>
    </tr>
  </thead>
  <tbody><!--table body-->
  <form id="form_x">
    <tr>
      <td> <input type="text" name="col1" default value="1"> </td>
      <td> <input type="text" name="col2" default value="cat"> </td>
      <td> <input type="text" name="col3" default value="dog"> </td>
    </tr>
    <tr>
      <td> <input type="text" name="col1" default value="2"> </td>
      <td> <input type="text" name="col2" default value="fish"> </td>
      <td> <input type="text" name="col3" default value="rabbit"> </td>
    </tr>
  </tbody>
</table>
</form>

<button  class="btn btn-primary" value="test_table" onclick="update(this.value)">Update</button>
<p><tt id="results"></tt></p>

<script>
function update(form_name){
  var str = $( test_table ).serialize();
  $( "#results" ).text( str );
  $.ajax({
    type: "POST",
    url: "/site/pages/update.php",
    data: $( "#"+form_name ).serialize(),
    success : function(res){ console.log(res); }
  });
}
</script>

Я вижу, как собираются сериализованные данные, т.е.

col1=1&col2=cat&col3=dog&col1=2&col2=fish&col3=rabbit

Но когда я сбрасываю то, что передается, он видит только значение последней строки

update.php

<?php var_dump($_POST); ?>

Результат:

array(3) {
  ["col1"]=>
  string(1) "2"
  ["col2"]=>
  string(4) "fish"
  ["col3"]=>
  string(6) "rabbit"
}

Может кто-нибудь подсказать мне, как исправить мою update.php страницу для циклического прохождения данных POST?Я хочу обновить строку базы данных для каждого идентификатора этой строки, например,

//setup loop
$sql = "UPDATE Table SET 
col2 ='".$_POST["col2"]."', 
col3 ='".$_POST["col2"]."', 
WHERE id='".$_POST["col1"]."' ";

, т.е.

$sql = "UPDATE table SET
col2='cat' , col3='dog'
WHERE id=1";

$sql = "UPDATE table SET
col2='fish' , col3='rabbit'
WHERE id=2";

===========================================================================

Старый вопрос:

Я пытаюсь разрешить пользователю редактировать динамически создаваемую строку (с пользовательскими входами в TDs)), которые отправляют и обновляют по нажатию кнопки обновления, я вижу, что входные данные записываются правильно, но не могу понять, как обновить базу данных с помощью вызова ajax, вот (сокращенный) код:

form_page.php

<table id="table_name">
<thead>
    <tr>
        <th>ID</th>
        <th>Col 2</th>
        <th>Col 3</th>
    </tr>

phpcode, связанный с генерацией строк таблицы:

<?php
echo '<form id="" method="POST" action="" >';
$sql= "SELECT * FROM tablename";
$stmt= $conn->prepare($sql);
$stmt->execute();
$results = $stmt->fetchAll();
foreach ($results as $row) {
echo '<td>';
echo 'ItemID_'.$row['ID'].'';
echo '</td>';
echo '<td>';
echo '  <input class="update_value" type="text" id="ItemID_'.$row['ID'].'" default value="'.$row['col2'].'">';
echo '</td>';
echo '  <input class="update_value" type="text" id="ItemID_'.$row['ID'].'" default value="'.$row['col3'].'">';
echo '</td>';
echo'</tr'>;
}
?>
<button type="button" id="update_button">Update</button>
</form>
</table>

Результат с редактируемым столбцом 2/3:

ID | col2             | col3
1  | lorem (editable) | ipsum    (editable)
2  | dolor (editable) | sit amet (editable)

Update (Button)

С кодом, похожим на:

<table id="table_name">
<thead>
    <tr>
        <th>ID</th>
        <th>Col 2</th>
        <th>Col 3</th>
    </tr>
</thead>
<tbody>
<form id="" method="POST" action="">
    <tr>
        <td>
        ItemID_1
        </td>
        <td> <input class="update_value" type="text" id="ItemID_1" default value="lorem">
       </td>
        <td> <input class="update_value" type="text" id="ItemID_2" default value="ipsum">
       </td>
    </tr>
</tbody>
<button type="button" id="update_button">Update</button>

Вот ajax, который я использую для отправки его на страницу обновления

<script>
$(document).ready(function(){
    $("#update_button").click(function(e) {
        e.preventDefault();
            var values = {};
            $('input.update_value').each(function(n, user_input){
                 values[ $(user_input).attr('id') ] = $(user_input).val();
                 //used to test and make sure its passing id vals to values
                 //alert(JSON.stringify(values, null, 4));
            });
        $.ajax({
            type: "POST",
            url: "/site/pages/update.php",
            data: { updatefrominputs: values }
        });
    });
});
</script>

С предупреждением выше(используется для тестирования), показывающий:

localhost says
{
    "ItemID_1": "lorem"
    "ItemID_1": "ipsum"
}

Пока все в порядке, но затем при повторном щелчке по нему записывается "lorem"

localhost says
{
    "ItemID_1": "ipsum"
    "ItemID_2": "dolor"
}

This первая проблема , он переписал значение "lorem" для отправки через

Вот вторая проблема и где я застрял, отправка и обновлениебаза данных

Я вижу, что ajax публикуется, добавив его в ajax:

success: function (data) {
    alert("sent");
}

Код файла update.php:

<? php
include connect.php //database connection script (don't think I need to call it)
foreach($_POST['updatefrominputs'] as $id=>$value)
$sqlQuery = "UPDATE tablename SET
        //col2=col2inputvalue
        //col3=col3inputvalue
        WHERE 
        //col1id=the NUMBER without the ID_part?
        ";
        $sqlQueryStmt = $conn->prepare($sqlQuery);
        $sqlQueryStmt->execute();
?>

у меня проблема в том, что я не могу заставить его обновить базу данных, я не уверен, как заполнить приведенное ниже предложение UPDATE.Кроме того, даже не похоже, что он публикует сообщения на этой странице, но функция успеха говорит, что это так. *

Кроме того, как мне получить число для использования в предложении WHERE?Я могу отредактировать код выше, чтобы просто дать мне идентификационный номер, а затем использовать col1ID=col1passedID, но я получу дубликаты идентификаторов, если я использую этот процесс для более чем одной формы (на одной странице).например,

<form 1>
    foreach ($results1 as $row1) {
    echo '  <input class="update_value" type="text" id="'.$row1['ID'].'" default value="'.$row['col2'].'">';
    }
</form 1>

<form 2>
    foreach ($results2 as $row2) {
    echo '  <input class="update_value" type="text" id="'.$row2['ID'].'" default value="'.$row2['col2'].'">';
    }
</form 2>

Будет выводить:

<form 1>
    <input class="update_value" type="text" id="1" default value="lorem">
</form 1>

<form 2>
    <input class="update_value" type="text" id="1" default value="ipsum">
</form 2>

Одно из решений, которое я могу придумать, это отправить ajax так:

var updatedetals= {
    id: $("#ItemID_1").val(),
    col1: $("#col2").val(),
    col2: $("#col2").val()
      }
      $.ajax({
            type: "POST",
            url: "/site/pages/update.php",
            data:updatedetals,
            dataType: 'JSON',
            success: function(JSON){
                refreshResults();
            }
      });

Но это победило 'Я также не могу дать мне уникальные идентификаторы, и мне придется делать вызов ajax для каждой строки?

Есть ли лучший способ перебирать каждую уникально сгенерированную строку, получать входные значения TD и отправлять эти обновленные значения вбаза данных?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Проблема в том, что ваши столбцы имеют повторяющиеся имена, но $ POST требует уникальных ключей для значений.Таким образом, вы получаете только 3 ключа: col1, col2 и col3 ... и значения перезаписываются, поэтому у вас остаются только значения последней строки.

Если вы хотите собрать все строки, тоВы должны дать каждому уникальное имя.Например,

<form id="test_table">
<table>
  <thead>
    <tr>
      <th> ID </th>
      <th> col2 </th>
      <th> col3 </th>
    </tr>
  </thead>
  <tbody><!--table body-->
  <form id="form_x">
    <tr>
      <td> <input type="text" name="row1_col1" default value="1"> </td>
      <td> <input type="text" name="row1_col2" default value="cat"> </td>
      <td> <input type="text" name="row1_col3" default value="dog"> </td>
    </tr>
    <tr>
      <td> <input type="text" name="row2_col1" default value="2"> </td>
      <td> <input type="text" name="row2_col2" default value="fish"> </td>
      <td> <input type="text" name="row2_col3" default value="rabbit"> </td>
    </tr>
  </tbody>
</table>
</form>

<button  class="btn btn-primary" value="test_table" onclick="update(this.value)">Update</button>
<p><tt id="results"></tt></p>

<script>
function update(form_name){
  var str = $( test_table ).serialize();
  $( "#results" ).text( str );
  $.ajax({
    type: "POST",
    url: "/site/pages/update.php",
    data: $( "#"+form_name ).serialize(),
    success : function(res){ console.log(res); }
  });
}
</script>

Попробуйте.Это даст вам шесть значений в вашем php $ POST.

Затем вы можете выполнить итерацию по ним и извлечь имя столбца, используя некоторые методы среза строки, например split или substr.

.
0 голосов
/ 20 октября 2018

Вам нужно использовать name="col1[]" в вашем html, это будет отправлять все значения в массиве.Поскольку у вас есть несколько входов с одинаковым именем, php по умолчанию получает последний.если вы добавите [], вы можете получить такие значения, как $_POST["col1"][0] и тому подобное.Затем вы также можете зациклить значения, такие как

for($i=0;$i<count($_POST["col1"]);$i++){
    $col1 = $_POST["col1"][$i];
    $col2 = $_POST["col2"][$i];
    $col3 = $_POST["col3"][$i];
    //use the variables in update query
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...