PHP:使用触发器使用sqlsrv pdo插入

PHP:使用触发器使用sqlsrv pdo插入,php,sql-server,triggers,pdo,unique,Php,Sql Server,Triggers,Pdo,Unique,我正在使用sqlsrv pdo驱动程序(同时使用5.2和5.3版本),我看到了我认为是非预期的行为。希望我做错了什么 我在sql express 2008中创建了两个表。一个(位置)是与其他表共享的主键表。另一个表(Rooms)有2(或更多)列…一个键列作为外键链接到第一个表和一(或更多)个数据列。所以它看起来像: 地点 LocationID int 1 2 3 4 五, 房间 LocationID int,Roomname varchar(50) 2,“生活” 4.“餐饮” 2,4两者都链接回

我正在使用sqlsrv pdo驱动程序(同时使用5.2和5.3版本),我看到了我认为是非预期的行为。希望我做错了什么

我在sql express 2008中创建了两个表。一个(位置)是与其他表共享的主键表。另一个表(Rooms)有2(或更多)列…一个键列作为外键链接到第一个表和一(或更多)个数据列。所以它看起来像:

地点

LocationID int
1
2
3
4
五,

房间

LocationID int,Roomname varchar(50)
2,“生活”
4.“餐饮”

2,4两者都链接回位置表

然后在Roomname列上创建一个唯一约束:

ALTER TABLE Rooms ADD CONSTRAINT UniqueRoom UNIQUE (Roomname)
接下来,我在房间表上创建了一个INSTEAD OF INSERT触发器:

CREATE TRIGGER [dbo].[Rooms_INSERT] 
on [dbo].Rooms 
INSTEAD OF INSERT 
as 
BEGIN 
 INSERT INTO dbo.Locations DEFAULT VALUES 
 INSERT INTO dbo.Rooms select @@IDENTITY, Roomname from inserted    
END  
现在,我可以通过以下方式将数据插入rooms表:

INSERT INTO Rooms VALUES (null, 'roomname')
我使用sqlsrv PDO对象通过PHP插入数据:

$db = new PDO("sqlsrv:server=$serverName;Database=db", "", "");

$sql=("insert into Rooms values (null,?)");
$dbobj = $db->prepare($sql);
if($dbobj->execute(array("dining")))
    print "<p>insert successful</p>";
else
    print "<p>insert unsuccessful</p>";
$db=new-PDO(“sqlsrv:server=$serverName;Database=db”,“”,“”);
$sql=(“插入房间值(空,”);
$dbobj=$db->prepare($sql);
if($dbobj->execute(数组(“餐饮”))
打印“插入成功”

”; 其他的 打印“插入不成功”

”;
从上面列出的表开始,我得到以下结果:

  • 将insert语句修改为“insert into ROOMES values(?)—按预期失败,因为它需要两个参数“insert UNSUCCESS”
  • 将insert语句恢复为正常,尝试插入数组(“卧室”)-按预期成功,“insert SUCCESS”
  • 重新尝试插入数组(“卧室”)-db insert失败,两个表中都没有条目,但报告尝试成功“insert SUCCESS”

为什么第三次尝试在没有对数据库进行持久输入的情况下报告为成功?或者,更具体地说,我如何修改我的PHP或SQL以正确检测这样的插入是否由于违反唯一约束而失败?

在建议之后,我在没有唯一约束的情况下进行了测试,而是通过修改触发器来违反外键约束,仅尝试将不存在的位置值插入到Rooms表中。结果是一样的。看起来PHP调用激发的触发器成功了,即使触发器本身失败了。您找到解决方案了吗?在提出建议后,我在没有唯一约束的情况下进行了测试,而是违反了外键约束,将触发器修改为仅尝试将不存在的位置值插入到Rooms表中。结果是一样的。看起来PHP调用被触发的触发器是成功的,即使触发器本身失败了。您找到解决方案了吗?