Создать триггер mysql через PHP? - PullRequest
7 голосов
/ 21 сентября 2010

Я выполняю следующее в PHP5.3:

$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" не создается. Этот оператор выполняется (и создает все триггеры) в phpMyAdmin. Я где-то читал в Интернете, что сервер MySQL вообще не поддерживает оператор DELIMITER, поэтому я ищу способ переписать этот многошаговый оператор CREATE TRIGGER, чтобы mysqli :: multi_query мог отправить его в MySQL. ,

Спасибо!

Ответы [ 3 ]

12 голосов
/ 21 сентября 2010

Хотя mysqli ничего не делает с операторами DELIMITER в multi-query, в обычных запросах оно вообще ничего не делает с какими-либо разделителями, поэтому просто вставляйте триггеры один за другим:

$ 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: root@localhost
character_set_client: latin1
collation_connection: latin1_swedish_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
1 голос
/ 21 сентября 2010
0 голосов
/ 15 августа 2013

это также может помочь: следующее создает триггер для таблиц выбора.измените код, и он может делать то, что вы хотите.https://github.com/junicom/mysqltriggerscript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...