21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
midlan
Profil
Ahoj,

vytvářím instalační skript pro modul do jednoho systému. Vše je v pořádku až na pokus vytvořit v databázi trigger dotazem:

DELIMITER $$

CREATE TRIGGER prevent_events_doubling BEFORE INSERT ON product_events
FOR EACH ROW
BEGIN
    DECLARE is_duplicate BIT(1) DEFAULT 0;

    IF (NOT new.system_applied) THEN

        -- zde je dlouhý dotaz pro naplnění hodnoty is_duplicate

        IF (is_duplicate) THEN
            SIGNAL SQLSTATE '45013' SET MESSAGE_TEXT = 'There exists already same event for this product.';
        END IF;
    END IF;
END$$

DELIMITER ;

Celý problém je v příkazu DELIMITER $$. Databáze ho odmítá a bez změny oddělovače ten trigger prostě nejde vytvořit. Vyzkoušel jsem snad už všechny rady co jsem vygooglil a nic nezabralo. Zajímavé je, že přes phpmyadmin nebo adminer dotaz v pohodě projde, ty jsou také v PHP, takže to nějak musí jít. Ještě dodávám, že připojení do databáze je PDO mysql.

Díky za rady.
Keeehi
Profil
midlan:
V PHP má znak $ speciální význam takže ho musíš v určitých kontextech escapovat.
Řešení
- použij apostrofy pro obalení textu jako string (v nich se proměnné nenahrazují hodnotami a $ tam tedy nemá speciální význam)
nebo
- použiješ uvozovky a každý výskyt $ nahradíš \$
midlan
Profil
Keeehi
Děkuji za upozornění, ale o tomto chování velmi dobře vím. V tom chyba není. Hlásí to přibližně toto:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $$
Keeehi
Profil
OK, a posíláte to na třikrát? Protože to jsou ve skutečnosti 3 příkazy.
midlan
Profil
Ano to už jsem taky zkoušel, rozdíl žádný. Zkusil jsem vše co jsem k tomuto problému vygooglil a nepomohlo nic.

Zkoušel jsem se podívat i jak to má udělaný adminer, ale nejsem z toho moudrý.
midlan
Profil
nikdo neví?

EDIT: tak se omlouvám za spam, právě jsem to vyřešil. Nad tím PDO připojením byly ještě nějaké třídy framoworku a metodu query ve skutečnosti předávaly na prepare. Při použití nativní PDO instance jde ten CREATE TRIGGER poslat bez použití DELIMITER metodou query tak i exec.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0