Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PDO/PHP创建MYSQL触发器_Php_Mysql_Pdo - Fatal编程技术网

使用PDO/PHP创建MYSQL触发器

使用PDO/PHP创建MYSQL触发器,php,mysql,pdo,Php,Mysql,Pdo,我一直在尝试在PHP/PDO中创建一个触发器。我需要使用会话变量,并且只知道如何在PHP上处理它们,因此这是我的出发点 我的质询如下:- $updateTrigger = "DROP TRIGGER IF EXISTS `trigger_repair_update` ; CREATE TRIGGER `trigger_repair_update` BEFORE UPDATE ON $tbl_name FOR EACH ROW BEGIN IF (NEW.repaired_by != OLD.re

我一直在尝试在PHP/PDO中创建一个触发器。我需要使用会话变量,并且只知道如何在PHP上处理它们,因此这是我的出发点

我的质询如下:-

$updateTrigger = "DROP TRIGGER IF EXISTS `trigger_repair_update` ;
CREATE TRIGGER `trigger_repair_update` BEFORE UPDATE ON $tbl_name
FOR EACH ROW
BEGIN
IF (NEW.repaired_by != OLD.repaired_by) THEN
INSERT INTO data_tracking
(`table_name` , `data_id`, `field`, `old_value` , `new_value` , `date_modified`, `username`)
VALUES
('$tbl_name' , NEW.id , 'repaired_by' , OLD.repaired_by , NEW.repaired_by , NOW() , '$user' );
END IF;
IF (NEW.must_have != OLD.must_have) THEN
INSERT INTO data_tracking
(`table_name` , `data_id`, `field`, `old_value` , `new_value` , `date_modified`, `username`)
VALUES
('$tbl_name' , NEW.id , 'must_have' , OLD.must_have , NEW.must_have , NOW() , '$user' );
END IF;
IF (NEW.location != OLD.location) THEN
INSERT INTO data_tracking
(`table_name` , `data_id`, `field`, `old_value` , `new_value` , `date_modified`, `username`)
VALUES
('$tbl_name' , NEW.id , 'location' , OLD.location , NEW.location , NOW() , '$user' );
END IF;
IF (NEW.status != OLD.status) THEN
INSERT INTO data_tracking
(`table_name` , `data_id`, `field`, `old_value` , `new_value` , `date_modified`, `username`)
VALUES
('$tbl_name' , NEW.id , 'status' , OLD.status , NEW.status , NOW() , '$user' );
END IF;
IF (NEW.price != OLD.price) THEN
INSERT INTO data_tracking
(`table_name` , `data_id`, `field`, `old_value` , `new_value` , `date_modified`, `username`)
VALUES
('$tbl_name' , NEW.id , 'price' , OLD.price , NEW.price , NOW() , '$user' );
END IF;
END;";

$sth = $dbLink->prepare($updateTrigger);
$sth->execute();
如果我删除变量并输入PHPMYADMIN,一切正常,因此我的结论是我没有正确分配变量。我应该在这里绑定参数吗

我在很多地方都找过:

不过,我似乎还是错过了一些东西

编辑:- 感谢Michael Berkowski,我添加了错误代码并收到以下消息:-

致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解在/Applications/MAMP/htdocs/repair_list.php:58堆栈跟踪:#0/Applications/MAMP/htdocs/repair_list.php(58):PDO->prepare('DROP TRIGGER IF…')中的第2行“在修复时更新之前”附近使用的正确语法#1{main}在第58行的/Applications/MAMP/htdocs/repair_list.php中抛出

第58行是$sth=$dbLink->prepare($updateTrigger);坐着。

(根据Michael的评论,为了完整起见添加答案)


PDO不支持准备语句中的多个查询。您正在执行一个
拖放
,然后执行一个
创建
。分开行动。首先用
$dbLink->exec(“DROP…”)调用
DROP
,然后准备
CREATE
。从技术上讲,由于没有绑定参数,因此也可以对
CREATE
使用
exec()

是否检查了错误?默认情况下,PDO错误是静默的<代码>$dbLink->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)使其抛出有意义的异常。在PHP中启用显示错误。在脚本的顶部,
error\u reporting(E\u ALL);ini设置(“显示错误”,1)execute()
后,您可以向驱动程序询问可能发生的任何错误。这个方法也会返回一个布尔成功标志。你不能在PDO准备好的情况下运行多个语句。PDO不支持准备语句中的多个查询。您正在执行一个
拖放
,然后执行一个
创建
。分开行动。首先用
$dbLink->exec(“DROP…”)调用
DROP
,然后准备
CREATE
。从技术上讲,由于没有绑定参数,因此也可以将
exec()
用于
CREATE