我的问题基本上是来自 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函数也成功插入数据,唯一的问题是它不会触发触发器。
答案 0 :(得分:0)
我最近在数据库课程的一个小型项目中工作时遇到了同样的问题,在MySQL终端上进行研究和猛烈抨击之后,我发现您正在设置和更新的变量(@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];
}
这可能会为您提供所需的结果,因为您正在使用相同的连接实例变量。