我一直在尝试在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,我添加了错误代码并收到以下消息: -
致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在/Applications/MAMP/htdocs/repair_list.php的第2行''修复TRAGGER
trigger_repair_update
之前使用“更新行更新”之前使用正确的语法: 58堆栈跟踪:#0 /Applications/MAMP/htdocs/repair_list.php(58):PDO->准备('DROP TRIGGER IF ...')#Applications {MAMP / htdocs / repair_list第58行的.php
第58行是$ sth = $ dbLink-> prepare($ updateTrigger);坐在
答案 0 :(得分:1)
(为了完整性而添加答案,来自Michael的评论)。
PDO不支持预准备语句中的多个查询。您正在执行DROP
后跟CREATE
。分开行动。首先使用DROP
致电$dbLink->exec("DROP...")
,然后准备CREATE
。从技术上讲,由于您没有绑定参数,因此您也可以exec()
使用CREATE
。