2010-09-21 21 views
6

jestem wykonywanie następujących czynności w PHP5.3:Tworzenie wyzwalacza mysql przez 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); 

W "photo_fulltext_update" wyzwalacz nie jest uzyskiwanie tworzony. Instrukcja ta działa (i tworzy wszystkie wyzwalacze) w phpMyAdmin. Czytałem w Internecie gdzieś, że serwer MySQL w ogóle nie obsługuje instrukcji DELIMITER, więc szukam sposobu na ponowne napisanie tej wielostopniowej instrukcji CREATE TRIGGER, aby mysqli :: multi_query mogła wysłać ją do MySQL .

Dzięki!

+1

Rozwiązaniem jest po prostu usunąć „DELIMITER” sprawozdanie oraz tylną „|”. Domyślam się, że MySQL i/lub mysqli poprawnie analizuje blok wyzwalacza bez nich. – brianjcohen

+0

Dzięki za odpowiedź, Brian :-) Działa jak urok! –

Odpowiedz

11

Choć mysqli nie do niczego z DELIMITER w multi-query sprawozdania, to faktycznie nie ma nic wspólnego z ograniczników w ogóle w normalnych zapytań, więc po prostu wpakować wyzwala w jeden po drugim:

$ 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

Napotkałem słowa kluczowe BEGIN' i 'END' w najnowszej wersji MariaDB :( – PCoder

0

to może pomóc także: dodaje tworzy spust selectes tabelach. zmienić kod i może zrobić to, co chcesz. https://github.com/junicom/mysqltriggerscript

+0

Proszę, spróbuj przeczytać ten http://stackoverflow.com/help/deleted-answers, aby uzyskać więcej informacji o tym, jak ** nie ** Odpowiedź: Mianowicie: "Odpowiedzi, które zasadniczo nie odpowiadają na pytanie": ** niewiele więcej niż link do strony zewnętrznej ** –

Powiązane problemy