【问题标题】:php- MySQL Trigger not fired after insert from phpphp-从php插入后未触发MySQL触发器
【发布时间】: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 stackoverflow.com/questions/13569/…

标签: php mysql triggers insert mysql-workbench


【解决方案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];

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多