我在stackOverflow上发现了几个线程,这些线程解决了如何向PHP结果表添加“删除”按钮的问题,但是似乎没有一个线程可以解决我的特定用例。
我有一个从MySql数据库中提取的PHP结果表。我已经向表的每一行添加了“删除”链接,但是当我单击给定行上的“删除”链接时,它将删除表中的所有行。
我怀疑我没有正确实现'delete'链接,但是我对PHP不够熟练,无法弄清楚到底是什么问题。
下面是生成表的代码。请注意,在endChildren()函数中回显了“删除”链接。
type GetKeys<T extends readonly {key: any}[]> = T[number]['key'];
type Keys = GetKeys<typeof arr>;
// type Keys = "one" | "two" | "three"
这是delete.php脚本:
<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Name</th><th>Number</th><th>Part A</th><th>Part B</th><th>Full Name</th><th>Address</th><th>Apt.</th><th>City</th><th>State</th><th>Zip</th><th>Remove</th></tr>";
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "<td><a href='delete.php?id=".$row['id']."'>Delete></a></td>";
echo "</tr>" . "\n";
}
}
$servername = "localhost:3306";
$username = "xxxxxxxxxx";
$password = "xxxxxxxx";
$dbname = "xxxxxxxxx";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT id, Name, Number, PartA, PartB, Full_Name, Address, Apt, City, State, Zip FROM Medicard");
$stmt->execute();
// set the resulting array to associative
$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;
echo "</table>";
?>
当我单击给定行中的删除链接时,它将删除表中的所有行。我不确定这是因为我在其中添加了“删除”链接,还是我的delete.php代码不正确。
我对PHP和MySql比较陌生。任何指导将不胜感激。谢谢。
答案 0 :(得分:2)
您删除列id
与列id
匹配的所有行-当然,所有行都是这种情况。
$sql = "DELETE FROM Medicard WHERE id=id";
您需要从GET参数中读取ID并调整您的查询:
<?php
$servername = "localhost:3306";
$username = "xxxxxxxx";
$password = "xxxxxxxx";
$dbname = "xxxxxxxx";
$id = $_GET["id"];
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// sql to delete a record
$sql = $conn->prepare("DELETE FROM Medicard WHERE id = ?");
$success = $sql->execute(array($id));
echo $success ? "Record deleted successfully" : "Record not deleted";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
$conn = null;
?>
表生成部分(我用一个简单的循环替换了您实现的迭代器)
<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Name</th><th>Number</th><th>Part A</th><th>Part B</th><th>Full Name</th><th>Address</th><th>Apt.</th><th>City</th><th>State</th><th>Zip</th><th>Remove</th></tr>";
$servername = "localhost:3306";
$username = "xxxxxxxxxx";
$password = "xxxxxxxx";
$dbname = "xxxxxxxxx";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT id, Name, Number, PartA, PartB, Full_Name, Address, Apt, City, State, Zip FROM Medicard");
$stmt->execute();
// set the resulting array to associative
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach ($stmt->fetchAll() as $row) {
echo "<tr>";
foreach ($row as $val) {
echo "<td>" . $val . "</td>";
}
echo "<td><a href='delete.php?id=".$row['id']."'>Delete></a></td>";
echo "</tr>";
}
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";
?>