2010-09-21 12 views
6

J'exécution ce qui suit dans PHP5.3:Créer un trigger mysql via 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); 

Le déclencheur "de photo_fulltext_update" ne reçoit pas créé. Cette instruction s'exécute (et crée tous les triggers) dans phpMyAdmin. J'ai lu quelque part en ligne que le serveur MySQL ne supporte pas du tout l'instruction DELIMITER, donc je cherche un moyen de réécrire cette instruction CREATE TRIGGER en plusieurs étapes afin que mysqli :: multi_query puisse l'envoyer à MySQL .

Merci!

+1

La solution consiste simplement à supprimer les instructions "DELIMITER" et le "|" final. Je suppose que MySQL et/ou mysqli analysent le bloc de déclenchement correctement sans eux. – brianjcohen

+0

Merci pour la réponse, Brian :-) Fonctionne comme un charme! –

Répondre

11

Alors que le mysqli n'a pas à quoi que ce soit avec DELIMITER dans multi-query déclarations, il ne fait rien faire avec des délimiteurs du tout dans les requêtes normales, si juste fourrer vos déclencheurs dans un par un:

$ 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

J'ai fait face en utilisant les mots-clés 'BEGIN' et' END' dans la dernière version de MariaDB :( – PCoder

0

cela pourrait aider aussi: ce qui suit crée un déclencheur sur les tables de Selectes. changez le code et il pourrait faire ce que vous voulez. https://github.com/junicom/mysqltriggerscript

+0

S'il vous plaît, essayez de lire ce http://stackoverflow.com/help/deleted-answers, pour obtenir plus de compréhension comment ** pas ** Réponse: A savoir: "Réponses qui ne répondent pas fondamentalement à la question": ** à peine plus qu'un lien vers un site externe ** –