4

我一直在与一个小团队合作一个关于虚构世界建设的小项目。我被分配了管理实体(岩石/地点/物品)的触发器/连锁行为的任务,这些实体可以通过多种方式触发,例如向湖中扔一块魔法石,怪物 X 会出现,并继续触发这些东西在链中,直到它到达终点。

我试过这个

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

如何将其存储在 MySQL 中?我可以检查它是否是链条部件吗?我也尝试了 MySQL 触发器,但我找不到在这些触发器上执行 PHP 的方法。例如,在更新或删除时运行 PHP 代码。

Cron 作业不是一个选项,因为将来会添加很多东西,而且 cron 作业需要很长时间才能完成,我希望找到一个更基于 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 触发的每个 Trigger 是否满足其所有依赖项

问题: 这样的东西甚至可以用 PHP 构建还是我应该尝试其他脚本语言,如 python?

4

2 回答 2

2

结果我想要的是每次都执行一个PHP代码片段

  • 一个数据库事务,在提交之前和之后提交到​​数据库

您应该在触发器中调用 PHP 函数。在 PHP 中编写所有需要调用的逻辑。

  • 附有 X 触发器的对象,解决它们

附加了 X 触发器的对象,而不是将其转换为 PHP 代码或在 PHP 中解析它。

  • 检查由 X 触发的每个 Trigger 是否满足其所有依赖项

成功完成触发器后,您可以创建一个数据库表来保存响应。最后,您可以检查是否满足所有依赖项。

对于从触发器调用 PHP 函数,不同类型的解决方案请参见以下帖子的不同答案。

从 MySQL 触发器调用 PHP 脚本

于 2012-07-23T19:09:42.547 回答
1

每次数据库事务,提交之前和提交到数据库之后,都会执行一个 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);

检查由 X 触发的每个 Trigger 是否满足其所有依赖项

如您所知,可以通过上面的方法使用更多的 PHP 逻辑轻松处理。例如,您可能希望在每次需要处理触发器时调用一个通用函数,该函数依次检查依赖关系是否得到满足,如果满足则运行特定触发器。

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

于 2012-07-25T02:17:38.907 回答