php-从php

时间:2017-03-29 04:03:42

标签: php mysql triggers insert mysql-workbench

我的问题基本上是来自 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函数也成功插入数据,唯一的问题是它不会触发触发器。

1 个答案:

答案 0 :(得分:0)

我最近在数据库课程的一个小型项目中工作时遇到了同样的问题,在MySQL终端上进行研究和猛烈抨击之后,我发现您正在设置和更新的变量(@lastid)是仅客户端实例变量,并且其寿命和作用域仅适用于该连接实例。真正发生的是,当您从PHP更新变量时,实际上使用的是数据库连接实例,而不是MySQL工作台的连接实例。因此,实际上是通过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];

}

这可能会为您提供所需的结果,因为您正在使用相同的连接实例变量。