2015-08-07 10 views
5

Dies ist meine mysql Trigger AnweisungMysql Fehler für die Verwendung von Trennzeichen 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 ; 

Dies funktioniert gut, wenn ich diesen Code in phpMyadmin einfügen.

Und in meinem Projekt

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

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

Nun ist die $sql Anweisung echos in einer einzigen Zeile

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 ; 

und die Abfrage wird nicht ausgeführt. Und wenn ich die Echo-Anweisung in meinem phpMyadmin einfügen, zeigen sein mir einen Fehler

enter image description here

Also, was das Problem sein könnte. Ist es die richtige Art Trigger-Anfragen auszuführen?

Antwort

3

Ich bin mir nicht sicher, ob dies wirklich Ihnen hilft. Wie wäre es, jede Anfrage einzeln auszuführen?

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

Ihre erstellen Dann Statement Trigger

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

Und dann letzte Anweisung

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

Danke das hat gut funktioniert ... Prost – Matarishvan

2

Nicht sicher jedes PHP bezogenes Problem, sondern versuchen, wie Ihr Trigger-Code zu modifizieren unter

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

Dank Rahul. Tats eigentlich ein Tippfehler .. – Matarishvan

+0

@Matarishvan, siehe in Antwort bearbeiten, wenn das hilft. – Rahul