我有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 :(得分:3)
问题在于,您并不能唯一地识别每个表单元素。如果您有8行,那么您有8个名为pkg
的值,但只能有一个$_POST['pkg']
这就是为什么最后一行通常会获胜并且是唯一更新的行。
您必须将bil
字段添加到每个input
名称,然后将其分开。
ID和NAME令牌必须以字母([A-Za-z])开头,后面可以跟任意数量的字母,数字([0-9]),连字符(&#34; - &#34 ;),下划线(&#34; _&#34;),冒号(&#34;:&#34;)和句号(&#34;。&#34;)。 Source
试试这个:
编辑1:当我意识到在输入名称的开头放置$ bil会违反我上面的语句时,我必须编辑它。我将它移到名称的右侧。
编辑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'; }
}
}
?>
答案 1 :(得分:0)
输入的每一行都有相同的名称,因此行值会相互覆盖,只有最后一行才会被有效发布。
一种方法是将发布的数据构造为数组,包括用于区分不同行的值的行标识符。理想情况下,行标识符是数字PRIMARY索引。
供参考,请参阅How do I create arrays in a 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)
);
}
}