php - 使用php中的复选框删除多个mysql行

标签 php mysql

我以前曾尝试问过这个问题,但有人无礼地告诉我我发布了太多代码。所以这一次我会尽力只发布相关代码。

因此,我尝试使用复选框删除多行。我查了很多关于它的教程,大多数都使用 for each 循环。我还没有真正弄清楚 while 和 for each 循环之间的区别。所以,这是我的前端 php 代码:

$sql = "SELECT * FROM appointments WHERE date = '".$date."' ORDER BY appttime";

$result = mysqli_query($transport, $sql);

echo "<h2 align='center'>Schedule for $raw_date</h2>";

echo "<table border='0' style='width: 100%; margin: auto; border-width: 1px'><tr><th>Resident Name</th><th>APT #</th><th>Appt. Time</th><th>Location Phone</th><th>Location Name</th><th>Address</th><th>City</th><th>Zip</th><th>Bus or Car</th><th>Escort Name</th><th>Transfer</th><th>Comments</th><th>Dparting Times</th><th>Delete</th></tr>";

?>
<form name="update_times" method="post" action="depart_t.php">
<?php
$i=0;

while($row = mysqli_fetch_array($result))
  {
  echo "<input type='hidden' name='id[$i]' value='" . $row['id'] . "'>";
  echo "<tr>";
  echo "<td align='center'><input name='resident[$i]' style='width: 80px' type='text' value='" . htmlspecialchars($row['r_name'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='room_n[$i]' style='width: 40px' type='text' value='" . htmlspecialchars($row['room'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='appt_time[$i]' style='width: 55px' type='text' value='" . date("g:i A", strtotime($row['appttime'])) . "' /></td>";  
  echo "<td align='center'><input name='appt_phone[$i]' style='width: 65px' type='text' value='" . htmlspecialchars($row['apptphone'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='name_l[$i]' style='width: 80px' type='text' value='" . htmlspecialchars($row['l_name'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='address[$i]' style='width: 90px' type='text' value='" . htmlspecialchars($row['address'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='city[$i]' style='width: 70px' type='text' value='" . htmlspecialchars($row['city'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='zip[$i]' style='width: 50px' type='text' value='" . $row['zip'] . "' /></td>";
  echo "<td align='center'><input name='buscar[$i]' style='width: 30px' type='text' value='" . htmlspecialchars($row['buscar'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='e_name[$i]' style='width: 60px' type='text' value='" . htmlspecialchars($row['escort_name'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='transfer[$i]' style='width: 40px' type='text' value='" . htmlspecialchars($row['transfer'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='comments[$i]' style='width: 80px' type='text' value='" . htmlspecialchars($row['comments'], ENT_QUOTES) . "' /></td>";
  echo "<td align='center'><input name='out[$i]' style='width: 70px' type='text' value='" . date("g:i A", strtotime($row['depart'])) . "' /></td>";
  echo "<td align='center'><input name='delete[$i]' type='checkbox' value='" . $row['id'] . "' /></td>";
  echo "</tr>";
  ++$i;  
  }

echo "</table>";


?>
<br>
<input type="submit" value="Update" style="float:left; margin:5px" onclick="return confirm('Are you sure you want to proceed?')" /></form>
<form name="print" action="printer_f.php" method="post"><input name="p_friendly" type="submit" value="Printer Friendly View" style="float:left; margin:5px" /></form><form name="delete" action="delete.php" method="post"><input name="delete" type="submit" value="Delete Selected" onclick="return confirm('Are you sure you want to delete these entrys?')" style="float:left; margin:5px" /></form>

这是我的删除代码:

$size = count($_POST['delete']);
$i=0;
while ($i < $size)
    {
        $id = $_POST['id'][$i];
        $sql = "DELETE FROM appointments WHERE id = $id";
        echo $sql;
        mysqli_query($transport, $sql) or die('Error: ' .mysqli_error($transport));

        ++$i;

}

使用这段代码,所有发生的事情是,无论我选择哪一行,第一行都会被删除。我试过在它之前使用 if 语句来检查是否实际选中了一个复选框,但这似乎也没有用。所以我很茫然。感谢您的帮助!

最佳答案

使用这个:

$stmt = mysqli_prepare($transport, "DELETE FROM appointments WHERE id = ?");
mysqli_stmt_bind_param($stmt, "i", $id);
foreach ($_POST['delete'] as $id) {
    mysqli_stmt_execute($stmt);
}

foreach 语句更好,因为唯一被发布的 delete[i] 元素是被检查的元素,因此序列中会有间隙。此代码还展示了如何使用准备好的语句而不是变量替换。

您遇到的另一个问题是删除复选框与此提交按钮冲突:

<input name="delete" type="submit" value="Delete Selected" onclick="return confirm('Are you sure you want to delete these entrys?')" style="float:left; margin:5px" />

当您使用该提交按钮时,它会将 $_POST['delete'] 设置为 Delete Selected,这会覆盖所有复选框。为其中之一指定一个不同的名称,并更改从该 $_POST 字段中读取的代码。

关于php - 使用php中的复选框删除多个mysql行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24660445/

相关文章:

mysql - GORM 是否存在以最大前缀开头的字段问题或 Float 字段存在问题

mysql 嵌套查询中的分组依据

PHP+mysql : how to store big integers

mysql - View 以显示一个循环与当前循环的距离

php - 如何强制重写网址?

php - 使用 jQuery/javascript 从 HTML 中删除 id 属性

mysql,多列还是varchar列?

mysql - 按时间自动聚合和分区SQL表

php - 如何为 php web 应用程序管理不同国家/地区的不同用户的时区?

php - 在 Sublime text 2 中,php 自动完成功能不起作用