我能够将数据库中的数据显示在我的网站上,并且我试图删除一行。
现在按钮可以工作,但它会完全删除所有内容,就像您从代码中看到的那样。
我不知道如何将删除按钮分配给我的表中的特定行,它只删除该特定行中的数据。
除此之外,我有一个删除按钮,它位于我的桌子上,并且不知道如何为每个给定的行设置单独的删除按钮。
admin.php(显示我的数据)
<?php
echo "<table style='box'>";
echo "<tr><th>ID</th><th>First Name</th><th>Last Name</th><th>Role</th>
<th>Email</th><th>Username</th><th>Delete</th><th>Amend</th></tr>";
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='box'>" . parent::current(). "</td>";
}
function beginChildren(){
echo "<tr>";
}
function endChildren(){
echo "</tr>";
}
}
require 'connection.php';
try {
$stmt = $conn->prepare("SELECT id, FirstName, LastName, Role, Email, Username FROM users");
$stmt->execute();
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v){
echo $v;
}
}
catch (PDOException $e){
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
<form method="post" action="delete.php">
<input <input class="btn-default" type="submit" name="login" value="Delete">
</form>
<?php
echo "</table>";
?>
delete.php
<?php
$servername = 'localhost';
$username = 'root';
$pass = 'root';
$database = 'tutor_database';
try {
$conn = new PDO("mysql:host=$servername;dbname=$database", $username, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//sql to delete record.
$sql = "DELETE FROM users WHERE id = id";
$conn->exec($sql);
echo "Record deleted!";
} catch(PDOException $e) {
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
我会展示一张图片,但我没有足够的声誉点来展示它。
答案 0 :(得分:1)
WHERE
语句中的DELETE
子句将始终返回true。在每一行,ID始终等于ID。因此,一切都被删除了。您需要传递一个参数来删除脚本以过滤要删除的行。您可以使用get="method"
的{{1}}隐藏HTML输入值。
然而,关键是如何从网页的选择查询中获取该ID。此外,您需要将输入按钮放在每行的末尾以删除相应行的ID。对于这两个项目,您可能必须返回传统的循环到网页而不是<form>
,因为我们需要在表中添加一个未获取的对象(表单删除按钮)。
admin.php (通知表单按钮作为每行的最后一个表格单元格)
RecursiveArrayIterator()
delete.php (请注意$ GET()生成的$ id并在删除查询中使用
...same code as above...
try {
$stmt = $conn->prepare("SELECT id, FirstName, LastName, Role, Email, Username FROM users");
$stmt->execute();
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
while($row = $result->fetch()) {
?>
<tr>
<td style="box"> <?php echo $row['id']; ?></td>
<td style="box"> <?php echo $row['FirstName']; ?></td>
<td style="box"> <?php echo $row['LastName']; ?></td>
<td style="box"> <?php echo $row['Role']; ?></td>
<td style="box"> <?php echo $row['Email']; ?></td>
<td style="box"> <?php echo $row['Username']; ?></td>
<td>
<form method="get" action="delete.php">
<input type="hidden" name="rowid" value="<?php echo $row['id']; ?>">
<input class="btn-default" type="submit" name="login" value="Delete">
</form>
</td>
<tr>
<?php
}
}
catch (PDOException $e){
echo "Error: " . $e->getMessage();
}
$conn = null;
答案 1 :(得分:0)
一个问题是您的DELETE
语句不包含变量。
//sql to delete record.
$sql = "DELETE FROM users WHERE id = id";
你需要更像的东西:
//sql to delete record.
$sql = "DELETE FROM users WHERE id = " . $id;
其中$ id是使用所选行的ID定义的。
让我们解决另一个&#34;隐藏&#34;问题
现在按钮可以正常工作,但它可以完全删除代码中的所有内容。
鉴于您说这会删除所有记录,我猜您的每行的id
都是字符串'id'
而不是唯一的整数值。
DELETE FROM {table} WHERE id = {number}
不会删除所有记录。它只删除与条件匹配的记录。您应该确保在添加行时正确设置id
。 id
列应具有以下属性:INT UNSIGNED NOT NULL AUTO_INCREMENT
。
答案 2 :(得分:0)
试着追随你拥有的东西。你做过之前是否尝试过将id设置为var?
$sql = "DELETE FROM users WHERE id = id";
示例:
$sql = "DELETE FROM users WHERE id = '$id'";