2013-12-11 5 views
0

По некоторым причинам я не могу получить этот триггер для запуска в PHP, даже если он работает в PhpMyAdminУ меня возникли проблемы с выполнением триггера MySQL из PHP

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 $$, и попробовал запустить его с помощью процедурных и объектно-ориентированных методов.

Любая помощь была бы оценена

+2

Какое сообщение об ошибке, если какой-либо вы пытаетесь добавить триггер? Вы пытались добавить триггер через MySQL-клиент команды, а не через phpMyAdmin? –

+0

Я получаю эту ошибку: '# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' в строке 5 '. Я работал над этим раньше, изменяя разделитель до и после триггера, хотя я понимаю, что это не работает через php –

ответ

0
  1. У вас нет прекращения ; после END IF
  2. Вам не нужно @msg переменного на всех, особенно пользователь (сеанс) переменная

Это сказанное триггер может выглядеть

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.'; 
+0

Большое спасибо, потраченные годы, пытаясь заставить это работать. Я использовал PDO и успешно модифицировал свой код, чтобы он работал с PDO. –

+0

Вы очень желанны. Удачи :) – peterm

0

Попробуйте выполнить приведенный ниже код.

DELIMITER $$ 

DROP TRIGGER IF EXISTS testing.check_title$$ 
USE `testing`$$ 


CREATE TRIGGER `check_title` BEFORE INSERT ON `customer` FOR EACH ROW 
    IF NEW.title NOT IN ('Mr','Miss','Ms','Dr','Mrs') THEN 
     SIGNAL sqlstate '45000' SET message_text = 'Constraint check_title violated'; 
    END IF 
$$ 
DELIMITER ; 
Смежные вопросы