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 によってトリガーされる各トリガーは、それに対するすべての依存関係が満たされているかどうかをチェックします

質問: このようなものを PHP で構築することは可能ですか? それとも、Python などの他のスクリプト言語を試す必要がありますか?

4

2 に答える 2

2

結果として私が欲しいのは、PHPコードスニペットを毎回実行させることです

  • データベースに送信される前とデータベースに送信された後のデータベーストランザクション

トリガーでPHP関数を呼び出す必要があります。呼び出す必要のあるすべてのロジックをPHPで記述します。

  • Xトリガーがアタッチされているオブジェクトは、それらを解決します

Xトリガーがアタッチされているオブジェクトは、PHPコードに変換するか、PHPで解決します。

  • Xによってトリガーされる各トリガーは、それに対するすべての依存関係が満たされているかどうかがチェックされます。

トリガーが正常に完了した後、応答を保存するための1つのデータベーステーブルを作成できます。そして最後に、すべての依存関係が満たされているかどうかを確認できます。

トリガーから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 によってトリガーされる各トリガーは、それに対するすべての依存関係が満たされているかどうかをチェックします

上記の方法で簡単に処理でき、PHP ロジックがいくつか追加されていることがわかります。たとえば、トリガーを処理する必要があるたびに呼び出されるジェネリック関数が必要な場合があります。これにより、依存関係が満たされているかどうかがチェックされ、満たされている場合は特定のトリガーが実行されます。

いずれにせよ、ご覧のとおり、 eval またはいくつかの mysql トリガー ハッキングを使用するよりも、この問題に取り組むためのより良い方法があります:)

于 2012-07-25T02:17:38.907 に答える