2016-05-02 11 views
0

私はmysqlを使用しています.Joomla 3.4.8でトリガーを作成したいと思います。私はJoomlaのコントローラでそれを実行した場合 enter image description hereSQL構文にエラーがあります。 Joomlaでトリガーを作成する

は:

$db = JFactory::getDbo(); 
$sql = $db->getQuery(true); 
$sql = 'LOCK TABLES id0ap_virtuemart_products WRITE; 
     DROP TRIGGER IF EXISTS update_vm_products ; 
     DELIMITER // 
     CREATE TRIGGER update_vm_products 
     AFTER UPDATE 
     ON id0ap_virtuemart_products FOR EACH ROW 
     BEGIN 
     INSERT INTO id0ap_virtuemart_notifications 
     VALUES ("", NEW.virtuemart_product_id, "product","update"); 
     END // 
     DELIMITER ; 
     UNLOCK TABLES;'; 
$db->setQuery($sql); 
$db->execute(); 

私が手:

1064あなたが持っている

私はmySQLWorkbenchでの作品SQLコードを持っていますあなたのSQL構文のエラー。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい構文が「DROP TRIGGER IF EXISTS update_vm_products」の近くで使用するようにしてください。 DELIMITER // '2行目SQL = LOCKテーブルid0ap_virtuemart_products WRITE;存在する場合はDROP TRIGGER if update_vm_products; DELIMITER // CREATE TRIGGER update_vm_products after update on id0ap_virtuemart_products各行ごとにINSERT INTO id0ap_virtuemart_notifications VALUES( ""、NEW.virtuemart_product_id、 "product"、 "update"); END // DELIMITER; UNLOCK TABLES;

私は問題を見つけることができません。しかし、私はそれを解決しようとしている間、私は何か奇妙なものを突き止めました。私はDELIMITERSを削除するSQLおよびDROP一部変更する場合:

$sql = 'CREATE TRIGGER update_vm_products 
     AFTER UPDATE 
     ON id0ap_virtuemart_products FOR EACH ROW 
     BEGIN 
     INSERT INTO id0ap_virtuemart_notifications 
     VALUES ("", NEW.virtuemart_product_id, "product","update"); 
     END ;'; 

を使用すると、DROPパーツを追加するとき、あなたはそれが動作するトリガーを作成して、トリガーを作成しようとするかどうか、だけ失敗します。何か案が?これを行うためのオブジェクト指向の方法はありますか?

ありがとうございます!

+0

複数のクエリ(PDO \ _MYSQL、PDO \ _MYSQLND)に対する[PDOサポート]の可能な複製(http://stackoverflow.com/questions/6346674/pdo-support-for-multiple-queries-pdo-mysql-pdo -mysqlnd) – middlestump

+0

'LOCK TABLES'と 'DROP TRIGGER'は2つの異なるステートメントで、トリガの前に個別に実行する必要があります。また、PDOやmysqliライブラリ経由でトリガを実行するときに' delimiter'パーツは必要ありません。そして最後に 'UNLOCK TABLES;'を別の声明で出してください。試してみてください。 –

+0

@middlestump私はなぜそれが可能なのか分かりません。質問は私とは関係がなく、答えはJoomlaでは不可能ではありません。 –

答えて

0

私はjoomlaのエキスパートではありませんが、mysql api joomlaがSQL文を実行するために使用するものは、呼び出しごとに1つのSQL文しか実行できないようです。それぞれのSQL文を単独で実行しようとします。

+0

それは動作しますが、結果は気に入らない:http://prntscr.com/azrd6g 私は@Abhik Chakrabortyに尋ねたのと同じ質問がありますが、これを行うにはよりクリーンな方法がありますか?ありがとう –

+0

これはクエリを実行する "ダーティ"な方法ではなく、実際にはすべてのステートメントを1つのステップで実行するよりも安全です。 1回の呼び出しで複数のクエリを実行できない場合、SQLインジェクション攻撃を成功させるのは非常に困難です。 – Shadow

+0

ユーザーの入力がないようにクエリが実行されます。それはコーディングの面で私には汚いと思われますが、一度に複数のクエリを実行できない場合は... –

関連する問題