2010-09-21 4 views
6

Sto eseguendo il seguente in PHP5.3:Crea un trigger mysql tramite 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); 

Il trigger "photo_fulltext_update" non è sempre creato. Questa istruzione viene eseguita (e crea tutti i trigger) in phpMyAdmin. Ho letto online da qualche parte che il server MySQL non supporta affatto l'istruzione DELIMITER, quindi sto cercando un modo per riscrivere questa istruzione CREATE TRIGGER in più fasi in modo che mysqli :: multi_query possa inviarlo a MySQL .

Grazie!

+1

La soluzione è semplicemente rimuovere le istruzioni "DELIMITER" e il finale "|". Immagino che MySQL e/o mysqli analizzino correttamente il blocco trigger senza di loro. – brianjcohen

+0

Grazie per la risposta, Brian :-) Funziona come un fascino! –

risposta

11

Mentre il mysqli non per nulla con DELIMITER in multi-query dichiarazioni, in realtà non fa nulla con qualsiasi delimitatori affatto nelle query normali, quindi basta spingere i trigger in uno per 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

Ho affrontato le parole chiave 'BEGIN' e' END' nell'ultima versione di MariaDB :( – PCoder

0

questo potrebbe aiutare pure: la seguente crea un trigger sulle tabelle Selectes. cambia il codice e potrebbe fare ciò che vuoi. https://github.com/junicom/mysqltriggerscript

+0

Per favore, prova a leggere questo http://stackoverflow.com/help/deleted-answers, per capire meglio come ** non ** risposta. Ovvero: "Risposte che non rispondono fondamentalmente alla domanda": ** a malapena più di un collegamento a un sito esterno ** –