База данных не обновляется в HTML-таблице

0

У меня есть html-таблица, которая выводит всю мою базу данных:

Edit(button)
pkg | kodsk | namask | tahun | makmal |  catatan | murid | netbook
a   |   b   |    c   |   d   |    e   |    f     |   g   | h 

После нажатия кнопки щелчка мыши над таблицей пользователь может изменить все данные в таблице. Моя проблема в том, что можно редактировать только некоторые строки. Например, моя база данных имеет 8 строк, только номер строки 8 и 7 можно редактировать. Другая строка, если пытаться изменить данные, ничего не происходит. Мой код в порядке без ошибок, поэтому я не знаю, где проблема. Пожалуйста, помогите мне, я просто научусь веселиться.

  <?php
session_start();
include("connections.php");
?>

<meta http-equiv="refresh" content="10";>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
       <table border="3" style= "background-color: #84ed86; color: #761a9b; margin: 5 auto;" >
         <?php
            $result = $connect->query("SELECT * FROM data2017 INNER JOIN pengguna USING (pkg)
                                        WHERE pengguna.username = '$_SESSION[username]'");

               echo "<tr>";
               echo "<th>pkg</th>";
               echo "<th>kodsk</th>";
               echo "<th>sek</th>";
               echo "<th>tahun</th>";
               echo "<th>makmal</th>";
               echo "<th>catatan</th>";
               echo "<th>murid</th>";
               echo "<th>netbook</th>";
               echo "</tr>";

            while($row = $result->fetch(PDO::FETCH_ASSOC)){
                echo "<tr>";
                echo "<input type='hidden' name='bil' value='".$row['bil']."' />";
                echo "<td><input type='text' name='pkg' value='".$row['pkg']."' /></td>";
                echo "<td><input type='text' name='kodsk' value='".$row['kodsk']."' /></td>";
                echo "<td><input type='text' name='namask' value='".$row['namask']."' /></td>";
                echo "<td><input type='text' name='tahun' value='".$row['tahun']."' /></td>";
                echo "<td><input type='text' name='makmal' value='".$row['makmal']."' /></td>";
                echo "<td><input type='text' name='catatan' value='".$row['catatan']."' /></td>";
                echo "<td><input type='text' name='murid' value='".$row['murid']."' /></td>";
                echo "<td><input type='text' name='netbook' value='".$row['netbook']."' /></td>";
                echo "</tr>";
               }
            echo "<input type='submit' name='update' value='UPDATE' />";
         ?>
      </table>
   </form>

<?php
   if(isset($_POST['update'])) 
   {

    $bil = $_POST['bil'];
    $pkg = $_POST['pkg'];
    $kodsk = $_POST['kodsk'];
    $namask = $_POST['namask']; 
    $tahun = $_POST['tahun'];
    $makmal = $_POST['makmal'];
    $catatan = $_POST['catatan'];
    $murid = $_POST['murid'];
    $netbook = $_POST['netbook'];


    $sql =  "UPDATE 'data2017' SET 'pkg'=:pkg,'kodsk'=:kodsk,'namask'=:namask,'tahun'=:tahun,'makmal'=:makmal,'catatan'=:catatan,'murid'=:murid,'netbook'=:netbook WHERE 'bil'=:bil";

    $stmt = $connect->prepare($sql);
    $pdoExec = $stmt->execute(array(":pkg"=>$pkg,":kodsk"=>$kodsk,":namask"=>$namask,":tahun"=>$tahun,":makmal"=>$makmal,":catatan"=>$catatan,":murid"=>$murid,":netbook"=>$netbook,":bil"=>$bil));

    if($pdoExec)
    {
        echo 'Data Updated';
    }
    else
    {
        echo 'Fail To Update';
    }

}
?>
  • 0
    Похоже, что входы имеют одинаковые имена в каждой строке. Они будут перезаписывать друг друга, и будет опубликован только последний ряд. Чтобы устранить неполадки, попробуйте вывести опубликованные данные: echo "<pre>".print_r($_POST,true)."</pre>";
  • 0
    где я должен положить код сэр
Показать ещё 5 комментариев
Теги:

2 ответа

3
Лучший ответ

Проблема в том, что вы не однозначно идентифицируете каждый элемент формы. Если у вас 8 строк, то у вас есть 8 значений с именем pkg, но может быть только один $_POST['pkg'] Поэтому последняя строка обычно выигрывает и является единственной обновленной.

Вам нужно будет добавить поле bil для каждого имени input, а затем разделить его позже.

Идентификаторы ID и NAME должны начинаться с буквы ([A-Za-z]), за которой может следовать любое количество букв, цифр ([0-9]), дефис ("-"), подчеркивание ("_"), colons (":") и периоды ("."). Источник

Попробуй это:

edit 1: Мне пришлось отредактировать это, когда я понял, что размещение $ bil в начале входного имени нарушит утверждение, которое я поставил выше. Я переместил его в правую сторону от имени.

edit 2: Модифицированный мой метод для построения массива в html, как showdev, научил меня

<?php
session_start();
include("connections.php");
?>

<meta http-equiv="refresh" content="10";>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
       <table border="3" style= "background-color: #84ed86; color: #761a9b; margin: 5 auto;" >
         <?php
            $result = $connect->query("SELECT * FROM data2017 INNER JOIN pengguna USING (pkg)
                                        WHERE pengguna.username = '$_SESSION[username]'");

               echo "<tr>";
               echo "<th>pkg</th>";
               echo "<th>kodsk</th>";
               echo "<th>sek</th>";
               echo "<th>tahun</th>";
               echo "<th>makmal</th>";
               echo "<th>catatan</th>";
               echo "<th>murid</th>";
               echo "<th>netbook</th>";
               echo "</tr>";

            while($row = $result->fetch(PDO::FETCH_ASSOC)){
                $bil = $row['bil'];
                echo "<tr>";
                echo "<input type='hidden'   name='row[$bil][:bil]'     value='$bil' />";
                echo "<td><input type='text' name='row[$bil][:pkg]'     value='".$row['pkg']."' /></td>";
                echo "<td><input type='text' name='row[$bil][:kodsk]'   value='".$row['kodsk']."' /></td>";
                echo "<td><input type='text' name='row[$bil][:namask]'  value='".$row['namask']."' /></td>";
                echo "<td><input type='text' name='row[$bil][:tahun]'   value='".$row['tahun']."' /></td>";
                echo "<td><input type='text' name='row[$bil][:makmal]'  value='".$row['makmal']."' /></td>";
                echo "<td><input type='text' name='row[$bil][:catatan]' value='".$row['catatan']."' /></td>";
                echo "<td><input type='text' name='row[$bil][:murid]'   value='".$row['murid']."' /></td>";
                echo "<td><input type='text' name='row[$bil][:netbook]' value='".$row['netbook']."' /></td>";
                echo "</tr>";
               }
            echo "<input type='submit' name='update' value='UPDATE' />";
         ?>
      </table>
   </form>

<?php
   if(isset($_POST['update'])) 
   {
        $sql =  "UPDATE 'data2017' SET 'pkg'=:pkg,'kodsk'=:kodsk,'namask'=:namask,'tahun'=:tahun,'makmal'=:makmal,'catatan'=:catatan,'murid'=:murid,'netbook'=:netbook WHERE 'bil'=:bil";

        $stmt = $connect->prepare($sql);

        foreach($_POST['row'] as $data)
        {
            $pdoExec = $stmt->execute($data);

            if($pdoExec) { echo 'Data Updated'; } else { echo 'Fail To Update'; }
        }
    }
?>
  • 0
    спасибо братан, это сработало. Теперь я знаю, что проблема в названии = '......' Большое спасибо за все объяснения и редактировать мой код. Да благословит тебя Бог
0

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

Один из методов - структурировать опубликованные данные в виде массива, включая идентификатор строки, чтобы различать значения для разных строк. В идеале идентификатор строки представляет собой числовой индекс PRIMARY.

Для справки см. Как создать массивы в HTML <form>?

Вот пример:

while($row = $result->fetch(PDO::FETCH_ASSOC)){
  echo '<tr>
          <td>
            <input type="text" name="row['.$row['bil'].'][pkg]" value="'.$row['pkg'].'">
          </td>
          <td>
            <input type="text" name="row['.$row['bil'].'][kodsk]" value="'.$row['kodsk'].'">
          </td>
        </tr>";
}

Затем вы получите массив, подобный этому:

Array
(
    [row] => Array
        (
            [1] => Array
                (
                    [pkg] => stuff
                    [kodsk] => things
                )

            [2] => Array
                (
                    [pkg] => other
                    [kodsk] => another
                )

        )

)

И вы можете перебирать этот массив для обновления базы данных, примерно так:

if (!empty($_POST['row'])) {

  $sql =  "UPDATE 'data2017' SET 'pkg'=:pkg, 'kodsk'=:kodsk WHERE 'bil'=:bil";
  $stmt = $connect->prepare($sql);

  foreach ($_POST['row'] as $bil => $row) {

    $pdoExec = $stmt->execute(
      array(":pkg"=>$row['pkg'],
            ":kodsk"=>$row['kodsk'],
            ":bil"=>$bil)
    );

  }

}
  • 0
    Я узнал что-то новое сегодня. Я понятия не имел, что вы можете заполнить массив $_POST таким образом. После 15 лет в PHP, как я не знал, это поражает меня!
  • 0
    Спасибо, братан, теперь я знаю, где проблема. Такое отличное объяснение и помощь. Оба кода от вас работают отлично. Пусть Бог благословит вас двоих.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню