ilch Forum » Ilch CMS 2.X » Kritik und Verbesserungen » [FIXED] Datenbank Klasse

Geschlossen
  1. #1
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Hey Leute,

    wusste nun nicht um Kritik und Verbesserung oder Problem.

    also ich wollte gerade über die methode "where" von der Datenbank was filtern.

    Ist das richtig das ich da nicht den operator auswählen kann, bin immer gebunden an "=" ?

    Wer es denn nicht Sinvoll, sofern es noch nicht geht?


    Zuletzt modifiziert von Balthazar3k am 17.03.2014 - 20:27:08
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    corian Entwickler
    Registriert seit
    16.06.2011
    Beiträge
    1.096
    Beitragswertungen
    122 Beitragspunkte
    Ja das stimmt aber ich glaube Pion wollte das noch aubauen.
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    Aktuell bist du daran gebunden.

    Mal überlegen wie "granular" wir das noch aufbauen wollen. Wenn du nämlich so viele Einstellungen/Setter hast, ist das auch nicht mehr übersichtlich und du sparst dir nichts mehr gegenüber einem Query.

    Aktuell bitte einfach die Query Funktionen verwenden, wenn die aktuellen Select an ihre Limit kommen.
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Alles klar lächeln Danke für die Info.

    Gibt es bereits eine Blätter funktion/methode/class?


    Zuletzt modifiziert von Balthazar3k am 18.03.2014 - 09:08:26
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    corian Entwickler
    Registriert seit
    16.06.2011
    Beiträge
    1.096
    Beitragswertungen
    122 Beitragspunkte
    Nein aber kannst du gerne machen zunge
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Würde ich gerne machen, glaube aber das es meine Object Orientierten kenntnisse übersteigt. Ich werde mir das mal überlegen, wie ich sowas zusammen setzen könnte. Dann evt. mal ein ansatz wagen.

    Sollte das als Freistehendes Modul sein oder in das System mit Intigriert?


    Zuletzt modifiziert von Balthazar3k am 18.03.2014 - 11:58:04
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    Nein ein Modul ist das nicht.
    Das sollte in den Core übernommen werden.

    Kannst dir ja zb bestehende mal anschauen zb:
    framework.zend.com/manual/1.12/de/zend.paginator.html

    Letzlich brauch es eine neues Klasse, der man die aktuelle Seitennummer übergibt, wieviele pro Seite angezeigt werden sollen, DB Select Obj...

    Das ganz ist nicht ganz so einfach.


    Zuletzt modifiziert von Pion am 18.03.2014 - 18:49:10
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    ja ist nicht so einfach.

    Ich habe nicht soviel zeit zu Testen
    Wo würdet ihr die klasse plazieren

    ich würde sie entweder versuchen über die MySQL einbauen ($this->db()->pagerQuery()) oder im controller die classe dann übergeben ($this->pager()->getLimit();) wenn meine varianten überhaupt bis zum ende durchführbar sind


    Zuletzt modifiziert von Balthazar3k am 18.03.2014 - 22:58:33
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    Hänge sie mal an das db Objekt $this-db ()-getPager()


    Zuletzt modifiziert von Pion am 19.03.2014 - 08:15:06
    0 Mitglieder finden den Beitrag gut.
  10. #10
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Muss Passen, denke der ansatz passt nicht wirklich mit in das system. Vorallem denke ich nicht das er effektiv sein wird, wenn ich die SQL mit RegExp manipuliere um die daten die ich/man brauch, um damit die Seiten zu berechnen. So wie ich mir das dachte, github.com/Balthazar3k/Ilch-2.0/commit/e2f41e635906ad786a22654e6f6c3229a1ffa641

    Ich sollte mehr mit Objekten Arbeiten, daran harbert es noch ganz schön.

    der Paginator von Zend ist ja auch eine extreme nummer.
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  11. #11
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    oder vieleich so

    $pager = $this->db()->getPager('ep_events')->field('id')->viewEntries(20);
    $pager->getLimit(); #(return LIMIT 1,20)
    $pager->getNavigation(); #(return Links)


    github.com/Balthazar3k/Ilch-2.0/commit/a58c02a07948fa05651b2ddebb904b5df04d659d


    Zuletzt modifiziert von Balthazar3k am 20.03.2014 - 09:43:21
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  12. #12
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Wenn ich etwas dazu sagen darf, es wäre schon sinnvoll es wie bei Zend zu halten, dass die Pagination erstmal gar keine Abhängigkeit zur Datenbank hat.

    Im Grunde muss dem Paginator ja nur einige Werte übergeben werden: Anzahl Einträge insgesamt, Einträge pro Seite, aktuelle Seite, und wie der Link aussehen soll und ggf. ein(e) Template/View für das Rendering, wobei da wohl am besten eine Standardview bereitstehen sollte.

    Aus Datenbanksicht, muss du dann nur noch auslesen, wie viele Einträge es insgesamt gibt.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  13. #13
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Ja gut mehr mache ich jetzt nicht, finde meine Variante etwas zu umständlich.

    so funktioniert es zwar, gibt aber noch keine link ausgabe und ich muss das $request Object dem Mapper rüberwerfen.

    was anderes fällt mir noch nicht ein.

    der von Zend ist noch zu hoch für mich, mit verschiedene adapter

    public function getEventList(\Ilch\Request $request, $where = array())
        {
            $pager = $this->db()->getPager('ep_events')->field('id')->viewEntries(6);
    
            $limit = $pager->getLimit($request->getParam('page'));
    
            $entryArray = $this->db()->selectArray('*')
                ->from('ep_events')
                ->where($where)
                ->order(array('start' => 'ASC'))
                ->limit($limit)
                ->execute();


    eine idee habe ich noch
    wenn einfach das result von der db da reinwerfen, das er das array zählen kann und den rest erstellt er alleine. Aber keine ahnung ob es effektiv ist.


    Zuletzt modifiziert von Balthazar3k am 20.03.2014 - 12:37:59
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  14. #14
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Es ist auf jeden Fall nicht effektiv alle Einträge aus der Datenbank zu holen und sie dann zu zählen, wenn es die Funktionalität gibt, direkt zu zählen zwinker
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  15. #15
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Würde mich aber reizen, wo zählt man direkt über MySQL COUNT(), PHP count() oder mysql_num_rows, andere wege sind mir nicht bekannt.

    Macht doch auch sinn nur die Daten aus der Datenbank zu holen die man für eine Seite tatsächlich brauch, dazu fällt mir auser MySQL COUNT() nichts anderes ein. Ist zwar eine zweite abfrage aber die ist klein geahlten.

    hier von vlt.

    mysqli_result Object ( [current_field] => 0 [field_count] => 11 [lengths] => [num_rows] => 10 [type] => 0 )



    Zuletzt modifiziert von Balthazar3k am 20.03.2014 - 13:27:31
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  16. #16
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    Okay ja ich überleg mir demnächst da ein System. Umständlich wie bei Zend muss es für Ilch natürlich nicht werden. Der Pager den wir brauchen wird auch nur für die DB verwendet werden.

    Aber letztlich muss der, der den Pager verwenden will eine Instanz von ihm machen. Dann die Werte übergeben und den Pager an die View weiterreichen die dann zb via "<?=$this->get('pager')->getHtml()?>" den Pager "rendern" kann.
    Wieweit der Pager auch Abfragen manipulieren kann steht noch offen. Lieber weniger als zu viel magic. Sprich die Mapper könnten ja auch auf den Pager zugreifen mittels $this->getPager()->getLimits()

    OFF TOPIC
    Ansonsten am schönsten kannst du das Schlüsselwort "SQL_CALC_FOUND_ROWS" an deine SELECT hängen, dann kannst du mit "SELECT FOUND_ROWS();" die Anzahl bekommen.
    0 Mitglieder finden den Beitrag gut.
  17. #17
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    Habe gearde ein Pagesystem implementiert :-)

    github.com/IlchCMS/Ilch-2.0/commit/2eabd4788ddd23b97388f0e90b849bd736ef66c0


    (Zum testen, im Gästebuch eingebaut, am besten einfach paar Einträge machen und im \Ilch\Pagination die default 20 auf 2 setzen oder so)


    Zuletzt modifiziert von Pion am 20.03.2014 - 20:15:42
    1 Mitglieder finden den Beitrag gut.
  18. #18
    User Pic
    corian Entwickler
    Registriert seit
    16.06.2011
    Beiträge
    1.096
    Beitragswertungen
    122 Beitragspunkte
    Super ich sau es mir auch mal die Tage an.
    0 Mitglieder finden den Beitrag gut.
  19. #19
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Klasse, gleich eingebaut lächeln
    Kein Support für den Raidplaner über PM.
    1 Mitglieder finden den Beitrag gut.
  20. #20
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Ist das auch möglich über $this->db()->queryArray();?

    $entryArray = $this->db()->queryArray('
                SELECT
                    *
                FROM [prefix]_ep_events
                ORDER BY status ASC, start DESC
                LIMIT '.$pagination->getLimit()[0].','.$pagination->getLimit()[1].';
            ');
                   
            
            
    
            if ($pagination !== null) {
                $pagination->setRows($entryArray);
            }


    das Problem da bei ist ja das "$entryArray" kein Object mehr ist, somit kann der ja auch nicht mehr Zählen. Später komme ich nähmlich nicht mehr drum herum die Operatoren in der Where clausel zu ändern.

    Irgend eine Simple Idee das um zu Setzen?
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  21. #21
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    Da hast du ja das Query bei dir Sprich hier kannst du das machen was ich oben geschrieben habe.

    $entryArray = $this->db()->queryArray('
                SELECT SQL_CALC_FOUND_ROWS
                    *
                FROM [prefix]_ep_events
                ORDER BY status ASC, start DESC
                LIMIT '.$pagination->getLimit()[0].','.$pagination->getLimit()[1].';
            ');


    unten dann

    $pagination->setRows($this->db()->queryCell('SELECT FOUND_ROWS()'));



    BTW, ich weiß aus dem stehgreif nicht ob 5.4 $pagination->getLimit()[0] bereits unterstützt. bitte mal prüfen

    PPS schöner ist es die sql vorher in ner variable zu speichern $sql = '..', $this->db()->xy($sql) , ist schöner zum debugen


    Zuletzt modifiziert von Pion am 21.03.2014 - 16:29:34
    0 Mitglieder finden den Beitrag gut.
  22. #22
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Danke Funktioniert lächeln
    Nun habe ich auch mal ein Praktisches beispiel für "SQL_CALC_FOUND_ROWS"

    $pagination->getLimit()[0] funktioniert auf jedenfall auf meiner Test umgebung (5.5.9). Habe das vorher auch noch nie in php benuzt nur in js. Ich baue es sicherheisthalber anders. kann nicht einfach PHP Version ändern
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  23. #23
    User Pic
    dastiii Mitglied
    Registriert seit
    27.12.2005
    Beiträge
    2.354
    Beitragswertungen
    84 Beitragspunkte
    ZitatZitat geschrieben von php.net
    As of PHP 5.4 it is possible to array dereference the result of a function or method call directly. Before it was only possible using a temporary variable.


    php.net/manual/en/language.types.array.php#example-88


    Zuletzt modifiziert von dastiii am 21.03.2014 - 17:02:23
    0 Mitglieder finden den Beitrag gut.
  24. #24
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    Super allerdings hättest du das Statement auch auf selectArray umbauen können.
    0 Mitglieder finden den Beitrag gut.
  25. #25
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Allerdings sollte man das nicht (wirklich) verwenden, wenn man auf mehrere Keys des Rückgabewertes zurückgreifen will, da die Funktion dann mehrfach ausgeführt wird, was unnötig ist.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  26. #26
    User Pic
    Pion Hall Of Fame
    Registriert seit
    25.07.2007
    Beiträge
    870
    Beitragswertungen
    51 Beitragspunkte
    Jup sollte man schon drauf achten was die Funktion so macht :-)

    Ich mach hier jetzt mal zu, sonst wird das wieder ein Tread wo alle möglichen Themen reinkommen, ich denke das obige "Problem" ist gelöst.
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu Kritik und Verbesserungen

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten