1.1k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,

ich möchte mit Hilfe von PHP/HTML/MySQL einen Regelassistenten schreiben. Ich ziehe hierzu die Verwendung einer Klasse in Betracht, da ich von vielen Stellen in meinem Programm darauf zugreifen möchte bzw diese Regeln abrufen möchte.

Ich hänge jetzt bei der Speicherung bzw Abbildung dieser Regeln.

Nehmen wir mal als Beispiel folgende Datenfelder eines Kunden an:
- PLZ
- Geburtsdatum
- Bestätigt ja/nein (soll nen bool-datentyp sein)

Nun möchte ich z.b. Regeln speichern in der Form:
PLZ >= 58000 UND Geburtsdatum > 01.01.1900
oder auch
PLZ > 58000 UND PLZ < 60000 UND Bestätigt = ja

Wie mache ich sowas am sinnvollsten?
Evtl. in einem Array? Welche Struktur wäre hier am sinnvollsten?
Es geht mir jetzt nicht um das Speichern in der DB, sondern nur um die Darstellung innerhalb von PHP.

Wäre super wenn ihr mir hier ma so kleinen Denkanstoss geben könntet.

Gruß

3 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Wie wärs denn mit PHP-Code selbst?

<?php

class Kunde {
public $iPlz= 0 // PLZ als Zahl (Vorsicht bei nichtdeutschen Kunden)
, $iGeburtstag= 0 // Auch als Zahl im Format "yyyymmdd"
, $bBestaetigt= FALSE; // Im Format BOOL
}

class RegelAssi {
// Die Regeln sind ganz einfach wie PHP-Code selbst. Geschrieben werden sollten
// sie ausschließlich als Ausdruck, der insgesamt BOOL ist.
private static $aRegel= array
( 'eins'=> '(int)$oKunde-> iPlz> 58000&& (int)$oKunde-> iGeburtstag>= 19000101'
, 'zwei'=> '(int)$oKunde-> iPlz> 58000&& (int)$oKunde-> iPlz< 60000&& $oKunde-> bBestaetigt'
);

// Eine der Regeln auf einen Kunden durchführen.
public static function pruefen( $oKunde, $sRegel ) {
// Existiert die Regel nicht, wird FALSE zurückgegeben.
if( !isset( self:: $aRegel[$sRegel] ) ) return FALSE;

// Zu evaluierender Code muss eine komplette Anweisung sein, daher RETURN und Semikolon
return eval( 'return '. self:: $aRegel[$sRegel]. ';' );
}
}

// Testkunde mit Testdaten ($bBestaetigt bleibt FALSE)
$oIch= new Kunde();
$oIch-> iPlz= 59000;
$oIch-> iGeburtstag= 19700401;

// Beide Regeln unabhängig voneinander ausführen
print( 'test eins: '. ( RegelAssi:: pruefen( $oIch, 'eins' )? 'wahr': 'falsch' ). '<br/>
test zwei: '. ( RegelAssi:: pruefen( $oIch, 'zwei' )? 'wahr': 'falsch' ) );

?>
0 Punkte
Beantwortet von
Hallo,

danke erstmal für den Tipp.
Das ist schon mal eine interessante Idee, allerdings seh ich hier das Problem, wie ich die Regeln bearbeitbar machen soll. Ich möchte die ja in einer Datenbank speichern und anschließend wieder ändern können.
Ist es nicht zu kompliziert, den String nachher wieder auseinander zu bauen?

Gruß
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Es geht mir jetzt nicht um das Speichern in der DB
Selbst wenn dir das jetzt doch wieder sehr wichtig ist - was ist das Problem das folgende als Text in einer Datenbanktabelle zu speichern und je nach Bedarf anzupassen? Ob die Regeln nun aus der Datenbank gelesen werden oder schon vorgefertigt in der Klassendefinition vorliegen ist doch egal:
(int)$oKunde-> iPlz> 58000&& (int)$oKunde-> iGeburtstag>= 19000101
...