PHP-ORM (MySQL)



  • liegt evtl. an value=htmlspecialchars(value=htmlspecialchars(value,ENT_QUOTES); in ORMO.php z. 65 aber wie gesagt, sauber ist das nicht und imho auch nicht in der richtigen klasse. das ist aufgabe der dbc!

    htmlspecialchars schrieb:

    "'" (einfaches Anführungszeichen) wird nur zu ''', wenn ENT_QUOTES gesetzt ist.

    damit schreibst du u.a. "'" statt "'" in deine db und damit völlig falsche werte.



  • ['] statt ['] 🙄



  • Gut vernünftig begründet und mit den Sachen aufgeführt die ich so nicht gesehen habe macht das NUN natürlich Sinn ;)!

    Nun gut ich werde es berücksichtigen *grins!

    Danke für deine Bemühung (und konstruktive hartnäckigkeit!)!

    mfg. Patrick

    [EDIT:

    DONE!, werde ich ggf. heute noch mit einer bearbeiteten Doku (noch nicht Fehlerfrei!) hochladen. nochmal Danköö!

    /EDIT]


  • Mod

    Patrick_C64 schrieb:

    DONE!, werde ich ggf. heute noch mit einer bearbeiteten Doku (noch nicht Fehlerfrei!) hochladen. nochmal Danköö!

    Ein paar mehr Samples wären cool.
    Wie sieht es zB aus wenn die Tabellen schon bestehen? Muss ich trotzdem jedesmal den Klassen-Code angeben?
    Wie sieht es mit referenzen aus, wenn zB zu User noch die Tabelle Gruppe gibt nd daraus eine n:m Beziehung wird?

    eine kleine Demo App wäre für sowas richtig cool...

    doctrine ist aktuell der Standard was ORM in PHP betrifft:
    http://www.doctrine-project.org/projects/orm.html
    Das ist sicher einen Blick Wert. Das löst viele Probleme relativ elegant.



  • Hi Shade of Mine,

    Danke fürs Feedback und die Tipps, ich möchte unbefangen bleiben deswegen schau ich mir Doctrine nicht genauer an. Kenne dies aber.

    Nichts gegen Doctrine oder andere, aber ich möchte soweit eigene Wege gehen und frei von äußeren Einflüssen bleiben, Anregegungen und Wünschen stehe ich natürlich aufgeschlossen gegenüber!

    Sonst könnte ich ja auch Doctrine nehmen wenn ich etwas ähnliches wollte.

    Als Metapha! (ich habe weder Auto noch Führerschein, aber als gute Schilderung finde ich folgendes ganz gut)

    Wäre dann als wenn man 2 Autos hätte in unterschiedlicher Farbe, aber eigtl. möchte man zwei grundsätzlich unterschiedliche Autos, alle beide können Fahren, aber jedes für sich hat seine eigenen Vorzüge oder Nachteile in jeweiligen Situationen.

    Nun kann man über diese Ansicht diskutiren aber das ist nicht Thema dieses Threads!

    B2T, habe mich beigemacht und mal ein weiteres Beispiel zusammengebaut.

    Deine Frage ob die Klasse immer beschrieben werden muss, lautet im Moment Ja, bin aber dabei Inspiriert durch deine Frage dies zu ändern, so das man anstatt einen CDS den Tabellennamen angibt und den Parameter ReadOnly auf true setzt im Constructor der ORMC Klasse.

    Beziehungen können ohne weiteres Realisiert werden, werden aber seitens des ORM nocht nicht als Fremdschlüssel behandelt, dies wird aber auch noch implementiert, war aber nicht im Umfang des Abschlussprojektes. (sitze aber schon dranne 😉 !!!)

    Glaube Beziehungen über Schlüsselfelder dienen auch nur dem DB Design und der internen optimierungen im DBMS selber, also unerlässlich für eine funktionierende Datenstruktur sind diese nicht wirklich, dennoch möchte ich diese dem Standard enstrechend unterstützen.

    <?php
    
      /* Kleines Gästebuch PHP-ORM Sample
       * -------------------------------------------------------------
       *
       *  - der erste erstellte benutzer kann alle beiträge löschen
       * - es kann als gast oder benutzer ein Eintrag verfasst werden
       * - ein gast kann sich registrieren
       * - will man einen beitrag als benutzer senden muss name und
       *   passwort angegeben werden
       * - wird kein name angegeben ist der beittag ein gastbeitrag
      */
    
      // phporm inkludieren
      require_once ("phporm/phporm.php");
    
      // databaseconnector erstellen für die verbindung zum
      // datenbankserver
      $DBC = new DBC ("localhost","USER","PASSWORT");
    
      // databaseconnector verbinden
      if(!$DBC->Connect()) {
       echo ("Database Connection Error");
       exit;
      }
    
      // datenbank festlegen
      $DBC->DatabaseSet ("orm_testdb");
      // tabellenprefix festlegen
      $DBC->PrefixSet("guestbook_");
    
      // OMRC den databaseconnector $DBC übergeben
      ORMC::SetDBC($DBC);
    
      // abstrakte klasse für eine standard identifikation
      // beschreiben, attribut ID mit datentyp
      // bigint uhd primary key sowie autoincrement setzen
      $CDS = " stdID abstract{ID bigint ainc pkey;}";
    
      // $CDS für orm klasse stdID an den ORMC constructor übergeben
      // referenze wird nicht benötigt da für abstrakte klassen
      // keine tabelle angelegt wird
      new ORMC($CDS);
    
      // orm klasse benutzer beschreiben
      // durch die abstrakte klasse stdID erweitern, so das ein
      // primary key mit der eigenschaft autoincrement
      // des datentyps bigint zur verfügung steht
      $CDS = " benutzer extends stdID { name char(255);
                                       pass char(255);
                                     }";
    
      // die orm klasse benutzer wird aus dem beschriebenen
      // $CDS generiert und als instanz $CBenutzer der Klasse ORMC zurückgegeben
      $CBenutzer = new ORMC ($CDS);
    
      // orm klasse eintrag beschreiben
      // durch die abstrakte klasse stdID erweitern, so das ein
      // primary key mit der eigenschaft autoincrement
      // des datentyps bigint zur verfügung steht
      // für die Beziehung
      // benutzer : eintrag benutzer (1:n) wird über das
      // feld benutzer realisiert, in einem späterem update
      // kann der datantyp weggelassen werden oder der name
      // der assozierten tabelle bzw. klasse angegeben werden
      $CDS = " eintrag extends stdID { benutzer bigint;
                                      title char(255);
                                      text  char(1023);
                                      zeitstempel timestamp;
                                    }";
    
      // die orm klasse eintrag wird aus dem beschriebenen
      // $CDS generiert und als instanz $CEintrag der klasse ORMC zurückgegeben
      $CEintrag = new ORMC ($CDS);
    
      // das waren die vorbereitungen um die benötigten datenstrukuren zu beschreiben
    
      // html specifisch, eingabemaske zur interaktion
      // bedarf keiner weiteren kommentierung
      echo '<form action="" method="get">';
      echo '<input type="input" name="name"></input> Benutzer<br>';
      echo '<input type="password" name="pass"></input> Passwort<br>';
    
      echo '<br><input type="input" name="title"></input> Title<br>';
      echo '<textarea type="input" name="textbox" value="text"></textarea> Beitrag<br>';
    
      echo '<br><input type="submit" value="beitrag absenden" name="submit"></input>';
      echo '<input type="submit" value="registrieren" name="reg"></input> ';
      echo '<input type="submit" value="entferne alle" name="deleteall"></input> ';
      echo '<input type="submit" value="entferne eigene" name="deleteown"></input> ';
      echo '</form><hr>';
    
      // wenn etwas gesendet wurde, hier findet die verarbeitung statt
      if (isset ($_REQUEST)) {
    
      // $benutzer und $eintrag definieren.
      $benutzer = null;
      $eintrag  = null;
    
      // $name und $pass definieren.
      $name =  "";
      $pass =  "";
    
       // prüfe ob name und password angegeben wurden
       if (isset($_REQUEST['name'])  )
       if (trim ($_REQUEST['name'])  ) {
    
         // request in variable einlesen
         $name =  $_REQUEST['name'];
    
         // request in variable einlesen
         if (isset($_REQUEST['pass']))
         $pass =  $_REQUEST['pass'];
    
         // wenn registrieren angefordert wurde dann erstelle einen neuen
         // benutzer mit dem namen und dem Password, wenn dieser
         // noch nicht existiert
         if(isset($_REQUEST['reg']) && $name && $pass) {
    
           // prüfen ob ein benutzer mit dem namen $name bereits vorhanden
           // ist, wenn nicht wird dieser erstellt
           if(!$CBenutzer->ExistObject (array("name"=>$name))) {
    
           // neues object (datensatz) erstellen
           $benutzer = $CBenutzer -> NewObject ();
    
           // attribute werden gesetzt und automatisch in die datenbank
           // synchronisiert
           $benutzer->name = $name;
           $benutzer->pass = $pass;
    
            // status ausgaben
            echo "Benutzer '".$name."' Erfolgreich Registriert!<br>";
           }else
            echo "Benutzer Existiert bereits!<br>";
    
         }else // name wurde eingegeben aber keine registrierung angefordert
               // hole benutzer mit name = $name und pass $=pass aus der datenbank
               // ist dieser nicht vorhanden ist benutzer false!
               $benutzer = $CBenutzer -> GetObject (array ( "name" => $name, "pass" => $pass ));
        }
    
          // wenn in der textbox text eingegeben wurde dann
          // erstelle einen neuen beitrag
          if (isset($_REQUEST['submit']))
          if (trim($_REQUEST['textbox']))
          if ( ($name && $benutzer) || !$name ) {
    
            echo "Ihr neuer Eintrag <br>";
            // hier wird der neue Eintrag erstellt
            $eintrag       = $CEintrag->NewObject();
            // der text aus der textbox wird per set übergeben
            // und steht nun auch in der Datenbank
            $eintrag->text  = $_REQUEST['textbox'];
            $eintrag->title = $_REQUEST['title'];
    
            // setze die ID des benutzers auf das attribut benutzer
            // des objectes $eintrag, damit ist eine Beziehung
            // zwischen $CEintrag und $CBenutzer hergestellt
            if ($benutzer)$eintrag->benutzer = $benutzer->ID;
    
           }else // statusausgabe
           echo "Benutzer nicht vorhanden oder Passwort falsch!<br>";
    
        // prüfe ob löschen angefordert wurde
    
        // alle löschen, prüfe berechtigung anhand der benutzer'ID' = 1
        if (isset($_REQUEST['deleteall'])) {
             if ($benutzer && $benutzer->ID == 1 )
               $CEintrag->DeleteObjects();
               else
               echo "keine brechtigung!<br>";
        }
    
        // sollen eigene einträge gelöscht werden, prüfe den benutzer
        // ist dieser vorhanden lösche die einträge dessen
        // attribut "benutzer" identisch mit dem Attribut ID des
        // benuztzers identisch ist
        if (isset($_REQUEST['deleteown'])) {
             if ($benutzer)
               $CEintrag->DeleteObjects(array("benutzer"=>$benutzer->ID));
               else
               echo "keine brechtigung!<br>";
        }
      }
    
      // alle einträge in ein assoziatives array lesen
      // nach ID sortiert absteigend.
      $Liste = $CEintrag->GetObjects(null,array("ID"=>"DESC"));
    
      if($Liste)
      foreach ($Liste as $eintrag) {
    
        $name = "GAST";
    
        $benutzer = null;
        // prüfen ob der eintrag einem Benutzer angehört
        // und diesen aus der Datenbank lesen um den namen des benutzers
        // im eintrag anzeigen zu können.
        if($eintrag->benutzer)
        $benutzer = $CBenutzer->GetObject(array("ID"=>$eintrag->benutzer) );
    
        // wurde ein benutzer gefunden packe den namen in die variable $name))
        if($benutzer)
        $name=$benutzer->name;
    
        // ausgabe des beitrages
        echo "<u>".$eintrag->title."</u> von ".$name." am ".$eintrag->zeitstempel."<br>".$eintrag->text."</p>";
      }
    ?>
    

    So änderungen am PHP-ORM und an der Doku vorgenommen, alles neu hochgeladen!





  • triptop schrieb:

    schau dir doch mal http://www.php.net/manual/de/function.mysql-pconnect.php an 😉

    scheint als gibts damit probleme, bin auch nicht auf dem laufenden. naja, wie auch immer 😞



  • 😃



  • Patrick_C64 schrieb:

    ich möchte unbefangen bleiben deswegen schau ich mir Doctrine nicht genauer an. Kenne dies aber.

    Nichts gegen Doctrine oder andere, aber ich möchte soweit eigene Wege gehen und frei von äußeren Einflüssen bleiben

    Das ist die falsch Einstellung, da gibts gar nichts zu diskutieren. Die Basis jeder wissenschaftlichen Arbeit, eines Projekts oder irgendeiner ähnlich gelagerten Arbeit sollte immer der Vergleich mit bereits existierenden Lösungen bilden. Man muss bereits Vorhandenes genau untersuchen, untereinander vergleichen, dann erst die eigene Idee/Lösung vorstellen und zeigen, worin sie sich unterscheidet, oder warum sie für einen bestimmten Zweck besser ist.
    Ein ORM ist ja fast ein Paradebeispiel für sowas. Es gibt dutzende ORM Frameworks (nicht nur in PHP, du könntest auch andere Sprachen für den Vergleich hernehmen). Die unterscheiden sich auch durchaus ziemlich stark. Gerade da wäre es interessant zu zeigen, was andere können, wie man sie benutzt, und wie man das selber besser machen will.
    Ich finde sowas selbstverständlich und eines der grundlegendsten Sachverhalten, die man in der Ausbildung/Studium gelernt haben sollte.



  • Patrick_C64 schrieb:

    Nun kann man über diese Ansicht diskutieren aber das ist nicht Thema dieses Threads!



  • News !!

    Shade of mine schrieb:

    Wie sieht es zB aus wenn die Tabellen schon bestehen? Muss ich trotzdem jedesmal den Klassen-Code angeben?

    DONE ! 😉 Version 1.03b

    $MyORMC = new ORMC ("Tabellenname") <- So mehr ist für bestehende Tabellen nicht mehr nötig!

    Mechanics schrieb:

    Zum einen ist es sehr schlecht, wenn ein ORM Framework nur ein DBMS unterstützt

    Kein Thema, siehe den MySQLi DBC, ist zwar kein anderes DBMS aber ich brauch nur einen neuen DBC für das jeweilige DBMS schreiben, ist auch schon geplant, könntest das aber auch machen, anstatt hier nur zu nörgeln 😃 !

    Hmm So sonst ist erstmal nichts weiter, ich möchte mich nochmal ganz ganz Herzlich bei Shade of Mine und vor allem bei triptop Bedanken (bei triptop für seine echt positive Hartnäckigkeit, mit der er mir einen Denkfehler letzlich so dass ich Ihn auch erkennen konnte aufgezeigt hat!). Nochma dickes Danke an Euch beide!

    Würde mich wirklich freuen wenn jemand Interesse am Interface hat bzw. es dem ein oder anderem nützlich sein kann. Bugs werde ich soweit ich drauf hingewiesen werde unverzüglich Beheben.

    PHP-ORM, zum Download
    http://c64.feuerware.com/page/index.php?topics=cmd&cmd=select&id=11

    Über konstruktive Kritik, und Vorschläge würde ich mich auch sehr freuen!

    schönes Wochenende euch allen!

    mfg. Patrick


  • Mod

    Hallo.

    Wie kann ich folgendes machen:

    Ich habe eine Tabelle Bücher und eine Tabelle Autoren. Ein Autor hat N Bücher und ein Buch hat N Autoren.
    Ich würde gerne zu einem Buch alle Autoren und zu einem Autor alle Bücher listen können.

    Wie mache ich das mit phorm?

    Und wie kann ich die performance verbessern? Wenn ich ein Objekt habe, bei dem ich 10 Eigenschaften anpassen will zB ein Buch mit Titel, Subtitel, Synopsis, Kategorie, Bindung, Verlag, Sprache, Releasejahr, Wievielte Auflage,...

    Dann wird jedesmal ein TupleUpdate ausgeführt - ich würde das aber gerne in einem Rutsch machen können... Ein Query reicht ja.



  • News !

    Hallo Shade of Mine,

    zu 1. wollte ich Dir eigentlich flink Pseudocode schreiben, aber ich denke mal das läuft nicht weg deswegen schaue ich mal ob ich Montag/Dienstag ein "vernünftiges" über Pseudocode hinausgehendes Beispiel dazu erstellen kann! Gehen tut das ohne Frage, auch relativ simpel!

    Zu 2. ist schon vorgesehen (siehe ORMO __sycnmode__ / ORMC syncmode ) aber noch nicht voll implementiert war nicht vorgesehen im Abschlussprojekt, und bisher bestand für mich noch kein Bedarf, aber der Fall wurde bereits meinerseits berücksichtigt da er mir auch schon Eingefallen ist 😉 siehst du ja anhand der jeweiligen Attribute __syncmode__ in ORMO und syncmode in ORMC. Die weitere Implementierung als solches ist in 15 minuten gemacht, aber jetzt ist WE 😃

    Man kann dann für eine komplette Klasse/Tabelle und deren Objekte den Sycnmode festlegen oder direkt für ein speziefisches Object/Tupel.

    Natürlich kommt dann noch eine ORMO Methode hinzu ala Sync oder Update, und zum setzen des Syncmode der Klasse und eines Objektes. Objekte bekommen den Syncmode der Klasse, aber jedes Objekt kann einen seperaten Syncmode haben. Ob letzlich ein Object einen eigenen von der Klasse unabhängigen Syncmode benötigt mal schauen.

    mfg. Patrick



  • Hallo Shade of Mine,

    Danke für die inspirierenden Fragen 😉 ! So erneut ein Done! Hat aber was länger gedauert als 15 Minuten 😃 , noch viel verbessert und geändert. Ist alles 100% abwärtskompatibel!

    Beispiel 1.

    N:M Beziehung
    Abstract & Extended ORM Classes

    <?php
    
      // phporm inkludieren
      require_once ("phporm/phporm.php");
    
      OrmDBC("mysql");
      echo __PHPORM_VERSION__.'<br>';
      echo DBC::name;
    
      // ein DBC erstellen mit den verbindungsdaten zum DBMS
      $DBC = new DBC("127.0.0.1", "root", "pistazie");
    
      // zum DBMS verbinden oder script abrechen (eine fehlerausgabe
      // kann natürlich implementiert werden)
      If(!$DBC->Connect())
      exit();
    
      // datenbank bestimmen, wenn diese noch nicht
      // existiert wird diese erstellt
      $DBC->DatabaseSet ('books');
    
      // der klasse ORMC den erstellten DBC übergeben
      // als target für die zu erstellenden Klassen (bzw. Tabellen)
      ORMC::SetDBC ($DBC);
    
      // abstrakte orm klasse 'stdID' beschreiben
      // bücher und authoren bekommen
      // jeweils eine ID und einen namen
      $CDS = " stdID abstract{ ID bigint pkey ainc;
                               name char (254);
                             }";
    
      // abstrakte stdID klasse wird nur im interface benötigt
      // eine referenzierung ist nicht nötig
      new ORMC ($CDS);
    
      $CDS = " author extends stdID {}";
      // orm klasse 'autho' registrieren
      $orm_Author = new ORMC ($CDS);
    
      $CDS = " book extends stdID {}";
      // orm klasse 'book' registrieren
      $orm_Book   = new ORMC ($CDS);
    
      $CDS = " authors {book;
                        author;}";
      // orm klasse 'auhtors' registrieren
      $orm_Authors = new ORMC ($CDS);
    
      $books = $orm_Book->GetObjects();
    
      // Nur für den 1. Aufruf nötig
      // legt 3 Bücher und Authoren an
      if(!$books) {
    
      $author1 = $orm_Author->NewObject(array('name'=>'author nummer 1'));
      $author2 = $orm_Author->NewObject(array('name'=>'author nummer 2'));
      $author3 = $orm_Author->NewObject(array('name'=>'author nummer 3'));
    
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 1'));
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 2'));
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 3'));
    
      $orm_Authors->NewObject (array('book'=>1,'author'=>1));
      $orm_Authors->NewObject (array('book'=>1,'author'=>2));
      $orm_Authors->NewObject (array('book'=>1,'author'=>3));
      $orm_Authors->NewObject (array('book'=>2,'author'=>2));
      $orm_Authors->NewObject (array('book'=>2,'author'=>3));
      $orm_Authors->NewObject (array('book'=>3,'author'=>1));
    
      $books = $orm_Book->GetObjects();
      }
    
      if($books)
      // Bücher durchgehen
      foreach ($books as $book) {
        echo "<h1>Book: $book->name</h1>";
    
          // authoren des buches holen
          $authors = $orm_Authors->GetObjects(array("book"=>$book->id));
    
          if($authors) // authoren gefunden
          foreach ($authors as $link) { // eintrag als $link beschreiben
            // autor über $link->author holen
            $author = $orm_Author->GetObject( $link->author );
            if($author)
            echo "<h4>Author: $author->name</h4>";
          }
    
      }
    ?>
    

    Beispiel 2.

    Arbeiten mit vorhandenen Tabellen, da wo bestimmte Rechte zb. nur den Zugriff auf vorhandene Tabellen oder Datenbanken zulassen.

    <?php
      /*
       * Dieses Beispiel läuft nur mit
       * existierenden tabellen !
       *
       * */
    
      // phporm inkludieren
      require_once ("phporm/phporm.php");
    
      OrmDBC("mysql");
      echo __PHPORM_VERSION__.'<br>';
      echo DBC::name;
    
      // ein DBC erstellen mit den verbindungsdaten zum DBMS
      $DBC = new DBC("127.0.0.1", "root", "pistazie");
    
      // zum DBMS verbinden oder script abrechen (eine fehlerausgabe
      // kann natürlich implementiert werden)
      If(!$DBC->Connect())
      exit();
    
      // datenbank bestimmen, wenn diese noch nicht
      // existiert wird diese erstellt
      $DBC->DatabaseSet ('books');
    
      // der klasse ORMC den erstellten DBC übergeben
      // als target für die zu erstellenden Klassen (bzw. Tabellen)
      ORMC::SetDBC ($DBC);
    
      // orm klasse 'author' laden
      $orm_Author = new ORMC ("author");
    
      $CDS = "book";
      // orm klasse 'book' laden
      $orm_Book   = new ORMC ("book");
    
      // orm klasse 'authors' registrieren
      $orm_Authors = new ORMC ("authors");
    
      $books = $orm_Book->GetObjects();
    
      if($books)
      // Bücher durchgehen
      foreach ($books as $book) {
        echo "<h1>Book: $book->name</h1>";
    
          // authoren des buches holen
          $authors = $orm_Authors->GetObjects(array("book"=>$book->id));
    
          if($authors) // authoren gefunden
          foreach ($authors as $link) { // eintrag als $link beschreiben
            // autor über $link->author holen
            $author = $orm_Author->GetObject( $link->author );
            if($author)
            echo "<h4>Author: $author->name</h4>";
          }
    
      }
    ?>
    
    1.04b
    -----
    + MODIFY ORMO, ORMC
     .MODIFY syncmodes
     .ADD _AUTO_RECORD_
     .ADD _ACTIVE_RECORD_
     .DELETE old syncmodes
     .MODIFY CDS now you can use the name of a class
     .as identifier if it have a auto increment attribut
     .or one! primary key attribut
    
    + MODIFY ORMC
     .Modify GetObject()
     .now you can call GetObject with auto_increment
     .or primary key value
    
    + MODIFY ORMO
     .MODIFY __construct
     .REMOVE __attribut__
     .REMOVE __identifiers__
     .ADD __destruct()
     .ADD prepare()
     .ADD Sync()
     .ADD Save()
     .ADD Load() // !! temp !!
     .ADD    __keyattribut__ : array
     .ADD    __value__ 	 : array
    

  • Mod

    $authors = $orm_Authors->GetObjects(array("book"=>$book->id));
    

    Das ist aber nicht wirklich besser als das Query selber zu schreiben wenn ich eh alles haendisch machen muss. Das coole an ORM ist ja, dass es mir hilft.

    Ich sollte also

    $authors = $book->authors;
    

    oder etwas vergleichbares machen koennen. Sonst bringt mir das ORM ja nicht viel. Deshalb mag ich zB doctrine.

    Der Grund warum ich gefragt habe ist, weil das ganze naemlich ziemlich tricky ist:

    $book->authors[0]->books[0]->authors[0]->...
    

    sowas ist nicht trivial loesbar. Deshalb haette mich da dein Ansatz interessiert 🙂



  • moin,

    hmm sowas ist noch nicht implementiert, aber mal schaun vllt. schaffe ich das ja heute 😉 !

    Danke für die Idee!, na dann bis Done 😃 .

    mfg. Patrick,

    ??!! ...

    foreach ($books as $book) {
        echo "<h1>Book: $book->name</h1>";
    
          // authoren des buches holen
          $authors = $book->authors;
    
          if($authors) // authoren gefunden
          foreach ($authors as $author) { //
            echo "$author->name<br>";
    

    EDIT ............

    Läuft 😉 !! ähh meine DONE !!!

    100% Abwärtskompatibel !! 😃

    Ist zwar noch nicht ausgbiebig getestet aber das Beispiel unten läuft ohne
    Probleme.

    <?php
    
      // phporm inkludieren
      require_once ("phporm/phporm.php");
    
      OrmDBC("mysql");
      echo __PHPORM_VERSION__.'<br>';
      echo DBC::name;
    
      // ein DBC erstellen mit den verbindungsdaten zum DBMS
      $DBC = new DBC("127.0.0.1", "root", "pistazie");
    
      // zum DBMS verbinden oder script abrechen (eine fehlerausgabe
      // kann natürlich implementiert werden)
      If(!$DBC->Connect())
      exit();
    
      // datenbank bestimmen, wenn diese noch nicht
      // existiert wird diese erstellt
      $DBC->DatabaseSet ('books');
    
      // der klasse ORMC den erstellten DBC übergeben
      // als target für die zu erstellenden Klassen (bzw. Tabellen)
      ORMC::SetDBC ($DBC);
    
      // abstrakte orm klasse 'stdID' beschreiben
      // bücher und authoren bekommen
      // jeweils eine ID und einen namen
      $CDS = " stdID abstract{ ID bigint pkey ainc;
                               name char (254);
                             }";
    
      // abstrakte stdID klasse wird nur im interface benötigt
      // eine referenzierung ist nicht nötig
      new ORMC ($CDS);
    
      $CDS = " author extends stdID {}";
      // orm klasse 'autho' registrieren
      $orm_Author = new ORMC ($CDS);
    
      $CDS = " book extends stdID {}";
      // orm klasse 'book' registrieren
      $orm_Book   = new ORMC ($CDS);
    
      $CDS = " authors {book link author;
                        author link book;}";
      // orm klasse 'auhtors' registrieren
      $orm_Authors = new ORMC ($CDS);
    
      $books = $orm_Book->GetObjects();
    
      // Nur für den 1. Aufruf nötig
      // legt 3 Bücher und Authoren an
      if(!$books) {
    
      $author1 = $orm_Author->NewObject(array('name'=>'author nummer 1'));
      $author2 = $orm_Author->NewObject(array('name'=>'author nummer 2'));
      $author3 = $orm_Author->NewObject(array('name'=>'author nummer 3'));
    
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 1'));
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 2'));
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 3'));
    
      $orm_Authors->NewObject (array('book'=>1,'author'=>1));
      $orm_Authors->NewObject (array('book'=>1,'author'=>2));
      $orm_Authors->NewObject (array('book'=>1,'author'=>3));
      $orm_Authors->NewObject (array('book'=>2,'author'=>2));
      $orm_Authors->NewObject (array('book'=>2,'author'=>3));
      $orm_Authors->NewObject (array('book'=>3,'author'=>1));
    
      $books = $orm_Book->GetObjects();
      }
    
      if($books)
      // Bücher durchgehen
      foreach ($books as $book) {
        echo "<h1>Book: $book->name</h1>";
            // authoren des buches holen
          $authors = $book->author;
    
          if($authors) // authoren gefunden
          foreach ($authors as $author) { // eintrag als $link beschreiben
            echo "<h4>Author: $author->name</h4>";
    
              $abooks = $author->book;
    
                if($abooks) // bücher des Authors ausgeben
                foreach ($abooks as $abook) // eintrag als $link beschreiben
                  echo "<h4> ------ Abook: $abook->name</h4>";
    
          }
    
      }
    


  • also es läuft, siehe EDIT obiger Post!

    Um das beschreiben der Hilfstabelle kommt man aber nicht herum! Vllt. wird sich dass ja noch ändern, aber vorerst denke ich ist diese Lösung auch passabel!?

    Hmm was nun mal ganz wichtig wäre, wäre das Manual einmal überarbeiten 😞 , das is ja sonne Sache wo ich so richtig Lust drauf habe (!Ironie!).

    http://c64.feuerware.com/page/index.php?topics=cmd&cmd=select&id=11

    mfg. Patrick



  • Hatte heute Präsi und Fachgespräch !!

    Habe bestanden und bin somit nun

    Fachinformatiker für Anwendungsentwicklung !!!

    *MEGAFREU UND STOLZ


Anmelden zum Antworten