在PHP和SQL中删除记录后,删除记录输出else的else语句3次



我试图删除php-mysql中的一条记录,但我的代码将我跳转到else语句,其中我有"记录未删除";打印出消息。奇怪的是,它打印了3次。我试图让它在记录被删除时简单地显示一个警报,以保持简单。我知道我已经连接到数据库,因为我可以在屏幕上看到我的记录。

我可以在地址栏中看到sql-id记录,所以我也知道它是正确的记录,但在屏幕上,我看到了-Error Deleting RecordError Deleting RecordError Deleting Record

我确信这是一件简单的事情,但就我的一生而言,我无法确定我可能出了什么问题。如果有人能帮我发现这个问题,我一定会很感激

我的代码如下-

user-data.php

<?php require_once('protector.php'); ?>
<?php 
$title = "Zitalk | User Data";
include('header.php');
?>
<main style="padding-top: 150px; text-align: center;">
<div class="row justify-content-center">
<div class="col-auto mb-5">
<table class="table table-dark table-striped">
<tr>
<th scope="col">Id</th>
<th scope="col">First Name</th>
<th scope="col">Last Name</th>
<th scope="col">Email</th>
<th scope="col">Telephone Number</th>
<th scope="col">Action</th>
</tr>
<?php
$conn = mysqli_connect("MYDBHOST", "MYDBUSERNAME", "MYDBPASS", "MYDBNAME");
if($conn-> connect_error) {
die("Connection failed:". $conn-> connect_error);
}
$sql = "SELECT id, firstname, lastname, email, tel FROM users";
$result = $conn->query($sql);
if($result-> num_rows > 0) {
while($row = $result-> fetch_assoc()) {
?>
<tr>
<td><?php echo $row["id"]; ?></td>
<td><?php echo $row["firstname"]; ?></td>
<td><?php echo $row["lastname"]; ?></td>
<td><?php echo $row["email"]; ?></td>
<td><?php echo $row["tel"];?></td>
<td>
<a href="deletecode.php?id=<?php echo $row['id']; ?>" class="btn btn-xs btn-danger del_btn deletebtn"  style="max-width: 75px; max-height: 50px; font-size: 12px;padding: 5px 7px;margin: 0;">DELETE</a></td>
<tr>


<?php
}
}
?>
</table>
</div>
</div>

deletecode.php

<?php 
$conn = mysqli_connect("MYDBHOST", "MYDBUSERNAME", "MYDBPASS", "MYDBNAME");
if($conn-> connect_error) {
die("Connection failed:". $conn-> connect_error);
}
$sql = "SELECT id, firstname, lastname, email, tel FROM users";
$result = $conn->query($sql);
if($result-> num_rows > 0) {
while($row = $result-> fetch_assoc()) {
$id = $_GET['id'];
$del = mysqli_query($db, "DELETE FROM users WHERE id='$id'");
if($del) {
echo '<script>alert("User Deleted");</script>';
mysqli_close($db);
header('Location: user-data.php');
exit;
} else {
echo 'Error Deleting Record';
}
}
}

再说一次,如果有人能在这里帮我,我一定会很感激。提前谢谢你。

好的。。。首先,让我们重新格式化您的代码:

<?php 
$conn = mysqli_connect("MYDBHOST", "MYDBUSERNAME", "MYDBPASS", "MYDBNAME");
if($conn->connect_error) {
die("Connection failed:". $conn->connect_error);
}
$sql = "SELECT id, firstname, lastname, email, tel FROM users";
$result = $conn->query($sql);
if($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$id = $_GET['id'];
$del = mysqli_query($db, "DELETE FROM users WHERE id='$id'");
if($del) {
echo '<script>alert("User Deleted");</script>';
mysqli_close($db);
header('Location: user-data.php');
exit;
} else {
echo 'Error Deleting Record';
}
}
}

基本上,这里发生的是,首先SELECT所有用户(我假设DB中有四个用户?(,然后在while循环中对每个用户进行迭代。

在第一次迭代中,它可能会删除记录,并且script代码应该在没有查看源的情况下输出(显然您不会看到这一点(。

在随后的每次迭代中,DELETE都会失败,因为记录已经被删除。因此,将输出错误消息。

N.B.

  1. 您永远不会使用header函数重定向,因为您已经使用echo输出了一些内容
  2. 在这种情况下(您有用户提供的数据(,您必须使用准备好的语句来保护您的数据库
  3. 你真的应该检查你的用户是否有权删除(例如,以管理员身份登录(;否则有人能做到吗
  4. 大多数人会建议您不要使用GET请求进行DELETE操作
  5. 同样,大多数人会建议您开始学习PDO,并取消程序性的mysqli_*调用。或者,至少使用OOPmysqli->格式
  6. 您应该确保在mysqli中也启用错误报告

您实际想要做的只是运行删除查询并检查它是否完成:

<?php
$mysqli = new mysqli("MYDBHOST", "MYDBUSERNAME", "MYDBPASS", "MYDBNAME");
$sql   = "DELETE FROM users WHERE id = ?";
$query = $mysqli->prepare($sql);
$query->bind_param("i", $_GET["id"]);
$query->execute();
if ($mysqli->affected_rows) {
header("Location:user-data.php");
exit;
} else {
echo "Error deleting record";
}

首选解决方案

  • 使用PDO连接到数据库
  • 使用表格POST删除请求
  • 检查以确保权限正确
  • 使用事先准备好的报表

用户数据.php

<?php
require_once('protector.php');
$title = "Zitalk | User Data";
include('header.php');
?>
<main style="padding-top: 150px; text-align: center;">
<div class="row justify-content-center">
<div class="col-auto mb-5">
<table class="table table-dark table-striped">
<tr>
<th scope="col">Id</th>
<th scope="col">First Name</th>
<th scope="col">Last Name</th>
<th scope="col">Email</th>
<th scope="col">Telephone Number</th>
<th scope="col">Action</th>
</tr>
<?php
$pdo = new pdo(
"mysql:host={$host};dbname={$database}",
$username,
$password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => FALSE
]
);
$sql    = "SELECT id, firstname, lastname, email, tel FROM users";
$result = $pdo->query($sql);
while($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
echo <<<EOT
<tr>
<td>{$row["id"]}</td>
<td>{$row["firstname"]}</td>
<td>{$row["lastname"]}</td>
<td>{$row["email"]}</td>
<td>{$row["tel"]}/td>
<td>
<form method="POST" action="deletecode.php"><button name="id" value="{$row['id']}" class="btn btn-xs btn-danger del_btn deletebtn" style="max-width: 75px; max-height: 50px; font-size: 12px;padding: 5px 7px;margin: 0;>DELETE</button></form>
</tr>
EOT;
}
?>
</table>
</div>
</div>

deletecode.php

<?php
$host     = "MYDBHOST";
$username = "MYDBUSERNAME";
$password = "MYDBPASS";
$database = "MYDBNAME";
$pdo = new pdo(
"mysql:host={$host};dbname={$database}",
$username,
$password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => FALSE
]
);
// Some form of check to ensure the "user" has permission to do this!
if (!$userHasPermission) {
echo "ERROR: Permission denied.";
exit;
}
$sql   = "DELETE FROM users WHERE id = ?";
$query = $pdo->prepare($sql);
$query->execute( [$_POST["id"]] );
if ($query->rowCount()) {
header("Location:user-data.php");
exit;
} else {
echo "Error deleting record";
}

也许应该将$id = $_GET['id'];放在while循环之外。

最新更新