我的问题基本上是触发器 (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 实例)检查它。
为了弄清楚这个问题,使用命令行界面打开两个连接到同一个数据库,从一个实例设置变量并尝试从另一个实例访问它。您将在第二个终端上获得空值。
了解所有这些后,现在使用您正在使用的相同连接通过 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/