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

标签 php mysql triggers insert mysql-workbench

我的问题基本上是触发器 (MySQL) 在从 PHP 函数插入数据后没有被触发,我不知道为什么。当我从 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 函数也成功插入了数据,唯一的问题是它没有触发触发器。

最佳答案

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

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

了解所有这些后,现在使用您正在使用的相同连接通过 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 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43084106/

相关文章:

php - 输入新的 sql 条目时刷新 html 页面

mysql - 如何编写MySQL before insert触发器来向表中插入数据?

php - Yii2 我们可以更改 Assets 目录位置吗?

javascript - JQuery DataTables 和 Jeditable - 字段包含 html 但不应该。为什么?

php - Android - 检查 MySQL 中的 SELECT 语句是否返回值

php - 当先前调用另一个模型时,如何将配置传递给模型?

sql-server - 如何在插入前将触发器写入散列值?

php - 我如何将这个巨大的分割查询变成一个查询

PHP 站点作为 Drupal 安装中的子文件夹

mysql - 无法将 MySQL 日期/时间值转换为 System.DateTime