从php插入后未激发php-MySQL触发器
我的问题基本上是,触发器(MySQL)在从PHP函数插入数据后没有触发,我不知道为什么。当我从MySQL工作台插入数据时,触发器会正常触发 下面是一个示例代码,以便于更好地理解: PHP函数:从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
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