2010-09-21 18 views
6

estoy ejecutando el siguiente en PHP5.3:Crear el disparador de mysql a través de PHP?

$sql = " 
CREATE TRIGGER `_photo_fulltext_insert` AFTER INSERT ON `photo` FOR EACH ROW INSERT INTO `_photo_fulltext` SELECT * FROM `photo` WHERE `id`=NEW.`id`; 
CREATE TRIGGER `_photo_fulltext_delete` AFTER DELETE ON `photo` FOR EACH ROW DELETE FROM `_photo_fulltext` WHERE `id`=OLD.`id`; 

DELIMITER | 
CREATE TRIGGER `_photo_fulltext_update` AFTER UPDATE ON `photo` 
    FOR EACH ROW BEGIN 
    DELETE FROM `_photo_fulltext` WHERE `id`=NEW.`id`; 
    INSERT INTO `_photo_fulltext` SELECT * FROM `photo` WHERE `id`=NEW.`id`; 
    END; 
| 
DELIMITER ; 
"; 

$mysqli->multi_query($sql); 

El disparador "photo_fulltext_update" no está siendo creado. Esta instrucción se ejecuta (y crea todos los desencadenadores) en phpMyAdmin. He leído en línea en alguna parte que el servidor MySQL no soporta la sentencia DELIMITER en absoluto, así que estoy buscando una manera de volver a escribir este multi-paso instrucción CREATE TRIGGER para que mysqli :: consulta múltiple puede enviarlo a MySQL .

Gracias!

+1

La solución es simplemente eliminar las declaraciones "los delimitadores" y la posterior "|". Supongo que MySQL y/o MySQL analizan correctamente el bloque disparador sin ellos. – brianjcohen

+0

Gracias por la respuesta, Brian :-) funciona como un encanto! –

Respuesta

11

Mientras que el mysqli no a cualquier cosa con DELIMITER en multi-query declaraciones, que en realidad no hace nada con ningún delimitador en absoluto en las consultas normales, por lo que sólo empujar los factores desencadenantes de uno a uno:

$ cat i.php 
<?php 
$mysqli = new mysqli('localhost', 'test', '', 'test'); 
$sql = " 
CREATE TRIGGER `_foo_fulltext_update` AFTER UPDATE ON `foo` 
    FOR EACH ROW BEGIN 
    DELETE FROM `bar` WHERE `bar`=NEW.`bar`; 
    INSERT INTO `bar` (bar) SELECT bar FROM `foo` WHERE `bar`=NEW.`bar`; 
    END; 
"; 
$mysqli->query($sql); 
var_dump($mysqli->error); 
$ php i.php 
string(0) "" 
$ mysql 
mysql> use test; 

Database changed 
mysql> show triggers\G 
*************************** 1. row *************************** 
      Trigger: _foo_fulltext_update 
       Event: UPDATE 
       Table: foo 
      Statement: BEGIN 
    DELETE FROM `bar` WHERE `bar`=NEW.`bar`; 
    INSERT INTO `bar` (bar) SELECT bar FROM `foo` WHERE `bar`=NEW.`bar`; 
    END 
       Timing: AFTER 
      Created: NULL 
      sql_mode: 
      Definer: [email protected] 
character_set_client: latin1 
collation_connection: latin1_swedish_ci 
    Database Collation: utf8_general_ci 
1 row in set (0.00 sec) 
+0

que se enfrentaron el uso de '' BEGIN' y palabras clave END' en la última versión del MariaDB :( – PCoder

0

esto podría ayudar también: la siguiente crea un disparador en tablas SELECTES. cambie el código y podría hacer lo que quiera. https://github.com/junicom/mysqltriggerscript

+0

Por favor, intente leer este http://stackoverflow.com/help/deleted-answers, para obtener una mayor comprensión de cómo no ** ** respuesta. A saber: "Respuestas que no responden fundamentalmente a la pregunta": ** apenas más que un enlace a un sitio externo ** –

Cuestiones relacionadas