php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.10.2010, 15:47  
Erfahrener Benutzer
 
Registriert seit: 08.08.2009
Beiträge: 195
PHP-Kenntnisse:
Fortgeschritten
da.eXecutoR befindet sich auf einem aufstrebenden Ast
Standard OOP Klassen und Sortierung von Resultaten

Ich hab da mal eine allgemeine Frage wie ihr das in eurem Projekten so löst was das filtern und sortieren von Datenbankabfragen betrifft.

Ich habs bei mir so gelöst dass ich eine eigene Sortier Helper Klasse aufbaue. Zum Beispiel so:

PHP-Code:
class sorter {

    
// Sort a Multidimensional array by a given value and direction
    
public function sortMultiArray($array,$value,$direction "asc"){
        foreach(
$array as $k=>$v) {
            
$b[$k] = strtolower($v[$value]);
        }
        if(
$direction == "asc"){
            
asort($b);
        }else{
            
arsort($b);
        }
        foreach(
$b as $key=>$val) {
            
$c[] = $array[$key];
        }
        return 
$c;
    }

Daneben hab ich eine Klasse mit der ich Beispielsweise Events aus der Datenbank hole:

PHP-Code:
class events {

    function  
__construct() {
        
// Set the database connection
        
$this->con = new clientDB();
        
$this->con->db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_SILENT);

        
// Get all Events into our object
        
$sql $this->con->db->prepare("Select * from db_eventIndex");
        
$sql->execute();
        
$this->events $sql->fetchAll(PDO::FETCH_ASSOC);
    }

    
// Get project dependet events
    
function setFilterProject($pID){
        
$i 0;
        foreach(
$this->events as $event){
            if(
$event["projectID"] <> $pID){
                unset(
$this->events[$i]);
            }
            
$i++;
        }
    }

    
// Get user dependet events
    
function setFilterUser($uID){
        
$i 0;
        foreach(
$this->events as $event){
            
// See on which event I'm connected
            
$sql $this->con->db->prepare("Select * from db_eventMembers WHERE userID = ? and eventID = ?");
            
$sql->bindValue(1,$uID,PDO::PARAM_STR);
            
$sql->bindValue(2,$event["ID"],PDO::PARAM_STR);
            
$sql->execute();
            
$res $sql->fetch(PDO::FETCH_ASSOC);
            if(
$res["eventID"] <> $event["ID"]){
                unset(
$this->events[$i]);
            }
            
$i++;
        }
    }
       
    
// Throw the events
    
function dropEvents(){
        return 
$this->events;
    } 
Natürlich gibt es sehr viele solche Klassen die mir Listen mit Daten ausgeben. Diese kann ich dann schön bequem wie folgt sortieren und ausgeben lassen:

PHP-Code:
<?PHP
            $events 
= new events();
            
$events->setFilterUser($_SESSION["system"]["user"]["id"]);

            
$mylist = new sorter();
            
$mylist $mylist->sortMultiArray($events->dropEvents(), "eventStart");

