2015-08-07 9 views
5

Questa è la mia dichiarazione mysql grillettoMysql errore per l'utilizzo di delimitatori in trigger

DELIMITER | 
CREATE TRIGGER kk AFTER UPDATE 
    ON location FOR EACH ROW 
BEGIN 
     IF NEW.name not in(SELECT A.name FROM filter A WHERE (NEW.name = A.name))THEN 

     IF NEW.location_name != OLD.location_name THEN 
      INSERT INTO filter(old_location_name,new_location_name) 
      VALUES (OLD.location_name, NEW.location_name); 

     ELSE 

       UPDATE filter SET old_location_name = OLD.location_name , new_location_name = NEW.location_name WHERE name = OLD.name; 

     END IF; 

     ELSE 

      UPDATE filter SET old_location_name = OLD.location_name , new_location_name = NEW.location_name WHERE name = OLD.name; 


     END IF; 

    END;| 
DELIMITER ; 

Questo funziona bene, quando ho incolla questo codice in phpMyAdmin.

E nel mio progetto

$sqlDrop = "DROP TRIGGER IF EXISTS `kk`";  
$resDrop = parent::_executeQuery($sqlDrop); 

echo $sql = "same above delimiter trigger query"; 
$rs = parent::_executeQuery($sql); 

Ora i $sql echi economico in un unico linea

DELIMITER | CREATE TRIGGER kk AFTER UPDATE ON location FOR EACH ROW BEGIN IF NEW.name not in(SELECT A.name FROM filter A WHERE (NEW.name = A.name))THEN IF NEW.location_name != OLD.location_name THEN INSERT INTO filter(old_location_name,new_location_name,name) VALUES (OLD.location_name, NEW.location_name); ELSE UPDATE filter SET old_location_name = OLD.location_name , new_location_name = NEW.location_name WHERE name = OLD.name; END IF; ELSE UPDATE filter SET old_location_name = OLD.location_name , new_location_name = NEW.location_name WHERE name = OLD.name; END IF; END;| DELIMITER ; 

e la query non viene eseguito. E quando ho incollare l'istruzione eco nel mio phpMyAdmin, its me mostrando un errore

enter image description here

Quindi, quello che potrebbe essere il problema. È il modo giusto per eseguire query di trigger?

risposta

3

Non sono sicuro se questo davvero aiuta. Che ne dici di eseguire ogni query separatamente?

$startDelimit = 'DELIMITER |'; 
$resStart = parent::_executeQuery($startDelimit); 

Allora la vostra istruzione CREATE grilletto

$sql = "CREATE TRIGGER kk AFTER UPDATE ...... END IF; END;"; 
$rs = parent::_executeQuery($sql); 

E poi ultima affermazione

$endDelimit = '| DELIMITER ;'; 
$resEnd = parent::_executeQuery($endDelimit); 
+0

Grazie a questo ha funzionato bene ... evviva – Matarishvan

2

Non è sicuro su qualsiasi argomento relativo PHP, ma provare a modificare il codice di attivazione come di seguito

DELIMITER | 
CREATE TRIGGER kk AFTER UPDATE 
    ON location FOR EACH ROW 
BEGIN 
     IF NEW.name not in(SELECT A.name FROM filter A WHERE NEW.name = 
A.name) AND NEW.location_name != OLD.location_name THEN  
      INSERT INTO filter(old_location_name,new_location_name) 
      VALUES (OLD.location_name, NEW.location_name);  
     ELSE  
       UPDATE filter SET old_location_name = OLD.location_name , 
new_location_name = NEW.location_name WHERE name = OLD.name;  
     END IF;  
END;| 
DELIMITER ; 
+0

Grazie Rahul. Tats in realtà un errore di battitura .. – Matarishvan

+0

@Matarishvan, vedi modifica in risposta se questo aiuta. – Rahul