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

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP – 链接触发器如何创建/存储?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在与一个团队合作开展一个关于小说世界建设的小项目.我被分配了管理实体(岩石/地方/物品)的触发器/链式行为的任务,这些行为可以通过多种方式触发,例如将魔法岩石扔进湖中并且怪物X将出现,并继续触发事物在链条中直到它到达终点.

我试过这个

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

怎样才能将它存储在MysqL中?我可以检查一下它的链条部分吗?我也试过MysqL触发器,但我找不到在这些触发器上执行PHP方法.例如,在更新或删除时运行PHP代码.

Cron的工作不是一个选择,因为将来会添加很多东西,而cron的工作将花费大量的时间来完成,我希望找到一个更基于PHP解决方案.

编辑(添加一些额外信息)

我试图以多种方式实现这一点.我最终得到了一个dePEndecies系统,就像Debian软件包一样,我相信它不适合这个.

@L_360_17@结构

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这样的其他脚本语言吗?

解决方法

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

不是直接查询数据库,而是调用处理数据库插入触发器的函数(可能在对象中).正是在那里,您可以添加您的代码,以您喜欢的方式预先处理和后处理您的触发器.

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.

原理与以前相同.如果你使用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触发器黑客,你可以看到:)

脚本宝典总结

以上是脚本宝典为你收集整理的PHP – 链接触发器如何创建/存储?全部内容,希望文章能够帮你解决PHP – 链接触发器如何创建/存储?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。