从php插入后未激发php-MySQL触发器

从php插入后未激发php-MySQL触发器,php,mysql,triggers,insert,mysql-workbench,Php,Mysql,Triggers,Insert,Mysql Workbench,我的问题基本上是,触发器(MySQL)在从PHP函数插入数据后没有触发,我不知道为什么。当我从MySQL工作台插入数据时,触发器会正常触发 下面是一个示例代码,以便于更好地理解: PHP函数: public function insert($data){ $result = mysql_query("INSERT INTO Table(Column) VALUES('$data')"); if($result){ return true; } ret

我的问题基本上是,触发器(MySQL)在从PHP函数插入数据后没有触发,我不知道为什么。当我从MySQL工作台插入数据时,触发器会正常触发

下面是一个示例代码,以便于更好地理解:

PHP函数:

public function insert($data){
    $result = mysql_query("INSERT INTO Table(Column) VALUES('$data')");
    if($result){
       return true;
    }
    return false;
}
触发:

delimiter //
CREATE TRIGGER last_id AFTER INSERT ON Table
FOR EACH ROW
BEGIN
    SET @lastid = NEW.Id;
END;//
最后,当我从MySQL工作台执行此查询时,例如:

INSERT INTO Table(Column) VALUES(1)
触发器正常触发


注意:PHP函数也成功地插入了数据,唯一的问题是它没有触发触发器。

我最近在数据库课程的一个小项目中遇到了同样的问题,在MySQL终端上进行研究和讨论后,我发现变量(
@lastid
)您正在设置和更新的仅是客户端实例变量,其生命周期和范围仅适用于该连接实例。实际情况是,当您从PHP更新变量时,实际上使用的是与MySQL workbench的连接实例不同的数据库连接实例。因此,实际上,通过PHP查询执行的insert事件上的触发器正在执行,但您无法看到结果,因为您是从不同的连接实例(工作台实例)检查它的

为了弄清楚这个问题,请使用命令行界面打开两个到同一数据库的连接,从一个实例设置变量,然后尝试从另一个实例访问它。您将在第二个终端上获得一个空值

了解了所有这些之后,现在可以使用您正在使用的连接通过PHP插入值来检索您正在创建或更新的临时变量

    public function insert($data){
    $result = mysql_query("INSERT INTO Table(Column) VALUES('$data')");
    if($result){
       return true;
    }
    $result = $connection->query("select @lastid"); //create your own connection
    if(!$result) die($connection->error);
    $row = $result->fetch_array();
    echo $row[0];

}

当您使用相同的连接实例变量时,这可能会给您提供所需的结果。

最近,我在为数据库课程做一个小项目时遇到了同样的问题,在MySQL终端上进行了研究和讨论后,我发现变量(
@lastid
)您正在设置和更新的仅是客户端实例变量,其生命周期和范围仅适用于该连接实例。实际情况是,当您从PHP更新变量时,实际上使用的是与MySQL workbench的连接实例不同的数据库连接实例。因此,实际上,通过PHP查询执行的insert事件上的触发器正在执行,但您无法看到结果,因为您是从不同的连接实例(工作台实例)检查它的

为了弄清楚这个问题,请使用命令行界面打开两个到同一数据库的连接,从一个实例设置变量,然后尝试从另一个实例访问它。您将在第二个终端上获得一个空值

了解了所有这些之后,现在可以使用您正在使用的连接通过PHP插入值来检索您正在创建或更新的临时变量

    public function insert($data){
    $result = mysql_query("INSERT INTO Table(Column) VALUES('$data')");
    if($result){
       return true;
    }
    $result = $connection->query("select @lastid"); //create your own connection
    if(!$result) die($connection->error);
    $row = $result->fetch_array();
    echo $row[0];

}

当您使用相同的连接实例变量时,这可能会给您提供所需的结果。

我觉得您应该使用insert into Table(lastid)值(New.id),而不是SET@lastid=New。ID@aroyAlejo已经说过触发器在从工作台插入时执行。这意味着触发器没有问题。我觉得OP需要升级到mysqli。我觉得您应该使用insert into Table(lastid)值(New.id),而不是SET@lastid=New。ID@aroyAlejo已经说过触发器在从工作台插入时执行。这意味着触发器没有问题。我觉得OP需要升级到mysqli