2016-02-26 58 views
1

我有一个记录库存数量的表格。当股价走低时,我设置触发器来警告用户。测试时,触发器触发,显示消息,但股票未更新。我做错了什么?是否有另一种方法来设置触发器(不使用SIGNAL SQLSTATE)?我在uWamp中使用phpMyAdmin 4.2.7.1。感谢您的建议。当触发器在phpMyAdmin中触发时显示一条消息

代码触发:

DELIMITER $$ 
CREATE TRIGGER low_stock_message 
AFTER update ON stock_quantity 
FOR EACH ROW BEGIN 
    IF (NEW.Regular_Menu < 50) THEN 
     SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning, Regular Menu has a low stock!'; 
    END IF; 
    IF (NEW.Savers < 50) THEN 
     SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning, Savers Menu has a low stock'; 
    END IF; 
    IF (NEW.Breakfast < 50) THEN 
     SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning, Breakfast Menu has a low stock!'; 
    END IF; 
END$$ 
DELIMITER ; 

测试查询:

UPDATE stock_quantity 
SET Regular_Menu=48 
WHERE Outlet_ID=1; 

回答

0

我怀疑这是因为你使用SIGNAL SQL STATE '02000'其中,according to the documentation,是一个异常信号。特别是,“如果信号在函数中未处理,则语句结束。”

0

您必须使用sqlstate '45000'并设置为message_text。让我用一个例子来解释吧..在这个例子可循,我们的目标是防止用户从自己的帖子投票,这样的事情:

存根

create table votes (user_id int); 

delimiter // 

create trigger prevent_self_votes before insert on votes 
for each row 
begin 
    if (new.user_id = 12) then // 12 is id of voter 
     signal sqlstate '45000' set message_text = 'You cannot vote for yourself, dude!'; 
    end if; 
end // 

delimiter ; 

PHP脚本

<?php 

$db = new PDO('mysql:host=localhost;dbname=test', 'test', 'test'); 
$sql = 'insert into votes values (:user_id)'; 
$statement = $db->prepare($sql); 
if ($statement === false) { 
    echo 'statement is false'; 
    exit(); 
} 

try { 
    $result = $statement->execute(array(':user_id'=>12)); 
    if ($result === false) { 
     $error = $statement->errorInfo(); 
     print_r($error); 
     echo "$error[2] ... is the error reported by trigger\n"; 
    } 
    else { 
     print_r($result); 
     echo 'Inserted', "\n"; 
    } 
} 
catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

?> 

结果

$ php test.php 
Array 
(
    [0] => 45000 
    [1] => 1644 
    [2] => You cannot vote for yourself, dude! 
) 
You cannot vote for yourself, dude! ... is the error reported by trigger 

正如您在此处注意到的,您可以使用$statement->errorInfo()[2]的输出来提取触发器提供的信息。

表示数组中的第一项是SQLSTATE ANSI SQL错误代码,第二项是驱动程序特定的错误代码,第三项是驱动程序特定的错误消息。