php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.12.2009, 14:01  
Erfahrener Benutzer
 
Registriert seit: 08.04.2009
Beiträge: 324
Creator befindet sich auf einem aufstrebenden Ast
Standard XML Import in OOP

Hallo,

ich Frage mich im moment, wie man einen recht Komplexen Import aus XML in einer OOP umgebung darstellt. Gibt es da Patterns die man anwenden kann/sollte?

Vor einer halben ewigkeit habe ich den Import schon mal Programmiert diesen möchte ich jetzt aus unterschiedlichen Gründen erneuern.

Der vorhande Code weißt einiges an Fehler auf und ist auch recht unsauber.
Eher Prozedualer Code in einer Methode gedrückt.

Alter Code:
PHP-Code:
private function parseXML(){
        
// Als erstes lesen wir die Kategorien aus dem XML aus und schauen nach ob diese in unsere Teballe existieren.
        // Ist dies nicht der Fall, dann wird diese Kategorie angelegt    
        
$this->readXML();
        
$db = new Db();
        foreach (
$this->xml->Tour AS $tour){
            
// Verarbeiten der Kategorien.
            
foreach ($tour->Types->Type AS $type){
                
// Sortieren nach Kategorien
                // Prüfen ob es eine cat oder under cat ist.
                
if (!preg_match("/:/"$type->attributes()->Name)) { 
                    
// Es ist eine cat
                    
$cat[] = $type->attributes()->Name;
                }
                else{
                    
// Es ist eine unterkategorie.
                    // Wir teilen diese gleich auf Im Array 0 steht die cat und in 1 under_cat
                    
$under_cat[] = explode(": "$type->attributes()->Name);
                }
            }
            
// Es liegt eine Kategorie und unterkategorie vor. 
            // Daher ordnen wir jetzt dieses auch der zu. Alles anderen wird Ignoriert.
            
if(isset($cat[0]) and isset($under_cat[0])){
                
// Welche id hat diese under_cat?
                
$under_cat_id $db->getValue("SELECT cat_id FROM categories WHERE cat_name = '".htmlspecialchars($db->escape($under_cat[0][1])."'"));
                
$check_cat 0;
                unset(
$cat);
                unset(
$under_cat);
                
            }
            
// Wenn keine cat vorliegt aber eine under_cat, dann pack es stumpf ich die under_cat. 
            // Alle weiteren einträge werden Ignoriert.
            
if(!isset($cat[0]) and isset($under_cat[0])){
                
$under_cat_id $db->getValue("SELECT cat_id FROM categories WHERE cat_name = '".htmlspecialchars($db->escape($under_cat[0][1])."'"));
                
$check_cat 0;
                unset(
$cat);
                unset(
$under_cat);
            }
            
// Wenn eine cat vorliegt, aber keine under_cat, dann packe es in die angegebene cat unter weitere.
            // Alle weiteren einträge werden Ignoriert.
            
if(isset($cat[0]) and !isset($under_cat[0])){
                
// Für die cat Muscals und Gutscheine, existieren keine under_cats. Daher drauf prüfen und direckt da rein
                
if($cat[0] == 'Musicals' or $cat[0] == 'Gutscheine'){
                    
// Dann speichere die Tour direckt in diese Gruppe
                    
$under_cat_id $db->getValue("SELECT cat_id FROM categories WHERE cat_name = '".htmlspecialchars($db->escape($cat[0])."' AND parent_id = 0"));
                }
                else{
                    
// Erst die ID von cat auslesen
                    
$cat_id $db->getValue("SELECT cat_id FROM categories WHERE cat_name = '".htmlspecialchars($db->escape($cat[0])."' AND parent_id = 0"));
                    
// Jetzt die under_cat auslesen
                    
$under_cat_id $db->getValue("SELECT cat_id FROM categories WHERE cat_name = 'Weitere' AND parent_id = '$cat_id'");
                    
// Da dies Fraglich ist, wird der Flak check_cat auf 1 gesetzt.
                
}
                
$check_cat 1;
                unset(
$cat);
                unset(
$under_cat);
            }
            
// Touren die in mehreren Kategorien oder Unterkategoiren sind, werden erstmal Ignoriert.
            // Prüfen ob diese Tour schon in der Db existiert.
            
$tour_row $db->getNumRows("SELECT different_id FROM tours WHERE different_id = '".$db->escape($tour->attributes()->ID)."'");
            if(!
$tour_row){
                
// Neu anlegen einer Tour.
                
$db->Query("
                    INSERT INTO tours(
                        different_id,
                        under_cat_id,
                        title,
                        image,
                        description,
                        fromprice,
                        check_cat,
                        user_id,
                        url
                    )
                    VALUES(
                        '"
._($tour->attributes()->ID)."',
                        '$under_cat_id',
                        '"
.htmlspecialchars($db->escape($tour->Title), ENT_QUOTES)."',
                        '"
.$db->escape($tour->Image)."',
                        '"
.htmlspecialchars($db->escape($tour->Description), ENT_QUOTES)."',
                        '"
.$db->escape($tour->FromPrice)."',
                        '$check_cat',
                        '1',
                        '"
.$db->escape($tour->URL)."'
                    )
                "
);
                
// Bild nur speichern wenn es auch eins gibt.
                
if(!empty($tour->Image)){
                    
$new_tour_id $db->getLastInsertId();
                    
// Das vorhanden Bild speichern.
                    // !!! Achtung sehr Performance lastig!!!
                    
$this->newPic($tour->Image);
                    
// Bilder sind zu einem user und zu der tour zuzuordnen
                    
$db->Query("
                        INSERT INTO mapping_pic(
                            user_id,
                            tour_id,
                            pic_id
                            )
                        VALUES(
                            1,
                            $new_tour_id,
                            $this->pic_id
                            )
                    "
);
                    
$this->row_pics ++;
                }
                
$this->row_tours ++;
            }
            else{
                
// Hat sich das Bild verendert? Oder wurde es sogar entfernt?
                ##############################################################################
                
$pic_row $db->getNumRows("SELECT image FROM tours WHERE image = '".$db->escape($tour->Image)."' AND different_id = '".$db->escape($tour->attributes()->ID)."'");
                if(!
$pic_row){
                    
// Es hat sich was verändert.
                    // Wurde das Bild gelöscht?
                    
if(empty($tour->Image)){
                        
// Das Bild wurde gelöscht, aus rechtlichen Gründen sind wir auch gezwungen dieses zu entfernen.
                        /* Auslesen der ID.
                        $tour_id = $db->getValue("SELECT tour_id FROM tours WHERE different_id = '"._($tour->attributes()->ID)."'");
                        $pic_id = $db->getValue("SELECT pic_id FROM mapping_pic WHERE tour_id = $tour_id");
                        // Vorher noch die Dateinamen auslesen.
                        $pic_file_name = $db->getRow("SELECT pic, thumb WHERE pic_id = $pic_id");
                        // Mit der tour id, können wir das Bild nun löschen.
                        $db->Query("DELETE FROM mapping_pic WHERE tour_id = $tour_id");
                        $db->Query("DELETE FROM pics WHERE pic_id = $pic_id");
                        // Die Bilder löschen.
                        unlink($pic_file_name['thumb']);
                        unlink($pic_file_name['pic']);
                        */
                    
}
                    else{
                        
$tour_id $db->getValue("SELECT tour_id FROM tours WHERE different_id = '".$db->escape($tour->attributes()->ID)."'");
                        
// Es liegt ein neues Bild vor daher muss dieses erstellt und gespeichert werden.
                        
$this->newPic($tour->Image);
                        
// Bilder sind zu einem user und zu der tour zuzuordnen
                        
$db->Query("
                            INSERT INTO mapping_pic(
                                user_id,
                                tour_id,
                                pic_id
                                )
                            VALUES(
                                1,
                                $tour_id,
                                $this->pic_id
                                )
                        "
);
                    }
                }
                
                
##############################################################################
                // Wir vergleichen die Datensätze und führen dann geziehlt das Update für die Tour durch.
                // Es wird True oder False zurückgegeben.
                
$tour_update $db->getNumRows("
                    SELECT 
                        different_id
                    FROM 
                        tours
                    WHERE
                        different_id = '"
.$db->escape($tour->attributes()->ID)."' AND
                        (
                        title         != '"
.htmlspecialchars($db->escape($tour->Title), ENT_QUOTES)."' OR
                        description != '"
.htmlspecialchars($db->escape($tour->Description), ENT_QUOTES)."' OR
                        image         != '"
.$db->escape($tour->Image)."' OR
                        fromprice     != '"
.$db->escape($tour->FromPrice)."' OR
                        url            != '"
.$db->escape($tour->URL)."'
                        )
                "
);
                if(
$tour_update){
                    
// Wenn es unstimmigkeiten gibt, dann ein Update durchführen.
                    
$db->Query("
                        UPDATE tours SET
                            title          = '"
.htmlspecialchars($db->escape($tour->Title), ENT_QUOTES)."',
                            image          = '"
.$db->escape($tour->Image)."',
                            description  = '"
.htmlspecialchars($db->escape($tour->Description), ENT_QUOTES)."',
                            fromprice      = '"
.$db->escape($tour->FromPrice)."',
                            url             = '"
.$db->escape($tour->URL)."'
                        WHERE different_id = '"
.$db->escape($tour->attributes()->ID)."'
                    "
);
                    
$this->row_tours_update ++;
                }
                
            }
            
// Auslesen der tour_id
            
$tour_id $db->getValue("SELECT tour_id FROM tours WHERE different_id = '".$db->escape($tour->attributes()->ID)."'");
            
// Verarbeiten der Event Daten zu einer Tour.
            
foreach ($tour->Events->Event AS $event){
                
// Prüfen ob ein Event existiert.
                
$event_row $db->getNumRows("SELECT different_id FROM events WHERE different_id = '".$db->escape($event->attributes()->ID)."'");
                if(!
$event_row){
                    
// Neues Event anlegen wenn es noch nicht existiert.
                    
$db->Query("
                    INSERT INTO events(
                        tour_id,
                        different_id,
                        title,
                        fromprice,
                        availability,
                        date,
                        time,
                        locationname,
                        locationadress,
                        locationzip,
                        locationcity,
                        locationcountry
                        
                    )
                    VALUES(
                        '$tour_id',
                        '"
.$db->escape($event->attributes()->ID)."',
                        '"
.$db->escape($event->Title)."',
                        '"
.$db->escape($event->FromPrice)."',
                        '"
.$db->escape($event->Availability)."',
                        '"
.$db->escape($event->Date)."',
                        '"
.$db->escape($event->Time)."',
                        '"
.$db->escape($event->LocationName)."',
                        '"
.$db->escape($event->LocationAddress1)."',
                        '"
.$db->escape($event->LocationZIP)."',
                        '"
.$db->escape($event->LocationCity)."',
                        '"
.$db->escape($event->LocationCountry)."'
                    )"
);
                    
$this->row_events ++;
                }
                else {
                    
// ??? Erst vergleichen oder doch gleich updaten.
                    
$event_update $db->getNumRows("
                        SELECT 
                            different_id 
                        FROM 
                            events
                        WHERE
                            different_id      = '"
.$db->escape($event->attributes()->ID)."' AND
                            (
                            title             != '"
.$db->escape($event->Title)."' OR
                            fromprice         != '"
.$db->escape($event->FromPrice)."' OR
                            availability     != '"
.$db->escape($event->Availability)."' OR
                            date             != '"
.$db->escape($event->Date)."' OR
                            time             != '"
.$db->escape($event->Time)."' OR
                            locationname     != '"
.$db->escape($event->LocationName)."' OR
                            locationadress     != '"
.$db->escape($event->LocationAddress1)."' OR
                            locationzip     != '"
.$db->escape($event->LocationZIP)."' OR
                            locationcity     != '"
.$db->escape($event->LocationCity)."' OR
                            locationcountry != '"
.$db->escape($event->LocationCountry)."'
                            )
                    
                    "
);
                    
// prüfen ob ein Update durchgeführt werden muss.
                    
if($event_update){
                        
// Wenn es unstimmigkeiten gibt, dann ein Update durchführen.
                        
$db->Query("
                            UPDATE events SET
                                title             = '"
.$db->escape($event->Title)."',
                                fromprice         = '"
.$db->escape($event->FromPrice)."',
                                availability     = '"
.$db->escape($event->Availability)."',
                                date             = '"
.$db->escape($event->Date)."',
                                time             = '"
.$db->escape($event->Time)."',
                                locationname     = '"
.$db->escape($event->LocationName)."',
                                locationadress     = '"
.$db->escape($event->LocationAddress1)."',
                                locationzip     = '"
.$db->escape($event->LocationZIP)."',
                                locationcity     = '"
.$db->escape($event->LocationCity)."',
                                locationcountry = '"
.$db->escape($event->LocationCountry)."'
                            WHERE different_id = '"
.$db->escape($event->attributes()->ID)."'
                        "
);
                        
$this->row_events_update ++;
                    }
                }
            }
        } 
Der Code erfüllt so nicht mehr meine Anfoderungen und birgt auch Fehler insich auf Grund von änderungen an der XML Struktur. Bzw. habe ich den Code eher mal zusammengeklopt aus zeitgründen.

Die neuen Anforderungen:
Auf Grund der Datenmänge 10 MB und mehr funktioniert das ganze nur noch bei änderungen am Server was die Skriptlaufzeit, so wie den Speicherbedarf angeht.
Es müssen ca. 5.000 Touren, ca. 10.000 Events und 3.000 Bilder verarbeitet werden. ( Beim ersten Import ) Danach müssen die Daten abgeglichen werden und gegebenenfals geupdatet werden.
In der XML Struktur gibt es keine Information ob ein Datensatz geändert wurde oder wann zuletzt ich muss allso wirklich alles vergleichen.

Deshalb benötige ich eine Lösung, wie sie z.b. der MYSQLDumper verwendet.
x Datensätze verarbeiten import neu Laden und weiter.
Im grunde weiß ich wie das Funktioniert. Hier stellt sich mir die Frage wie ich mir merke wo ich im XMl Aufgehört habe und wo ich wieder anfangen muss.
Klar wohl in der Session aber an hand von welchen Infos.
Hier den richtigen Wert zufinden finde ich auch recht schwer, da ich nicht sagen kann wie oft die schleifen innerhalb einer Tour laufen.
Wenn ich also sagen verarbeite 10 Touren dann können das 1000 Events sein aber auch nur 10

Wie würdet Ihr an die sache rangehen?
Creator ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 04.12.2009, 14:07  
Erfahrener Benutzer
 
Registriert seit: 28.09.2008
Beiträge: 1.168
PHP-Kenntnisse:
Fortgeschritten
Koala befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Klar wohl in der Session aber an hand von welchen Infos.
wieso nicht per GET-Parameter wie bei einer Blätterfunktion ?
Koala ist offline   Mit Zitat antworten
Alt 04.12.2009, 14:23  
Erfahrener Benutzer
 
Registriert seit: 08.04.2009
Beiträge: 324
Creator befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
wieso nicht per GET-Parameter wie bei einer Blätterfunktion ?
ja oder das.
Creator ist offline   Mit Zitat antworten
Alt 04.12.2009, 15:15  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo,
zunächst mal würde ich die XML-Datei in ein DOMDocument laden. Danach kannst du mit DOMXPath die Touren "paginaten":
Code:
/tour[position() < 5]
siehe: XPath Syntax

Auf welcher Seite du dich befindest musst du dir eben irgendwie merken. Das Speichern in der DB würde ich aber unbedingt auslagern. Sprich unterteil den Code:

-XML einlesen
-XML interpretieren
-normalisierten Dump erzeugen (PHP-Array, CSV, ..)
-in Datenbank eintragen (temporäre Tabelle, ..)
-Vergleich durchführen (aktualisieren und löschen von Datensätzen)

Nach und vor jedem Schritt kannst du Konsistenzprüfungen einbauen, somit sollte ein Fehler relativ schnell aufzufinden sein.
Chriz ist gerade online   Mit Zitat antworten
Alt 04.12.2009, 16:11  
Erfahrener Benutzer
 
Registriert seit: 08.04.2009
Beiträge: 324
Creator befindet sich auf einem aufstrebenden Ast
Standard

Danke Chriz,
mit XPath muss ich mich erstmal befasse bevor ich da zu was sagen kann.

Zitat:
-XML einlesen
-XML interpretieren
-normalisierten Dump erzeugen (PHP-Array, CSV, ..)
-in Datenbank eintragen (temporäre Tabelle, ..)
-Vergleich durchführen (aktualisieren und löschen von Datensätzen)
Warum nicht direkt die Daten per simpelXML einlesen und durchlaufen?
Irgendwie scheint mir dein verfahren noch Performance verbrauchender als direkt drauf los.
Grade die Temporäre Tabelle würde die Anzahl der Querys mal eben verdoppeln oder?
Der alte Import rennt nur auf meinem Rootserver auf meinem Webspace hab ich den MYSQL Server da in den himmel gejagt.
Mir ist ziemlich egal wie lange der Import dauert. Möchte nur sichergehen das ich den Server für diesen Zeitpunkt nicht lahm lege. Sprich andere Anfrage später beantwortet werden, weil der Server grade zu 100% ausgelastet ist.
Wobei das wohl eher ne Konfigsache des Servers ist.
Creator ist offline   Mit Zitat antworten
Alt 04.12.2009, 16:24  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ich persönlich finde simpleXML nicht intuitiv, DOMDocument stellt mit DOMElement eine aussagekräftige Klasse bereit, mit der auf Knoten zugegriffen werden kann. Aber letztlich ist es egal und wenn du alles richtig aufbaust, kannst du diesen Teil später auch einfach austauschen und das Auslesen des XML durch eine andere Lib erledigen lassen.

Der Vorteil der temporären Tabelle ist, dass du in einem Rutsch alle Daten reinschreiben kannst und den Abgleich über die MySQL selbst erledigen kannst. Das ist schneller als wie im Code oben alles Häpchenweise einzutragen und PHP-seitig die Synchronization zu erledigen. Du kannst also ganze Blöcke von Tabelle A zu Tabelle B schieben. Das ist 10-100x (Faustregel) schneller als über PHP selbst. Momentan führst du ja pro Tour-Knoten einen Query durch, das ist extrem unperformant. Queries in Schleifen solltest du immer versuchen zu vermeiden.
Chriz ist gerade online   Mit Zitat antworten
Alt 04.12.2009, 16:54  
Erfahrener Benutzer
 
Registriert seit: 08.04.2009
Beiträge: 324
Creator befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank erstmal für das mit Gedanken machen.
Zitat:
Der Vorteil der temporären Tabelle ist, dass du in einem Rutsch alle Daten reinschreiben kannst und den Abgleich über die MySQL selbst erledigen kannst.
Ganz kann ich dir noch nicht folgen.
Meinst du eine wirklich Temp Tabelle?
Code:
CREATE TEMPORARY TABLE tmp
Und dies füttern mit Multiinsert?
Hiervon bräuchte ich ja schon wohl 2. Für Tours und Events. *glaub
Diese sind ja auch nur gültig innerhalb einer DB Verbindung außer ich verwende ganz normale Tabellen die ich dann einfach wieder leere.
Wir würde der Abgleich direkt per MYSQL Funktionieren? Mit in MYSQL erstellten Prozeduren?
Zitat:
Queries in Schleifen solltest du immer versuchen zu vermeiden.
Das ist mir bekannt erlich gesagt kannte ich keine Alternative im zusammenhang mit diesem Import.

Mal eine überlegung:
1. XML Daten laden und Lokal erstmal speichern ( Dauert ca. 5-10sek.)
2. Umleitung auf sich selbst.
3. Die ersten z.b. 100 Touren laden
4. Multiinsert der Tour und Event Daten in einer Temptabelle
5. Schritt 4 wiederholen bis alle Daten in der Temptabelle vorhanden sind.
6. Abgleichen der Daten per MYSQL?
7. Laden der Bilder und erstellen eines Thumbs so wie speichern der Orginalgröße. Max 10 pics auf einmal.
Creator ist offline   Mit Zitat antworten
Alt 04.12.2009, 17:22  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ja, du könntest die Daten auch in ein CSV schreiben und dann wirklich komplett in die Datenbank schieben. Mit LOAD DATA geht das extrem schnell, wenn CSV und Datenbankserver auf der selben Maschine laufen. Auch wenn es scheinbar erstmal keinen Sinn macht XML in CSV umzuwandeln geht das doch sehr sehr schnell. Dann könntest du die temporären Tabellen auch wirklich temporär benutzen und müsstest keine normalen Hilfstabellen anlegen.
Chriz ist gerade online   Mit Zitat antworten
Alt 04.12.2009, 17:31  
Erfahrener Benutzer
 
Registriert seit: 08.04.2009
Beiträge: 324
Creator befindet sich auf einem aufstrebenden Ast
Standard

Aus reiner neugierde wie würde das direkt per MYSQL funktionieren, also mit Temp Tabelle und der abgleich mit der realen Tabelle?

Bei der CSV Lösung, einfach alle Datensätze stumpf überschreiben?
Creator ist offline   Mit Zitat antworten
Alt 06.12.2009, 14:38  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Nein, aber du kannst trotzdem gesammelte Queries durchführen, was viel schneller ist.

Du könntest beispielsweise alle veralteten Datensätze löschen:
DELETE FROM tabelle_live WHERE id NOT IN (SELECT id FROM tabelle_temp_import)
Chriz ist gerade online   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
100% OOP wirklich sinnvoll ? Pehapeh PHP-Fortgeschrittene 31 04.12.2009 11:19
Was bringt OOP wenn Objekte nach jeder Seite sterben? majorbenks PHP Tipps 2009 9 18.11.2009 14:11
[Erledigt] PHP csv import mit sortierung möglich? fulltilt PHP Tipps 2009 10 02.11.2009 17:29
Eure Tipps/Hinweise/Empfehlungen zum Thema Modellierung und OOP ChillSn Off-Topic Diskussionen 1 30.09.2009 15:19
Tutorial: PHP/MySQL und OOP Chriz Tutorials 11 19.08.2009 23:51
MVC mit OOP umsetzen Benjamin Such PHP Tipps 2009 3 17.08.2009 16:04
[Erledigt] OOP & PHP5 Buchempfehlung? boernard PHP Tipps 2009 2 26.02.2009 18:32
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
Einstieg in Objekt-orientierte-Programmierung (OOP) echo PHP Tipps 2009 50 17.02.2009 11:55
OOP verstanden? stayInside PHP Tipps 2009 4 24.01.2009 02:57
Buch für OOP homekiller PHP Tipps 2008 2 21.12.2008 16:54
MVC vs. herkömmliches OOP stayInside PHP Tipps 2008 5 26.11.2008 22:47
Umlaute ä,ö,ü und ß werden beim SQL Import nicht übernommen Plague Datenbanken 7 17.09.2007 17:28
Import von Netscape Mail nach Outlook Express Off-Topic Diskussionen 6 10.05.2005 09:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
xml import php, php xml import, xml oop, php xml importer, vorteil xml import gegenüber cxv import, php xml oop, xml import mysql, php simplexml getvalue, xml interpretieren, pattern import csv xml, htms in oop imporieren, xml import, oop xml parsen, php oop get auslesen, xml daten auslesen oop php, oop get auslesen, oop php liste sortieren nach kategorie, simplexml alle einträge überschreiben, php5 xml import, import xml in php

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:36 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