            if(
count($mylist) > 0){
                foreach(
$mylist as $event){
                    
$eventDate = new date($event["eventStart"]);
                    echo 
'<li>'.$eventDate->getDate().' - '.$event['eventName'].'</li>';
                }
            }else{
                echo 
"<p>Zur Zeit keine anstehenden Termine.</p>";
            }
            
?>
Meine Frage an euch Profis ist nun ob dies eine saubere Methode ist oder ob ihr da in der Praxis die Thematik anders löst.

Beispielsweise auch die Frage, hole ich mir die Daten gefiltert aus der Datenbank und bastle das spezifische SQL Query in meiner Klasse zusammen und feure es erst bei der Ausgabe ab, oder lad ich die Datensätze in mein Objekt und filtere dieses dann?

Für eure Feedbacks bedanke ich mich herzlich.

Grüsse

eXe
__________________
It's not a bug. It's a feature!
da.eXecutoR ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 21.10.2010, 15:55  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Also ich weiss nicht wie deine Datenbank aussieht, aber bei größeren Applikationen (gerade auch beim Einsatz von ORMs wo du noch zig andere Infos und Objekt-Beziehungen hast) kannst du so schnell an die Memory Grenze stößen.
cycap ist offline   Mit Zitat antworten
Alt 21.10.2010, 16:02  
Erfahrener Benutzer
 
Registriert seit: 23.09.2010
Beiträge: 146
PHP-Kenntnisse:
Fortgeschritten
jabubo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich halte es generell so, dass Sortierung und Filterung in der Datenbank verbleibt. Da muss ich mich nicht darum kümmern, wenn mal große Datenmengen in einer Tabelle stecken und ich mit LIMIT arbeiten muss. Deine Klasse wird in solch einem Fall vermutlich abschmieren und meckern, dass nicht genug Speicher allocated werden kann.

Zusätzlich kann die Sortierung in PHP anders aussehen, als in SQL. Kollationen, Zeichensätze und die Art der Sortierung (numerisch, alphabetisch, ...) können sich stark unterscheiden.

Deine Methode zum sortieren ist aber deswegen nicht schlecht. Es gibt hin und wieder für solche Methoden auch Anwendungsfälle. Ein Tipp noch am Rand: Mach aus "public function sortMultiArray" "public static function sortMultiArray". Dann kannst du dir das Objekt sparen.
__________________
PHP online testen, zum Beispiel: md5, base64_decode, preg_match, urldecode und viele weitere...
jabubo ist offline   Mit Zitat antworten
Alt 21.10.2010, 16:08  
Erfahrener Benutzer
 
Registriert seit: 10.02.2009
Beiträge: 929
ragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Mensch
Standard

Ja, die ganze Filterung sollte soweit wie möglich, auf dem DB Server passieren.

IMHO ist es Schwachsinn, ALLE Elemente aus der DB zu holen (1000e) und dann den kompletten Array nach einer ID zu durchsuchen und alles andere zu löschen.

Geändert von ragtek (21.10.2010 um 16:14 Uhr).
ragtek ist offline   Mit Zitat antworten
Alt 21.10.2010, 16:12  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

[OT]

Zitat:
mein Blog
Falls ich hier wie das Boardarschloch rüberkomme => Das ist vollste Absicht!
lol, jetzt neu nach "Sido -mein Block" : "ragtek - mein Blog"

(sorry, konnts mir nicht verkneifen)
[/OT]
cycap ist offline   Mit Zitat antworten
Alt 26.10.2010, 15:56  
Erfahrener Benutzer
 
Registriert seit: 15.04.2010
Beiträge: 813
PHP-Kenntnisse:
Fortgeschritten
Paul.Schramenko befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ragtek Beitrag anzeigen
Ja, die ganze Filterung sollte soweit wie möglich, auf dem DB Server passieren.
Gehört IMHO auch in die Datenbank und nicht in den PHP-Code.
Sicherlich gibt es auch mal Ausnahmen, wo es in der DB nicht geht, aber das wird wohl eher seltener passieren.
__________________
"My software never has bugs, it just develops random features."
"Real programmers don't comment. If it was hard to write, it should be hard to understand!"
Positive Bewertungen sind nicht unwillkommen...
Paul.Schramenko ist offline   Mit Zitat antworten
Alt 26.10.2010, 17:37  
Erfahrener Benutzer
 
Registriert seit: 10.02.2009
Beiträge: 929
ragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Mensch
Standard

Zitat:
Zitat von Paul.Schramenko Beitrag anzeigen
Gehört IMHO auch in die Datenbank und nicht in den PHP-Code.
Sicherlich gibt es auch mal Ausnahmen, wo es in der DB nicht geht, aber das wird wohl eher seltener passieren.
Das meine ich ja damit
ragtek ist offline   Mit Zitat antworten
Alt 29.10.2010, 11:19  
Erfahrener Benutzer
 
Registriert seit: 17.08.2010
Beiträge: 216
PHP-Kenntnisse:
Fortgeschritten
Dormilich befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von da.eXecutoR Beitrag anzeigen
PHP-Code:
class events {

    function  
__construct() {
        
// Set the database connection
        
$this->con = new clientDB();
        
$this->con->db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_SILENT);

        
// Get all Events into our object
        
$sql $this->con->db->prepare("Select * from db_eventIndex");
        
$sql->execute();
        
$this->events $sql->fetchAll(PDO::FETCH_ASSOC);
    }

    
// ... 
statt $this->events = $sql->fetchAll(PDO::FETCH_ASSOC); kannst du auch $this->events = $sql; verwenden, die PDOStatement Objekte funktionieren auch so mit foreach()
Dormilich ist offline   Mit Zitat antworten
Alt 30.10.2010, 13:36  
Erfahrener Benutzer
 
Registriert seit: 08.08.2009
Beiträge: 195
PHP-Kenntnisse:
Fortgeschritten
da.eXecutoR befindet sich auf einem aufstrebenden Ast
Standard

Danke für eure Inputs.

Ich frage mich zur Zeit noch wie ich das dann umsetzen soll. Das Query wird dann je nach dem recht kompliziert. Angenommen ich habe folgendes Ziel-Query:

"Select * from db_eventIndex WHERE ( "Select * from db_eventMembers WHERE userID = '$meineUserID ) and projectID = '$aktuellesProjekt' ORDER BY eventName ASC Limit 5, 10"

Wie baue ich ein solches Query in meiner Klasse zusammen?

Wenn ich nach OOP / PDO DB Klassen suche finde ich immer nur klassen bei welchen dann das Query ans Objekt geschickt wird. Ich will aber das Query ja innerhalb der Klasse zusammensetzen können in dem ich:

$meineklasse->setFilter('user', '$meineUserID');
$meineklasse->setFilter('project','$aktuellesProjekt');
$meineklasse->setOrder('eventName','asc');
$meineklasse->setLimit('5','10');
$meineklasse->getRows();

z.Bsp. diese Methoden aufrufe.

Oder ist dieser Ansatz bereits falsch? Kennt jemand eine gute Quelle zu dieser Thematik?

Mir ist ja schon klar dass ich Beispielsweise so vorgehen könnte:

PHP-Code:
class dbQuery() {

