我正在为房主协会建立一个Joomla网站。当用户付款时,我希望mySQL jos_Payments表(保存付款的地方)自动获取用户所在房屋的ID。
我在jos_Payments表上创建了一个触发器,BEFORE INSERT。我正在尝试将新添加的行的home_id字段设置为等于在jos_comprofiler表中查找的cb_home_id值。
SET NEW.home_id = (SELECT cb_home_id FROM jos_comprofiler WHERE jos_comprofiler.user_id = NEW.user_id);
我已经在这方面寻求帮助,并尝试将变量定义为中间步骤,但似乎没有任何帮助。它只是告诉我我的SQL语法有错误。如果我使用有效的user_id而不是NEW.user_id,那么SELECT语句在触发器之外工作。
看起来这应该是这么简单。我哪里错了?
答案 0 :(得分:0)
我认为代码示例是BEFORE INSERT触发器的一部分,该触发器无法创建。
我遇到了Joomla 2.5的类似问题,在安装或更新过程中无法创建触发器,而sql语句工作正常。 您将无法创建包含多于1个分号(;)的触发器,函数,过程或任何sql语句。这就是为什么所有其他语句似乎都适用于您的脚本。
我尝试了许多无法正常工作的应用程序,包括:
<install> <sql> <file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file> </sql> </install>
<install> <queries> <query id="1"> CREATE TRIGGER `...` AFTER UPDATE ON `#__...` FOR EACH ROW BEGIN ...codeline...; ...codeline...; END </query> <query id="2"> ... </query> </queries> </install>
(抱歉使用blockquotes代替代码示例,否则post将无法正确显示)
它工作的唯一方法是通过自Joomla 2.5以来可用的installscript选项,请参阅https://docs.joomla.org/J2.5:Developing_a_MVC_Component/Adding_an_install-uninstall-update_script_file。
这不是开箱即用的。我不得不删除访问检查(带有define的第一行)并将以下代码放在install($parent)
和update($parent)
函数中以添加触发器:
$db = JFactory::getDbo();
$db->setQuery("DROP TRIGGER IF EXISTS `...`");
$db->query();
$query="CREATE TRIGGER `...` AFTER UPDATE ON `#__...` FOR EACH ROW
BEGIN
...codeline...;
...codeline...;
END";
$db->setQuery($query);
$db->query();
if ($error = $db->getErrorMsg()) {
$this->setError($error);
return false;
}
...next sqlstatement or code...
return true;
确保此安装程序php文件中的类名与您的组件名称相匹配,包括init caps,如:
class com_YourComponentNameInstallerScript
此外,请不要忘记使用<?php
标记打开文件,但不要将?>
结束标记放在最后。
将文件作为php文件保存在安装包的根目录中,与清单文件处于同一级别,并将此文件名添加到组件描述与管理或站点标记之间某处的清单文件中:
<scriptfile>yourcomponentname_install.php</scriptfile>
此方法也适用于创建存储过程和函数。