У меня есть 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';
}
}
?>
Проблема в том, что вы не однозначно идентифицируете каждый элемент формы. Если у вас 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'; }
}
}
?>
Входы имеют одинаковые имена для каждой строки, поэтому значения строк переписывают друг друга и эффективно публикуются только последние строки.
Один из методов - структурировать опубликованные данные в виде массива, включая идентификатор строки, чтобы различать значения для разных строк. В идеале идентификатор строки представляет собой числовой индекс 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)
);
}
}
$_POST
таким образом. После 15 лет в PHP, как я не знал, это поражает меня!
echo "<pre>".print_r($_POST,true)."</pre>";