  static function 
__construct(){
     
$this->db = new dbClass();
     
$this->sql "";
}

 function 
setDatabase($db) {
     
$this->sql .= "Select * from $db";
}

 function 
setFilter($col$value){
     
$this->sql .= "WHERE $col = $value";

etc. etc.

Aber wie flexibel ist das wirklich? Und vorallem gibt es einen besseren Weg?

Vielen Dank für eure Zeit!

eXe
__________________
It's not a bug. It's a feature!
da.eXecutoR ist offline   Mit Zitat antworten
Alt 30.10.2010, 13:44  
Erfahrener Benutzer
 
Registriert seit: 17.08.2010
Beiträge: 216
PHP-Kenntnisse:
Fortgeschritten
Dormilich befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von da.eXecutoR Beitrag anzeigen
Das Query wird dann je nach dem recht kompliziert. Angenommen ich habe folgendes Ziel-Query:

"Select * from db_eventIndex WHERE ( "Select * from db_eventMembers WHERE userID = '$meineUserID ) and projectID = '$aktuellesProjekt' ORDER BY eventName ASC Limit 5, 10"
Das könnte möglicherweise auch mit einem JOIN erreicht werden (keine Unterabfrage nötig)

Zitat:
Zitat von da.eXecutoR Beitrag anzeigen
Wie baue ich ein solches Query in meiner Klasse zusammen?
klingt nach einem Active Record Pattern (siehe Wikipedia, da sind auch entsprechende Links)

Zitat:
Zitat von da.eXecutoR Beitrag anzeigen
Wenn ich nach OOP / PDO DB Klassen suche finde ich immer nur klassen bei welchen dann das Query ans Objekt geschickt wird.
liegt wahrscheinlich daran, daß der Hauptzweck von PDO darin liegt, (fertige) SQL Anfragen an die DB zu schicken und die Ergebnisse bequem weiterzuverarbeiten. wie der Querystring ensteht, ist für PDO uninteressant.
Dormilich ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
OOP: Klassen blockieren andere Klassen mindphuk PHP Tipps 2010 9 29.09.2010 15:45
[Erledigt] Design von Klassen für Datenbankabfragen Sirke Software-Design 10 17.06.2010 12:40
Klassen in anderen Klassen verfügbar machen Kein Genie PHP Tipps 2010 5 16.01.2010 20:34
[Erledigt] Wie Objekte von Klassen zusammenführen total2121 PHP Tipps 2009 6 19.10.2009 14:22
Mehrere Klassen verknüpfen BlackJack01090 Software-Design 9 26.05.2009 20:43
Modulare Programmierung - Klassen nur in Klassen Gültig iXtends Software-Design 6 26.05.2009 15:37
OOP Klassen Probleme Kein Genie PHP Tipps 2009 15 19.04.2009 18:12
Einstieg in Objekt-orientierte-Programmierung (OOP) - Erste Versuche :-) echo PHP Tipps 2009 20 26.02.2009 11:08
Wer hilft mir bei OOP? echo Beitragsarchiv 27 23.02.2009 16:12
Fragen zu Klassen Kein Genie PHP Tipps 2006 3 08.05.2006 11:25
Sessions an includete Klassen übergeben Dr_Enquinox PHP Tipps 2006 4 29.04.2006 10:25
mit html klassen definieren und in php ausgeben PHP-Fortgeschrittene 4 16.01.2006 10:31
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46
Klassen PHP Tipps 2005 5 09.04.2005 18:51

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
oop klassen und sortierung von resultaten, mysql table for bookmarks class object oop pdo, php klassen sortieren, php eigene pdo klasse, php klassen events, php objekte sortieren, oop pdo, oop klasse suchen, php oop filter, in klassen sortieren php, php oop pdo, php pdo filterung bei der ausgabe, oop activerecord, php oop pdo klasse, datenbank klasse personen sortieren, php oop array sortieren, oop php sql filter, php oop filter class, oop sortieren, pdo::prepare oop

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:39 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum