PHP链接触发器如何创建/存储?

PHP链接触发器如何创建/存储?,php,mysql,triggers,Php,Mysql,Triggers,我一直在和一个小团队合作一个关于虚构世界建筑的小项目。我的任务是管理实体(岩石/地点/物品)的触发/链接行为,这些实体可以通过多种方式触发,例如向湖中投掷魔法石,怪物X将出现,并继续触发链中的东西,直到它到达终点 我试过这个 $Trigger_123 = new stdClass(); $Trigger_123->name = "Name"; $Trigger_123->renderOn = ? // (object_345->throwedInLakeX) ? 如何将其存储

我一直在和一个小团队合作一个关于虚构世界建筑的小项目。我的任务是管理实体(岩石/地点/物品)的触发/链接行为,这些实体可以通过多种方式触发,例如向湖中投掷魔法石,怪物X将出现,并继续触发链中的东西,直到它到达终点

我试过这个

$Trigger_123 = new stdClass();
$Trigger_123->name = "Name";
$Trigger_123->renderOn = ? // (object_345->throwedInLakeX) ?
如何将其存储在MySQL中?我能检查一下它是否是链条部件吗?我还尝试了MySQL触发器,但我找不到在这些触发器上执行PHP的方法。例如,在更新或删除时运行PHP代码

Cron-jobs不是一个选项,因为将来会添加很多东西,而且Cron-jobs需要很多时间才能完成,我希望找到一个更基于php的解决方案


已编辑(添加一些附加信息)

我试着用很多方法来实现这一点。我最终得到了一个类似于debian软件包的依赖系统,我认为它不适合这种情况

数据库结构

Table "object"
--------------
ID (int)
Name (varchar)

Table "triggers"
----------------
ID (int)
Name (varchar)
Data (blob) // usually, I store php code and use eval to run

Table "attributes"
------------------
ID (int)
attribute (varchar)
value (blob)

Table "object_has_triggers"
---------------------------
ID (int)
ObjectID (int)
TriggerID (int)

Table "object_has_attributes"
-----------------------------
ID (int)
ObjectID (int)
AttributeID (int)
因此,我希望每次都执行一个PHP代码片段

  • 数据库事务,在提交到数据库之前和之后
  • 如果一个对象附加了X个触发器,请解析它们
  • 如果X触发的每个触发器的所有依赖项都得到满足,则必须对其进行检查
问题: 这样的东西甚至可以用PHP构建,还是应该尝试其他脚本语言,比如python

因此,我希望每次都执行一个PHP代码片段

  • 数据库事务,在提交到数据库之前和之后
您应该在触发器中调用PHP函数。用PHP编写调用所需的所有逻辑

  • 如果一个对象附加了X个触发器,请解析它们
附加了X触发器的对象,而不是将其转换为PHP代码或在PHP中解析

  • 如果X触发的每个触发器的所有依赖项都得到满足,则必须对其进行检查
您可以创建一个数据库表,以便在成功完成触发器后保存响应。最后,您可以检查是否满足所有依赖项

对于从触发器调用PHP函数,请参阅以下文章中针对不同类型解决方案的不同答案

每次数据库事务提交到数据库之前和之后,都会执行一个PHP代码段

不要重新发明轮子,这有一个难以置信的简单解决方案:在数据库调用之上有一个层

与其直接查询数据库,不如调用一个函数(可能在对象中)来处理触发器的数据库插入。就在这里,你可以用任何你喜欢的方式在触发器的前后处理中添加你的代码

function processDatabaseInsertion($trigger) {
    //Preceding code goes here

    //Database transaction goes here

    //Post-processing code goes here
}

$Trigger_123 = new stdClass();
$Trigger_123->name = "Name";
$Trigger_123->renderOn = $object_345->throwedInLakeX;

processDatabaseInsertion($Trigger_123);
过于简化,但你明白了。我建议您为触发器编写一个自定义类,但我是以过程的方式编写的,因为我不知道您是否熟悉OOP

每当一个对象附加了X个触发器时,就会执行一个PHP代码段,并解析它们

和以前一样的原则。如果您使用PHP>=5.3,则可以使用闭包使其更加有趣:

function processDatabaseInsertion($trigger) {
    //Preceding code goes here
    $trigger->renderOn();

    //Database transaction goes here

    //Post-processing code goes here
}

$Trigger_123 = new stdClass();
$Trigger_123->name = "Name";
$Trigger_123->renderOn = function() use ($Trigger_123) { doAwesomeThing($Trigger_123); }

processDatabaseInsertion($Trigger_123);
或者采用更传统的方法:

function processDatabaseInsertion($trigger) {
    //Preceding code goes here
    switch($trigger->renderOn) {
        case "awesomeThing":
            doAwesomeThing($trigger);
            break;
        case "anotherThing":
            break;
        default:
            break;
    }


    //Database transaction goes here

    //Post-processing code goes here
}

$Trigger_123 = new stdClass();
$Trigger_123->name = "Name";
$Trigger_123->renderOn = "awesomeThing";

processDatabaseInsertion($Trigger_123);
如果所有依赖项都是 它是满意的

可以很容易地通过上面的方法处理一些PHP逻辑,如您所知。例如,您可能希望在每次需要处理触发器时调用一个泛型函数,然后检查依赖项是否满足,如果满足,则运行特定的触发器


无论哪种方法,都有比使用eval或一些mysql触发器黑客更好的方法来解决这个问题,正如您所看到的:)

没有内置的方法来实现您所描述的。因此,您可能需要寻找一个库来支持您的需求或自己实施此类行为。我所有的实施尝试都失败了,我认为这是一个必须满足X依赖项的对象,X依赖项也必须满足其自身的依赖项,并且一直在进行,但我陷入了一个无休止的依赖项检查和对象行为解析中。它们直接与数据库交互,您需要“查看”此事件,并使用PHP对其进行处理?是吗?@user1188570是的,我想在MySQL中实现触发器来触发某些查询,并在PHP应用程序中实现触发器,例如带有触发器Y代码的X代码。是的,回答不错,我怀疑我需要使用PHP代码模板构建一个PHP代码编辑器,并使用eval执行,从触发器的响应创建数据库表的信息正是我想要检查触发器结果的信息,多亏了lotnice方法,您使用的PHP比MySQL多,这就提供了大量的功能,thanks@GeoPhoenix当前位置我对第二个问题给出了相同的意见。只有在这种情况下,我没有为您编写代码。@SomnathMuluk我想避免给出答案的用户之间的任何可能的冲突这看起来更可靠,只需要一小段代码,我没有要求,但用户提供了一些OOP代码的逻辑。虽然不是最终的,我将在赏金结束的日期附近选择最终答案。@GeoPhoenix我提供的逻辑不是OOP,但不难想象一个“主”触发器类在其自身的属性和方法中处理所有这些。@Mahn是的,我理解,我发现很难在数据库(存储)中跟踪触发器并解析获取的触发器。为此,我一遍又一遍地查询整个数据库,寻找触发器所需的依赖关系。