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

Posted

技术标签:

【中文标题】php-从php插入后未触发MySQL触发器【英文标题】:php- MySQL Trigger not fired after insert from php 【发布时间】:2017-08-22 09:15:48 【问题描述】:

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

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

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 Workbench 执行此查询时:

INSERT INTO Table(Column) VALUES(1)

触发器正常触发。

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

【问题讨论】:

我觉得你应该使用 insert into Table(lastid) Values(New.id) 而不是 SET @lastid=New.ID @aroy Alejo 已经说过触发器在从工作台插入时执行。这意味着触发器没有问题 感觉OP需要升级到mysqli ***.com/questions/13569/… 【参考方案1】:

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

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

知道了这一切,现在使用您用来通过 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];


当您使用相同的连接实例变量时,这可能会给您想要的结果。

【讨论】:

以上是关于php-从php插入后未触发MySQL触发器的主要内容,如果未能解决你的问题,请参考以下文章

插入和更新后未触发 SQL Server 触发器

mysql:向 php 发送 sqlstate 信号

如何Mysql触发器中抛出一个异常

如何读取mysql中插入触发器后创建的innodb行?

使用游戏手柄触发 jquery ajax mysql 插入

MYSQL触发器在PHP项目中用来做信息备份恢复和清空