PHP-ORM (MySQL)



  • Warum PHP-ORM?

    Für kleine Projekte oder Scripte wie Highscore, Gästebuch, Adressverwaltung etc. sind Intefaces wie Doctrine und andere ähnlich umfangreiche ORM Interfaces vllt. zu überladen, in diesem Fall reicht auch ein leichtgewichtiges Interface wie PHP-ORM. Für komplexe Projekte ist dieses aber auch produktiv im Einsatz, z.B. in einem CMS.

    Für welches ORM man sich nun letzlich Enscheidet, liegt an den Anforderungen an das Ergebnis und ist auch ein wenig Geschmackssache. Da trotz des kleinen Befehlssatz die wichtigsten Funkionalitäten die das gezielte speichern und bearbeiten von persistenten Daten in ein MySQL DBMS ermöglichen über einen sehr einfachen Befehlssatz abgedeckt sind.

    Doctrine und Co. sind Komplex und haben einen großen Funktionsumfang.

    PHP-ORM ist leichtgewichtig, und mit wenigen Funktionsaufrufen sind die Verbindungen zu einem DBMS hergestellt, Tabellen und Datenbanken bereitgestellt als auch die Speicherung und Verarbeitung von Daten möglich.

    Beziehungen werde im Moment noch durch Referenzen auf den jeweiligen PRIMARY KEY abgebildet dafür wird der datentyp des PRIMARY KEY als Datentyp des Attributs genutzt, dies wird später noch Erweitert und wird dann automatisiert durch die Assoziation mit der jeweiligen Tabelle und deren PRIMARY KEY generiert. Dafür wird dann in der Klassendeklaration der Tabellen bzw. Klassenname angegeben.

    Einsatzgebiete für das Interface

    Php basierte Projekte in der die Speicherung der Daten in einem MySQL DBMS stattfinden soll.

    Php basierte Projekte die mit wenig Planungsaufwand schnell Umgesetzt werden sollen.

    Für Prototypen in der noch keine genaue Struktur der resultierenden Tabellen geplant werden kann.

    Zeitdruck, nicht absehbare Änderungen, Änderungswünsche durch einen Kunden oder
    zukünftig geplante Änderungen oder Erweiterungen deren Berücksichtigung zum
    Zeitpunkt der ersten Implementierung oder im Rahmen derer nicht benötigt werden.

    In Projekten wo andere ORM Interfaces zu überladen sind oder deren Einarbeitungszeit
    zu Zeitaufwendig ist, da schnell Ergebnisse erforderlich sind.

    Die Features im Überblick

    Einfaches Einbinden in ein Projekt

    Es muss lediglich das Verzeichnis „phporm“, in welchem sich die Includedateien und die Klassen der Schnittstelle befinden, dem Projekt beigefügt.
    Anschließend wird das Interface über eine Includedatei „phporm.php“ in das Projekt Includiert.

    Einfache Beschreibung von Tabellen als Klassen angelehnt an das OO Konzept von Php.

    Die Beschreibung der Tabellen bzw. Klassen wird über einen String realisiert. Es stehen drei Klassentypen gängiger OO Konzepte zur Verfügung.

    Standard-, Abstrakte- und Erweiterte Klassen gängiger OO Konzepte.

    Es werden die Klassentypen, Standard- , Abstract, und Extends abstrahiert.
    Diese stehen auch in der OO Implementierung seitens Php zur Verfügung.
    Womit dessen Funktionsweise bekannt ist und keiner Erneuten Einarbeitung bedarf.

    Einfaches modifizieren von Attributparametern. Beziehungen durch Klassenbeschreibung.

    Das setzen von Parametern wie Primary Key, Unique, Not Null, und weiteren erfolgt nicht aufwendig über einzelne Funktionen.
    Dies findet bei der Deklaration (Beschreibung) der Tabelle als Attributparameter statt.

    Änderungen der Attributparameter durch Modifikation der Klassenbeschreibung.

    Bei Änderungen des Datentyps oder anderer Attributparameter in der Beschreibung der Klasse, werden
    diese in jeweils abstrahierten Tabelle synchronisiert.
    Änderungen an den Namen der Felder Erzeugen Neue Felder!

    Einfaches löschen und hinzufügen von Attributen.

    Wird in der Klassendeklaration ein Parameter hinzugefügt oder weggelassen, wird
    dieser aus der Tabelle gelöscht oder dieser hinzugefügt.

    100 % OO Zugriff auf Datensätze, inkl. Automatisierter Datensynchronisation.

    Der Zugriff auf einzelne Datensätze erfolgt wie der Zugriff auf Objekte des Php OO Konzeptes.
    Änderungen an Attributwerten werden 1:1 in der Referenzierten Tabelle synchronisiert.

    (Dies wird in einer späteren Version Optional sein, so dass ein Schreiben der Objekte in die Datenbank nicht automatisiert sondern auch manuell stattfinden kann.)

    Datensätze nach bestimmten Kriterien aus der Datenbank lesen und als Objekte zur Verfügung stellen oder löschen.

    Durch die ORM Klassen werden Funktionen zur Verfügung gestellt um einzelne oder mehrere Datensätze als
    Objekte an das Script zu übergeben, oder zu löschen.

    Kurze Einarbeitungszeit da sehr einfache Verbindung und Kommunikation durch wenige Funktionen zu einem MySQL DBMS.

    Zugriff auf die Funktionalität wird durch 3 einfache Klassen und deren öffentlichen statischen Funktionen oder Methoden realisiert.
    Für das abstrahieren oder löschen von einzelnen oder mehreren Objekten nach bestimmten Kriterien Verbindung
    zum DBMS lediglich für das jeweilige Vorhaben ein Befehlsaufruf nötig.

    Wenige Include Dateien, kleine Größe.

    Kurze Ladezeiten, schneller Upload. Geringer Einarbeitungsaufwand

    Updates vorgesehen.

    So mal schnell ein kleines "Pseudo" Beispiel erstellt. Welches den minimalen Aufwand demonstrieren soll, der mit PHP-ORM einhergeht.

    Jeder der mal MySQL Statements benutzt hat, kann erahnen welchen Aufwand diese im folgenden Codeauschnitt mit sich bringen würden, genau wie wenn man Tabellen an sich geänderte Anforderungen Anpassen will, spart man mit PHP-ORM sehr viel Schreib- und Anpassungsarbeit und somit Zeit, was auch die Wartung von Programmcode erheblich vereinfacht.

    Downloadpage

    <?php
    
    require_once ("phporm/phporm.php");
    
      // ein DBC erstellen mit den verbindungsdaten zum DBMS
      $DBC = new DBC("127.0.0.1", "benutzer", "password");
    
      // 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 ('testDB');
    
      // 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
      $CDS = " stdID abstract{
        ID bigint ainc pkey;
      }";
    
      // abstrakte klasse wird nur im interface benötigt
      // eine referenzierung ist nicht nötig
      new ORMC ($CDS);
    
      // orm klasse 'user' beschreiben
      // spätere änderungen an den datentypen oder parametern
      // der attribute werden in die datenbank
      // geschrieben. attribute werden durch ihren namen
      // identifiziert eine änderung dessen zieht eine löschung
      // und/oder ein hinzufügen der betroffenen attribute nach sich.
      $CDS = " user extends stdID{
        firstname char(255);
        lastname  char(255);
        bday      date;
      }";
    
      // orm klasse 'user' registrieren
      $ormCUser = new ORMC ($CDS);
    
      // orm klasse 'groups' beschreiben (wird hier im beispiel nicht
      // benuzt, dient lediglich der darstellung)
      $CDS = " groups extends stdID{
        name char(255);
      }";
      // orm klasse 'member' registrieren
      $ormCGroup = new ORMC ($CDS);
    
      // orm klasse 'member' beschreiben (wird hier im beispiel nicht
      // benuzt, dient lediglich der Darstellung)
      //
      // fremdschlüssel und beziehungen werden noch automatisiert erstellt.
      // wenn eine klasse als datentyp angegeben wird, dies
      // wird in einem späteren update implementiert
      // welches dann lediglich änderungen an den CDS's nach sich
      // zieht wenn beziehungen in diesem sinn benötigt werden!
       $CDS = " member {     groupID bigint;
                              userID bigint;
      }";
    
      // orm klasse 'member' registrieren
      $ormCMember = new ORMC ($CDS);
    
      $newUser = $ormCUser->NewObject();
      $newUser->firstname ="Peter";
      $newUser->lastname  ="Lustig";
    
      $newUser = $ormCUser->NewObject();
      $newUser->firstname ="Hans";
      $newUser->lastname  ="Pusteblume";
    
      $userlist = array();
    
      // alle user aus der datenbank holen mit dem vornamen Hans
      $userliste = $ormCUser->GetObjects(array("firstname"=>"Hans"));
    
      // alle user in der datenbank löschen mit dem vornamen Hans
      $userliste = $ormCUser->DeleteObjects(array("firstname"=>"Hans"));
    
      // es können weitere kriterien bestimmt werden
      // wie begin und anzahl, und sortierung ab oder aufsteigend,
      // diese methoden stehen auch als methoden für den zugriff auf ein
      // einzelnes objekt zur verfügung und benötigen logischerweise
      // keine quantitätsmodifikatoren und sortierkriterien als parameter.
      //
      // das wars auch schon um den funktionsumfang anhand von ein wenig
      // source aufzuführen.
      //
      // damit steht zur einfachen speicherung, verarbeitung und ausgabe
      // von persistenten Daten die in einem MySQL datenbanksystem
      // vorliegen ein einfacher Befehlsatz und somit nützliches werkzeug
      // zu verfügung.
    
    ?>
    
    <?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>";
      }
    ?>
    

    Downloadpage

    [edit]

    Neben dem Scenario des Abschlussprojektes, sollte das interfas als kleines leichtgewichtiges schnell zu erlernendes MySQL ORM Interface für Php gesehen werden. Welches weder den Funktionsumfang noch die Komplexität wie Doctrine und Konsorten mit sich bringt, dadurch aber schnell und mit wenigen Aufwand zu Ergebnissen führt wenn es um Php, persistente Daten, und MySQL geht!

    [/edit]

    EDIT: - unrelevante teile gelöscht! -

    Viel Spass damit und Danke für euer Interesse!

    mfg. Patrick



  • Es ist PHP also ist es Open Source, oder wie willst du den Source verstecken?

    Mei, was soll ich sagen. Die Doku ist sehr hölzern geschrieben und strotzt vor Fehlern. Das Framework macht aus meiner Sicht wenig Sinn. Zum einen ist es sehr schlecht, wenn ein ORM Framework nur ein DBMS unterstützt. Zum anderen schaut es irgendwie umständlich aus und kann nichts. Warum sollte man Klassen in einem String beschreiben? Was ist mit Beziehungen zwischen Objekten? Ich habe nichts dergleichen in der Doku gefunden. Ohne ist es ja eigentlich völlig wertlos. Dann noch solche Sachen wie Caching, Lazy Loading etc... Also, kann man aus meiner Sicht komplett vergessen, erst recht wo es etliche wesentlich besser Frameworks gibt.



  • Es ist ein FI/AE Abschlussprojekt und keine Diplomarbeit!

    Also mein Kentnisstand das nur weil der Source offen liegt dieser auch gleich einer Open Source Lizenz unterliegen muss oder sollte ist da anders, gut ich kann mich da auch täuschen.

    Ansonsten werde ich deine Kritikpunkte was die Doku angeht berücksichtigen, wie gesagt da sind noch einige Fehler drinne, ich habe vorhin selber noch ein Paar gefunden.

    Beziehungen in Form von Foreign Keys kann ich erst im nächsten update Berücksichtigen und waren nicht Bestandteil des geplanten Projektumfanges.

    Diese sind aber im Handumdrehen Implementiert, die Klasse im String beschreiben hmmm, mir viel auf die schnelle keine andere Lösung ein, nach Klassen zur Laufzeit generieren habe ich mich noch nicht informiert, und die Lösung als solche klappt ganz gut!

    Ohne Beziehungen zwischen Objekten, wenn du meinst das man Beziehungen nur anhand von Foreign keys abstrahieren kann, dann wird das wohl nicht gehen.

    Allerdings kann man da auch einfach den PRIMARY key als Datentyp für die in Beziehung stehende Relation nutzen, was später durch einfaches ändern des Datentypes in den Klassennamen Intern als Foreign key der in Beziehung stehenden Relation umgesetzt wird. Es ist nur im Umfang der 70h inkl. Doku nicht realisierbar!

    Auch andere DBMS zu supporten ist in 70h nicht realisierbar!

    Wenn das Konzept als solches Scheisse is OK. sehe ich ein, aber Kritisiere nicht Punkte die im Umfang dessen was hier zu Bewerten gilt einfach nicht Umzusetzen waren 😉 !

    (so sicher hier Fehler, bin schon echt müde!)



  • Patrick_C64 schrieb:

    Auch andere DBMS zu supporten ist in 70h nicht realisierbar

    Darum gings mir eigentlich gar nicht. Natürlich kann man in 70h, genauso wenig wie in einem halben Jahr, ein beliebig komplexes Projekt perfekt auf die Beine stellen. Da muss man sich halt ein realistischeres Projekt aussuchen. Du sagst, du hast ein ORM Framework geschrieben und ich bewerte es als solches. Und als solches finde ich es wie gesagt völlig uninteressant und kann mir auch nicht vorstellen, dass es mal wesentlich besser wird. Es gibt schon gute, ausgereifte Frameworks, da muss man das Rad nicht neu erfinden und etwas fast völlig unbrauchbares bauen.

    Ihr habt nur 70h? Das ist ja gar nichts... Ich wusste nicht, dass man für die Abschlussarbeit an Berufsschulen so wenig Zeit hat. Ich habe an meiner Diplomarbeit 9 Monate Vollzeit gearbeitet. Hab dabei natürlich auch was verdient, da ichs bei einer Firma gemacht habe, aber den Unterschied finde ich schon krass.



  • Dafür dass du eine Diplom haben willst liest du echt ganz schön ungenau! Hier steht nichts von All-Round ORM Framework.

    Es steht doch im Topic, es ist ein Php-ORM (MySQL)!

    Naja wenn du denkst du bist besser wegen deinem Dipl. und du meinst ich bin Aufgrund einer Abschlussprüfung zum Fachinformaitker noch ein Teenager der einer Ausbildung im Dualem System nach geht, dann verstehe ich dein "brummiges" weil nicht wirklich Produktives, und im 2. Post schon fast profilierendes Verhalten, glaub mir so viel Lebenserfahrung habe ich, meine kleine 5 Jährige Tochter reagiert manchmal ähnlich 🤡.

    Und auf Grund meiner grottenschlechten Rechtschreibung die sich durch korekturlesen und Rechtschreibprüfung korrigieren lässt bei wichtigen Dingen wie eine Doku, bin ich auch kein Teenager oder Dir anderweitig geistig unterlegen.

    Also entweder Produktiv oder lass es! Danke!

    Zudem das ganze habe ich bisher in unter unter 70h geplant und implementiert sowie die Dokus!! (musste auch eine Projektdoku schreiben die Tut hier aber nichts bei!)

    Ich kann ohne zu Prollen und Träumen behaupten das ich wohl ein sehr gutes und Produktives Interface auch für ein Paar mehr DBMS in unter 3 Monaten draus machen kann!

    Aber meine Zwecke und dem des Abschlussprojektes genügt es!

    Es waren auch keine Vorschläge wie, hmm das würde es brauchen um es gut zu mache oder so, im großen und ganzen kahm nur, ähh is scheisse, taugt nicht und und und! Achso und das du n Dipl. hast das kahm auch noch.

    mfg. Patrick

    Also wenn jemand wirklich noch was konstruktives beizutragen hat Danke, aber so sachen wie Profilieren und mir zu erzählen das andere Sachen So viel mehr können und so viel besser sind könnt Ihr bitte stecken lassen! Danke.

    Das macht mich nicht sauer absolut nicht, aber dafür habe ich im Moment einfach keine Zeit!



  • Ich habe es nicht nötig, mich vor dir zu profilieren, also lassen wir das Thema.

    Was soll ich denn konstruktives zu deiner Arbeit sagen? Willst du gelobt werden? Willst du hören, dass es genial war, was du in unter 70h geschafft hast? Es mag durchaus gut sein für 70h, keine Ahnung, aber als Produkt finde ich das in der jetzigen Form völlig unbrauchbar. Ich seh auch nicht, wie sich das großartig weiterentwicklen könnte. Und ich bin generell kein Fan davon, alles selber zu machen, was es schon gibt. Oder es muss zumindest einen guten Grund geben, warum man das macht. Entwirf doch ein komplettes ORM System (ohne es zu implementieren) und zeig warum es besser ist (oder für eine konkrete Aufgabe besser geeignet), als die vorhandenen. Aber einfach irgendwas anzufangen, was keiner braucht, und was sich in 10 Jahren potenziell zu etwas entwickeln könnte, was man evtl. brauchen könnte, aber was es schon lang gibt, halte ich für völlig daneben. Und das kannst du durchaus als konstruktive Kritik betrachten.



  • Patrick_C64 schrieb:

    Ist zwar nicht OpenSource aber Freeware, also darf für kommerzielle und nicht kommerziele Projekte genutzt werden. Anpassungen, Erweiterungen und Modifikationen müssen aber durch den Author in einer offiziellen Version zu Verfügung gestellt werden. Können also an diesen gesendet werden.

    Du könntest dir mal die LGPL angucken. Die beinhaltet ziemlich genau das was du hier beschreibst.



  • Hi Tobiking2,

    danke für deine Konstruktive Kritik, ich denke werde mal schauen, aber ich Glaube die kommt in Frage.

    Aus den Vorangeganen Beiträgen habe ich mir mal ein Fazit gezogen, um wenigsten für mein Projekt und die Dokumentation konstruktiven nutzen zu haben, bis auf TobiKing2 wurde ja hier in den 3 anderen Posts lediglich ein Standpunkt vertreten, Konstruktive Kritik in diesem Sinne war da wenn überhaupt Gering vorhanden.

    Fazit

    - die Zielgruppe muss Erkennen welchen nutzen das Interface hat
    - die Einsatzgebiete müssen genauer aufgeführt werden
    - einige Samplecodes wären nicht schlecht

    Dies habe Ich Anhand des Pflichtenheftes einmal Aufgeführt. Das Resultat füge ich im Eröffnungspost ein.

    Ich muss hier auch mein Projekt nicht rechtfertigen und es muss HIER für niemanden einen Sinn machen (klar schön wärs, und Lob? warum nicht ich bin ein Mensch), es wurde durch die IHK genehmigt bei der Ich das Projekt in Form eines Projektantrages prüfen und genehmigen lassen musste, die IHK befand es zum Zwecke der Prüfung als genehmigungsfähig. Zudem ist es für den geplanten Einsatz sehr wohl Produktiv und Wirtschaftlich.

    Das Rad nicht neu zu Erfinden .... hmmm, den Drang zu verspüren und diesem auch mal nachzugehen sollte einem Programmierer im Blut liegen. Aber das ist eine Phylosophie über die man streiten kann.



  • bei mir kommt immer

    Das Archiv konnte nicht angelegt werden

    Archivtyp wird nicht unterstützt

    soll ich mir jetzt extra unrar installieren 😕



  • http://www.wobzip.org/file/XOjJP

    <span style="visibility: hidden"><a href="http://www.xteenporn.net/" title="deutsch porno">deutsch porno</a><span style="visibility: hidden">deutsch porno</span></a>

    <div style="display: none;">

    <a href="http://t0fan.blogspot.com" title="özgün blog">özgün blog</a>

    </div>

    was macht das da 😮 ist das bei euch auch oder hat das die seite einfach unverschämter weise angehängt 😕



  • Hi, also ich packe eigtl. immer mit Rar.

    Hätte auch spontan keine Idee was ich sonst anbieten sollte, gerade weil es sich in diesem Zusammenhang um ein kleines Packet handelt welches an Anwendungsprogrammierer als Zielgruppe gerichtet ist welche i.d.R. ein Programm auf dem Rechner haben welches das Rar Format entpacken kann. Dachte ich zumindest. 😃

    Ich kann dich nicht zwingen ein derartiges Programm zu Installieren, aber wenn du dich für das Interface interessierst und Dir es vllt. auch nützlich sein kann sollte dies ein geringes Übel darstellen.



  • zip ist relativ universell... und soo groß wird der kompressionsunterschied ja nicht sein 😉



  • http://www.wobzip.org/file/XOjJP

    Zitat:
    <span style="visibility: hidden"><a href="http://www.xteenporn.net/" title="deutsch porno">deutsch porno</a><span style="visibility: hidden">deutsch porno</span></a>

    <div style="display: none;">

    <a href="http://t0fan.blogspot.com" title="özgün blog">özgün blog</a>

    </div>
    was macht das da 😮 ist das bei euch auch oder hat das die seite einfach unverschämter weise angehängt 😕

    *PAAANIIKKKKK

    Ich dachte im ersten Moment du meintest das kahm von meiner Seite *Schweiss abwisch 🙂

    Denn mein CMS habe ich KOMPLETT in der letzten Woche geschrieben um mein Interface ausserhalb des Abschlussprojektes einzusetzen, und somit auch ein wenig die Fehlerfreiheit zu Prüfen die mir aufgrund der Gesamtsituation in dem Umfang (also im Produktivem Einstaz, Unittest waren natürclich Verbindlich!! )innerhalb der Realisierung des Projektes nicht möglich war/ist.

    Und bei meinem ersten CMS hatte ich XSS Attacken 🙂 aber naja, aus Fehlern und Räder neu Erfinden lernt man halt 🤡 .



  • was mir total abgeht und umbedingt geändert werden muss, falls ich es nicht übersehen hab, ist das escapen der parameter also z.b. hier und fast an jeder stelle, wo du einen sql string bastelst, wo die werte vom user kommen

    DBC.php zeile: 479

    $value="'".$value."'";
    
            if($count) $arg_set .=", ";
    
            $count++;
    
            $arg_set .= "`".$key."`=".$value;
    


  • umbedingt -> unbedingt 🙄



  • Ich dachte es sollte in der Verantwortung des Anwendungsprogrammiers bzw. der Schicht die darüber liegt liegen. Falls du in dem Zusammenhang das Prüfen und ersetzen auf gefährliche Zeichenfolgen meinst.

    Wenn ich dich falsch verstanden habe korrigiere mich bzw. werde noch mal genauer.

    EDIT:

    Achso es wird gepfrüft ob es ein Numerischer Wert ist, ist es eine Zeichenfolge (also ein String) wird dieser in Hochkommas gesetzt damit selbst "gefährliche" Eingaben bzw. Daten als solche und nicht als Statement Interpretiert werden.

    mfg. Patrick

    (Edit: schnelle Kommunikation m.E. erfordert nicht das vorhandensein einer 100% korrekten Rechtschreibung (im schreibfluss enstehen fehler, eine korrektur ist zeitwaufwendig!), wesentlich ist das man Fähig ist das Wesentliche zu verstehen bzw. rauszufiltern. Musst also so unswesentliche Fehlerchen hier nicht Verbessern, in einer Fach und Dipl. Arbeit sieht das natürlich anders aus das ist mir durchaus Bewusst 😉 )



  • Patrick_C64 schrieb:

    Kann ich machen. Allerdings dachte ich es sollte in der Verantwortung des Anwendungsprogrammiers bzw. der Schicht die darüber liegt liegen. Falls du in dem Zusammenhang das Prüfen und ersetzen auf gefährliche Zeichenfolgen meinst.

    würd es gleich in die dbc klasse einbauen... wenn ich mich richtig erinnere, ist die funktion auch sehr speziell bzw. benötigt eine mysql verbindungs-kennung und dann muss das in die dbc klasse. und den benutzer der 'library' escapen lassen ist keine gute idee, dafür baut man sich doch eine abstraktionsklasse, damit man solche fehler ausschließt 😕



  • Also so wie Ich dich verstanden habe, ist eigtl. alles im Lot was du angesprochen hast ist gegeben!

    Da nur numerische Werte "unescaped" in den Query gelangen ;)! Die Prüfung erfolgt auf unterster Ebene im DBC, welches bis auf Constructor, Connect so wie DatabaseSet und Get im Umfang meines Projektes unrelevant sind, und für sich als eigenständiges Interface betrachtet werden kann. Es stellt lediglich der ORMC und ORMO Klasse Funktionen zur direkten unkomplizierten Kommunikation mit dem DBMS zur Verfügung.

    Habe auch schon über mein CMS viel probiert um SQL injection zu provozieren, ohne Erfolg. Also m.E. alles gut, wenn es jemand besser weiss ich lasse mich gerne belehren, das dient ja auch der Sache!

    mfg. Patrick



  • http://php.net/manual/de/function.mysql-real-escape-string.php des muss einfach iwo rein... ich finds in keiner datei 😞



  • Du verunsicherst mich 🙂

    Deswegen habe ich es mal direkt geteset!

    Das Beispiel auf der 1. Seite ist 1:1 Lauffähig wenn die Verbindung zu einem DBMS gegeben ist!

    Ich habe mal folgene Zeilen beim erstellen einer Person benutzt, also den Namen mit potentiell gefährlichem gefühlt, denke ich zumindeset.

    Alles sauber, keine Probleme!, Anscheinend doch einen der Wege genommen die nach Rom führen 😃

    $newUser = $ormCUser->NewObject();
      $newUser->firstname ="Peter %s \x00 ' SELECT * FROM; \n \r ";
      $newUser->lastname  ="Lustig";
    

    Wenn du es schaffst über das Setzen eines Attributwertes eine SQL Injection auszulösen dann werde ich deinen Ratschlag nochmal berücksichtigen.

    Ansonsten sehe ich da erstmal keinen Handlungsbedarf, Bedanke mich aber für deinen Konstruktiven Vorschlag und Beitrag, auch wenn mir dieser momentan nicht relevant erscheint!

    mfg. Patrick



  • 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.


Anmelden zum Antworten