Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP上执行mysql级联删除_Php_Mysql - Fatal编程技术网

在PHP上执行mysql级联删除

在PHP上执行mysql级联删除,php,mysql,Php,Mysql,我正在帮助我的朋友做一些数据库管理的事情。基本上他有两个数据库,一个叫做城市,一个叫做运费。每个表都显示在网页中,每个记录旁边都有“编辑和删除”按钮。所以他可以通过网络删除数据库中的数据 交易是,我想在这个mysql数据库上执行级联删除,这样每次我删除city数据库中的一行时,shipping rate数据库中具有相同city_ID的对应行也会被删除。我尝试了一些mysql查询组合,但没有成功。这是我得到的 require_once('../../model/city.php'); if

我正在帮助我的朋友做一些数据库管理的事情。基本上他有两个数据库,一个叫做城市,一个叫做运费。每个表都显示在网页中,每个记录旁边都有“编辑和删除”按钮。所以他可以通过网络删除数据库中的数据

交易是,我想在这个mysql数据库上执行级联删除,这样每次我删除city数据库中的一行时,shipping rate数据库中具有相同city_ID的对应行也会被删除。我尝试了一些mysql查询组合,但没有成功。这是我得到的

require_once('../../model/city.php');
    if(isset($_POST['id'])){
        //edit or remove
        $id = $_POST['id'];
        $dbo = City::get_by_id($id);
        if($_POST['action'] == 'remove'){
            //remove
            //$dbo->delete();
            mysql_query("DELETE city.*, shipping_rate_loc.* FROM city c,    shipping_rate_loc s WHERE c.ID_city = s.ID_city");
            echo "Data is removed.";
        }
正如你所看到的,我只是把mysql_查询放在他之前的

$dbo->delete();
成功删除城市的代码,但不删除其相关运费

我是PHP内部使用mysql的新手,有人能帮我指出我的错误在哪里吗?非常感谢:)

更新:
我试过从答案中找出一些解决办法。他们都不工作。即使我简化了事情。这让我想知道,在将php连接到数据库方面是否有任何错误?

当您创建表时,您应该设置级联删除/更新


检查将回答您问题的帖子。

从技术上讲,级联应该在表本身上完成。但这需要设置外键,这反过来又需要InnoDB(表可能是也可能不是)

问题是您实际上没有指定要在SQL中删除哪个id。而不是

"WHERE c.ID_city = s.ID_city"
试一试

并使用参数绑定将POST id传递到查询中


有关其他详细信息,请参见。您可以使用左联合删除来执行级联删除

这看起来像:

$query = "DELETE city, shipping_rate FROM city LEFT JOIN shipping rate ON city.id = shipping_rate.city_id WHERE city.id = $blah";

解决此问题的最佳方法是修改数据库设置,将
on delete cascade
添加到
shipping\u rate\u loc
表的外键中,例如

create table city
(
    id    integer,
    name  varchar,
    ...
    primary key (id)
);

create table shipping_rate_loc
(
    id          integer,
    city_from   integer,
    city_to     integer,
    ...
    foreign key (city_from) references city(id) on delete cascade,
    foreign key (city_to) references city(id) on delete cascade
);
这样,当您使用

DELETE FROM city WHERE id = myid

数据库将自动删除表
shipping\u rate\u loc
中该城市位于
city\u from
city\u to
列中的所有记录,而无需使用PHP执行任何操作。

您可能需要编写一个存储过程来执行此操作

CREATE PROCEDURE DeleteCity(IN CityID INT)
BEGIN
    delete from city where ID_city = CityID;
    delete from shipping_rate_loc where ID_city = CityID;
END $$
之后,删除一个城市非常简单:

call DeleteCity(5);

这需要我将db引擎更改为InnoDB,我的朋友有点不愿意这样做。所以我认为这里需要一些古老的mysql。谢谢Matt。这就解释了。但是,很抱歉,但是如何进行参数绑定呢?请查看有关使用pdo创建准备好的语句、参数绑定和查询执行的大量信息。当使用来自用户的数据(例如$_POST、$_REQUEST等)以避免SQL注入时,使用pdo绑定参数是至关重要的。别忘了清理你的值。嗯,最后$blah指的是什么?我这样应用它
$query=“删除城市,配送率从城市左侧加入配送率从城市上配送率=配送率从城市上配送率从城市上配送率为空”但它仍然不起作用。两个表上的行仍然存在。语法可能不同,但效果相同。“从a,b,其中a.c=b.c”与“从a.c=b.c上的连接b”完全相同。这里重要的是“WHERE city.id=$blah”,$blah是从$_POST中获取的城市id。“WHERE city.ID_city is null”确保查询永远不会完成任何任务。@gaban yes$blah应该是经过消毒的城市ID。否则它怎么知道要删除哪个城市?另外,在你做一些可能危及你的服务器的事情之前,请务必阅读有关mysql注入的内容。嗨,伙计,我遇到了这个错误#1064-你的SQL语法有一个错误;查看与您的MySQL服务器版本对应的手册,了解当我尝试添加外键时,在第6行的“外键(ID_city)引用城市(ID_city)(删除级联)引擎=Inno”附近使用的正确语法。有什么想法吗?你的完整SQL语句是什么?如果不存在,创建表
shipping\u rate\u loc
ID\u city
int(11)NOT NULL,
ID\u shipping\u method
int(11)NOT NULL,
shipping\u rate
float NOT NULL,主键(
ID\u city
),外键(ID\u shipping\u method)引用城市(ID_城市)在删除级联)引擎上=InnoDB@gaban在
外键之前加一个逗号这一个有效!但是,我保留它作为替代。我必须先说服我的fried使用InnoDB。干杯,伙计!
CREATE PROCEDURE DeleteCity(IN CityID INT)
BEGIN
    delete from city where ID_city = CityID;
    delete from shipping_rate_loc where ID_city = CityID;
END $$
call DeleteCity(5);