我想创建一个删除所有需要删除的记录的按钮。我的数据库中有三个表,地址和cv ... address_id与person表中的person_address有关系,cv_id与person表中的person_cv有关系。按下删除按钮时,应删除与该人员相关的所有内容。我尝试过很多东西:
echo "<td><a href='delete.php?id=<?" . $row['id'] . "'>delete</a></td>";
使用外部delete.php但它根本不起作用... link链接我用于delete.php的教程
我的详细信息页面,其中删除按钮应位于CV之后:
<?php
$servername = "localhost";
$username = "root";
$password = "usbw";
$dbname = "persons";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT person_firstname, person_lastname,
person_email, person_phonenumber,
address_street,address_housenumber,
address_city,address_state,address_zipcode, cv_path
FROM person
inner join address on address.address_id = person.person_address
inner join cv on cv.cv_id = person.person_cv";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table border=1>
<tr>
<th>Voornaam</th>
<th>Achternaam</th>
<th>Straat</th>
<th>Huisnummer</th>
<th>Postcode</th>
<th>Stad</th>
<th>Provincie</th>
<th>Email</th>
<th>Mobiel</th>
<th>CV</th>
</tr>";
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row["person_firstname"] . "</td>";
echo "<td>" . $row["person_lastname"] . "</td>";
echo "<td>" . $row["address_street"] . "</td>";
echo "<td>" . $row["address_housenumber"] . "</td>";
echo "<td>" . $row["address_zipcode"] . "</td>";
echo "<td>" . $row["address_city"] . "</td>";
echo "<td>" . $row["address_state"] . "</td>";
echo "<td>" . $row["person_email"] . "</td>";
echo "<td>" . $row["person_phonenumber"] . "</td>";
echo "<td><a href='http://localhost:8080/website/" . $row['cv_path'] . "'>cv file</a></td>";
echo "</tr>";
}
}
else {
echo "Er is niks in het database gevonden";
}
$conn->close();
?>
Delete.php:
<?php
$host="localhost"; // Host name
$username="root"; // Mysql username
$password="usbw"; // Mysql password
$db_name="persons"; // Database name
$tbl_name="person"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// get value of id that sent from address bar
$id=$_GET['person_id'];
// Delete data in mysql from row that has this id
$sql="DELETE FROM $tbl_name WHERE person_id='$id'";
$result=mysql_query($sql);
// if successfully deleted
if($result){
echo "Deleted Successfully";
echo "<BR>";
echo "<a href='admin.php'>Back to main page</a>";
}
else {
echo "ERROR";
}
?>
<?php
// close connection
mysql_close();
?>
答案 0 :(得分:2)
有两种方法可以做到:
从所有3个表中手动删除。以下是对此的查询:
delete prsn, addr, cv
from person prsn
join address addr on p.person_address = addr.address_id
join cv cv on prsn.person_cv = cv.cv_id
where prsn.id = ?
创建外键约束,以便在删除父记录后自动删除子记录。例如。像这样重新创建地址表:
create table address(
...
FOREIGN KEY (address_id)
REFERENCES person(person_Address)
ON DELETE CASCADE
);
然后,我们只需要执行以下查询:
delete from person where id = ?
答案 1 :(得分:2)
我从屏幕截图中看到您已经在使用private Dictionary<string,Something>;
public Something this[string i]
{
get { return InnerDictionary[i]; }
set { InnerDictionary[i] = value; }
}
表,所以使用{{1}在InnoDB
和address
表上设置一些外键依赖关系应该不会太难作为引用的列。
作为使用外键来实现似乎导致问题的cv
的示例,有三个表具有外键依赖关系集 - 这样您就可以从person_id
表中删除〜使用人员的rippled delete
,相关表格中的所有记录也将被删除。
person
要删除与Bobby相关的所有记录,在这种情况下,sql可能只是:
id
如果不使用这样的外键,您需要为每个表构建单独的sql语句,您希望从中删除用户及其相关记录。
即:
create table if not exists `person` (
`id` int(10) unsigned not null auto_increment,
`name` varchar(50) not null,
primary key (`id`)
) engine=innodb auto_increment=2 default charset=latin1;
create table if not exists `address` (
`id` int(10) unsigned not null auto_increment,
`person_id` int(10) unsigned not null default '0',
`address` varchar(50) not null default '0',
primary key (`id`),
unique key `person_id` (`person_id`),
constraint `fk_user_address` foreign key (`person_id`) references `person` (`id`) on delete cascade on update cascade
) engine=innodb auto_increment=2 default charset=latin1;
create table if not exists `cv` (
`id` int(10) unsigned not null auto_increment,
`person_id` int(10) unsigned not null default '0',
`cv` varchar(50) not null default '0',
primary key (`id`),
key `person_id` (`person_id`),
constraint `fk_user_cv` foreign key (`person_id`) references `person` (`id`) on delete cascade on update cascade
) engine=innodb auto_increment=2 default charset=latin1;
/* dummy data */
insert into `person` (`id`, `name`) values (1, 'bobby');
insert into `address` (`id`, `person_id`, `address`) values (1, 1, '99 riverside drive, dundee');
insert into `cv` (`id`, `person_id`, `cv`) values (1, 1, 'bobby_cv.docx');
/* this is how the tables look */
person table
+----+-------+
| id | name |
+----+-------+
| 1 | Bobby |
+----+-------+
address table
+----+---------------+----------------------------+
| id | person_id(fk) | address |
+----+---------------+----------------------------+
| 1 | 1 | 99 Riverside Drive, Dundee |
+----+---------------+----------------------------+
cv table
+----+---------------+---------------+
| id | person_id(fk) | cv |
+----+---------------+---------------+
| 1 | 1 | bobby_cv.docx |
+----+---------------+---------------+
更新
道歉延迟回应 - 睡觉叫。
在用于显示其他表中相关详细信息的用户的sql SELECT语句中,不要选择delete from `person` where `id`=1;
这是使删除语句有效所需的关键(双关语)元素。
delete from person where person_id=X;
delete from address where person_id=X;
delete from cv where person_id=X;
那么,在person_id
循环
$sql = "SELECT person_id, person_firstname, person_lastname,
person_email, person_phonenumber,
address_street,address_housenumber,
address_city,address_state,address_zipcode, cv_path
FROM person
inner join address on address.address_id = person.person_address
inner join cv on cv.cv_id = person.person_cv";
然后在while
中提供了FK依赖关系(这完全取决于你是如何做到的)
while($row = $result->fetch_assoc()) {
$person_id=$row['person_id'];
/* etc - other content as before */
/* note the parameter used is "ID" */
echo "<a href='delete.php?id={$person_id}'>Delete</a>";
}
未解决的一个问题是sql注入问题。我在这里详细介绍的原始代码都使用现已弃用的delete.php
函数系列,并且易受sql注入的影响。一旦您确定了此删除问题,就应该谨慎地将代码迁移到使用/* options used to ensure supplied id is within acceptable bounds */
$options = array(
'options' => array(
'default' => 0,
'min_range' => 1,
'max_range' => 10000000 /* maximum value for ID */
)
);
/* process GET parameters - notably "ID" */
$id=filter_input( INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT );
$id=(int)filter_var( $id, FILTER_VALIDATE_INT, $options );
/* construct & execute sql */
if( is_int( $id ) ){
$sql="delete from `person` where `id`='{$id}';";
$result=mysql_query( $sql );
}
,以便您可以使用mysql_*