gpt4 book ai didi

php - 我在从 php 执行 MySQL 触发器时遇到问题

转载 作者:行者123 更新时间:2023-11-30 00:56:09 26 4
gpt4 key购买 nike

由于某种原因,我无法让这个触发器在 PHP 中运行,即使它在 phpMyAdmin 中工作

CREATE TRIGGER `check_title` BEFORE INSERT ON `customer` 
FOR EACH ROW
BEGIN
IF NEW.title NOT IN ('Mr','Miss','Ms','Dr','Mrs')THEN
SET @msg := 'Constraint check_title violated';
SIGNAL sqlstate '45000' SET message_text = @msg;
END IF
END

我尝试过使用 DELIMTER $$ 命令,并尝试通过过程和面向对象的方法来运行它。

如有任何帮助,我们将不胜感激

最佳答案

  1. END IF 之后没有终止 ;
  2. 您根本不需要 @msg 变量,尤其是用户( session )变量

话虽这么说,你的触发器可能看起来

CREATE TRIGGER `check_title` 
BEFORE INSERT ON `customer`
FOR EACH ROW
BEGIN
IF NEW.title NOT IN('Mr','Miss','Ms','Dr','Mrs') THEN
SIGNAL sqlstate '45000' SET message_text = 'Constraint check_title violated';
END IF;
END

这里是SQLFiddle 演示

<小时/>

现在,从 php 执行它,您不需要更改 DELIMITER,因为它是 mysql 客户端命令而不是 SQL 语句。

您没有提到您实际使用的扩展(mysqli_*PDO,希望没有弃用mysql_*),所以这是您的 php 代码在 mysqli_*

中的样子
<?php
$db = new mysqli('localhost', 'user', 'password', 'dbname');
if (!$db) {
die('Could not connect: ' . $db->connect_error); //TODO better error handling
}

$sql = "
CREATE TRIGGER check_title
BEFORE INSERT ON customer
FOR EACH ROW
BEGIN
IF NEW.title NOT IN('Mr','Miss','Ms','Dr','Mrs') THEN
SIGNAL sqlstate '45000' SET message_text = 'Constraint check_title violated';
END IF;
END";

if (!$db->query($sql)) {
die('Can\'t create the trigger: ' . $db->error); //TODO better error handling
}

$db->close();

echo 'Trigger successfully created.';

关于php - 我在从 php 执行 MySQL 触发器时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20529287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com