如何删除数据库中的多个记录

时间:2016-03-02 22:42:51

标签: php mysql

我想创建一个删除所有需要删除的记录的按钮。我的数据库中有三个表,地址和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();
?>

2 个答案:

答案 0 :(得分:2)

有两种方法可以做到:

  1. 从所有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 = ?

  2. 创建外键约束,以便在删除父记录后自动删除子记录。例如。像这样重新创建地址表:

    create table address( ... FOREIGN KEY (address_id) REFERENCES person(person_Address) ON DELETE CASCADE );

  3. 然后,我们只需要执行以下查询:

    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}在InnoDBaddress表上设置一些外键依赖关系应该不会太难作为引用的列。

作为使用外键来实现似乎导致问题的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_*