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

标签 php mysql

由于某种原因,我无法让这个触发器在 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/

相关文章:

php - 命名捕获对的正则表达式问题

php - 多功能按钮

mysql - SQL : Error at Union All in sql query

MySQL - 只需要选择行,其中对于 id,另一列中有两个可能的数字

python - 为什么同一对象在一个实例而不是其他实例中抛出 "NoneType"对象属性错误?

javascript - 如何下载外部视频而不在浏览器中播放?

php - MySQL:通过if语句选择奇数行

php - 将 html 表单 cloumn 数组转换为行 php

javascript - 近10万条记录的分页、搜索和排序

PHP查询mysql数据库,echo长名称换取短表值