2010-09-21 18 views
6

Ben PHP5.3 aşağıdaki yürütme ediyorum: PHP ile mysql tetikleyicisi oluşturulsun mu?

$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); 

"photo_fulltext_update" tetik

oluşturulan almıyor. Bu ifade phpMyAdmin'de çalışır (ve tüm tetikleyicileri oluşturur). MySQL sunucusunun DELIMITER deyimini desteklemediği bir yerde çevrimiçi okudum, bu yüzden mysqli :: multi_query'nin MySQL'e gönderebilmesi için bu çok adımlı CREATE TRIGGER deyimini yeniden yazmanın bir yolunu arıyorum .

Teşekkürler!

+1

çözüm basitçe "DELIMITER" ifadeleri ve sondaki kaldırmaktır. Sanırım MySQL ve/veya mysqli tetikleyici bloğu onlar olmadan doğru şekilde ayrıştırır. – brianjcohen

+0

Cevabınız için teşekkürler, Brian :-) Bir çekicilik gibi çalışır! –

cevap

11

mysqliDELIMITERmulti-query yılında ifadelere şey, aslında normal bir sorgularda hiç bir sınırlayıcı ile hiçbir şey yapmaz etmese de, bu yüzden sadece birer birer Tetikleyicilerinizi kıpırdamak:

$ 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

MariaDB'nin en son sürümünde "BEGIN" ve "END" anahtar kelimeleri kullanarak karşılaştım :( – PCoder

0

bu da yardımcı olabilir: şu selectes tablolarda bir tetikleyici oluşturur. Kodu değiştir ve istediğini yapabilir. "|" https://github.com/junicom/mysqltriggerscript

+0

Daha fazla bilgi edinmek için lütfen bu http://stackoverflow.com/help/deleted-answers adresini okuyun. ** Cevap: Yani: "Soruya temel olarak cevap vermeyen cevaplar": ** harici bir siteden bir linkten çok daha fazlası ** –

İlgili konular