Suche auf lima-city
-
in: Problem mit mysql UPDATE
geschrieben von guteseiten
Du hast einmal
SELECT ... WHERE code = '$code'
und dann wieder
UPDATE ... WHERE CODE = '$code'
könnte es sein,
dass auch die Groß-/Klein-Schreibung bei Spalten-Namen entscheidend ist ?!
also entweder CODE oder code nehmen, je nachdem wie in Tabelle definiert.
-
in: Datei ab bestimmter Zeile (mit LImit) auslesen
geschrieben von guteseiten
Super, Danke
ich hatte es auch (so ähnlich) mit ftell und fseek ausprobiert,
aber bei mir hat das irgendwie nicht geklappt, jetzt geht's :)
und anstatt Link zum Klicken ist es ja kein Problem das als Meta-Refresh zu machen
und ich habe es jetzt doch wieder so gemacht, dass jede Sub-Datei
als Limit die Anzahl der (Daten-) Zeilen hat, anstatt Dateigröße in Byte
(das Byte-Limit ist nur auskommentiert, kann man leicht ändern)
mein Script sieht jetzt also so aus:
<?php // --------------------------------------------------------- ini_set('display_errors','On'); error_reporting(E_ALL); header("Content-Type: text/html; charset=utf-8"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); $cachefile = 'data/_bestand2012.csv'; ## $limit = (1024*500); // ---- max Größe in Byte pro Datei $zeilen = 1000; // ---- max Daten-Zeilen pro Datei $csvheader = true; // ----------------------------------------------------------- function csv_to_array($csvurl,$length=0,$delimiter=";",$enclosure="\"",$csvhead=true) { $csvdata = array(); $ReadHandle = fopen($csvurl, 'r'); if ($csvhead === true) { $headrow = fgetcsv($ReadHandle, $length, $delimiter, $enclosure); } while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { if ($csvhead === true) { foreach ($headrow as $key=>$heading) { $row[$heading] = (isset($line[$key])) ? $line[$key] : ''; } $csvdata[] = $row; } else { $csvdata[] = $line; } } fclose($ReadHandle); return $csvdata; } // ----------------------------------------------------------- function show_testdata($filename, $details=0) { $csvurl = $filename; $length = 0; $delimiter = ";"; $enclosure = "\""; $csvhead = true; $testdata = csv_to_array($csvurl,$length,$delimiter,$enclosure,$csvhead); $tanz = count($testdata); print "<h2>".$filename."</h2>\n"; print "<p>Anzahl: ".$tanz."</p>\n"; if ($details == 1) { print "<hr />\n"; print "<pre>\n"; print_r($testdata); print "</pre>\n"; print "<hr />\n"; } } // ----------------------------------------------------------- if ($csvheader === true) { $handle_kopf = @fopen($cachefile, "r"); $headrow = fgets($handle_kopf); fclose($handle_kopf); } else { $headrow = ''; } ## print "<pre>\n"; ## print_r($headrow); ## print "</pre>\n"; // ----------------------------------------------------------- if (!empty($_GET['id'])) { $file = fopen($cachefile, 'rt'); $filebase = 'data/_'.$listid.'_sub_%d.csv'; // Sub-File Dateiname // ------------------------------------------------------- ## $content = ''; // ---- Content mit CSV Kopfzeile (ab Datei Nr.2) if ($csvheader && $_GET['id'] != 1) { $content = $headrow; } else { $content = ''; } // ------------------------------------------------------- $nextfile = 1; if(isset($_GET['start']) && isset($_GET['id'])) { fseek($file, $_GET['start']); $nextfile = $_GET['id']; } // ------------------------------------------------------- $z=0; while(!feof($file)) { if ($csvheader === true && $nextfile != 1) { // ---- Länge mit Kopf-Zeile (ab Datei Nr.2) ## $golimit = ($limit + mb_strlen($headrow, 'utf8')); $gozeile = ($zeilen - 1); } else { ## $golimit = $limit; $gozeile = $zeilen; } $content .= fgets($file); $z++; ## if(mb_strlen($content, 'utf8') > $golimit) { if($z > $gozeile) { $filename = sprintf($filebase, $nextfile++); echo "<br />\n"; echo "<br />SUB-FILE: ".$filename."\n"; file_put_contents($filename, $content); $fsize = filesize($filename); $fsize_kb = round($fsize / 1024, 2); $fsize_mb = round($fsize / 1048576, 2); echo "<br />Size: ".$fsize." Byte --- ".$fsize_kb." KB --- ".$fsize_mb." MB \n"; if(!feof($file)) { $url2nextid = '' . $_SERVER['PHP_SELF'] . '?start=' . ftell($file) . '&id=' . $nextfile . ''; ## echo('<br /> NEXT: <a href="' . $url2nextid . '">continue ID:'.$nextfile.'</a>'."\n"); echo('<meta http-equiv="refresh" content="0.2; URL=' . $url2nextid . '">'."\n"); show_testdata($filename,'0'); // --- ohne Details, nur Anzahl der Zeilen ## show_testdata($filename,'1'); // --- mit Detail-Ausgabe der Daten ... langsamer!!! exit(); } } // --- Ende if LIMIT --- } // --- Ende while !feof --- if(feof($file)) { echo("<br /> Fertig ... Gesamt: <strong>".($nextfile-1)."</strong> Sub-Files erstellt. <a href=\"" . $_SERVER['PHP_SELF'] . "\">HOME</a>\n"); exit(); } fclose($file); // ------------------------------------------------------- echo "<br />\n"; echo "<br />\n"; echo "<br /> done \n"; echo "<br />\n"; } else { echo "<br />\n"; echo "<br /> START: <a href=\"" . $_SERVER['PHP_SELF'] . "?start=0&id=1\">continue ID:1</a>"."\n"; echo "<br />\n"; } echo "<br />\n"; echo "<br />\n"; echo "<br />\n"; // ------------------------------------------------------- ?>
und es funktioniert :)
aber vielleicht hat ja jemand noch Verbesserungs-Vorschläge oder findet einen Bug ?!
-
in: Datei ab bestimmter Zeile (mit LImit) auslesen
geschrieben von guteseiten
habe es ausprobiert,
bis z.B. 10 MB klappt es damit gut, aber ich brauche es bis ca. 37 MB (ja, ist viel)
damit kommt Fehler: Fatal error: Maximum execution time of 20 seconds exceeded
deshalb brauche ich was, das nach z.B. 8 MB die Seite neu aufruft (Meta-Refresh)
und ab dem letzten Dateizeiger aus vorherigem Lauf (ab Zeilen-Anfang) weiter macht
Problem ist auch noch, in jede Sub-Datei auch die CSV-Kopfzeile einzufügen
das habe das jetzt so gelöst:
$quelle = 'big_file.csv'; $csvheader = true; if ($csvheader && empty($headrow)) { $handle_kopf = @fopen($quelle, "r"); $headrow = fgets($handle_kopf); fclose($handle_kopf); } else { $headrow = ''; }
und mit der Kopf-Zeile ändert sich ja auch sie Länge von $content (ab Sub-Datei Nr. 2)
also dann in der while() Schleife so
ausserdem setze ich oben $nextfile = 1; ... damit die erste Datei die Nr: 1 hat (nicht 0)
$limit = (1024*500); // --- 500 KB $file = fopen($quelle, 'rt'); $filebase = 'file_%d.txt'; // Dateiname $nextfile = 1; $content = ''; echo "<ol>\n"; while(!feof($file)) { if ($csvheader && $nextfile != 1) { // ---- Länge mit Kopf-Zeile (ab Datei Nr.2) $golimit = ($limit + mb_strlen($headrow, 'utf8')); } else { $golimit = $limit; } $content .= fgets($file); if(mb_strlen($content, 'utf8') > $golimit) { $filename = sprintf($filebase, $nextfile++); echo " <li>SUB-FILE: ".$filename."</li>\n"; file_put_contents($filename, $content); // ---- Content mit CSV Kopfzeile (ab Datei Nr.2) if ($csvheader) { $content = $headrow; } else { $content = ''; } } } echo "</ol>\n";
Problem ist, wie ich das mit dem Dateizeiger hinbekomme,
um die 37 MB Datei in z.B. 37 Dateien a ca. 1 MB zu splitten (inkl. der Kopf-Zeile)
(oder 74 Dateien mit je ca. 500 KB)
Wenn ich die Quell-Datei von externem Server hole (http)
kann man da überhaupt den Dateizeiger setzen (fseek) ???
oder geht sowas dann besser mit curl
-
in: Datei ab bestimmter Zeile (mit LImit) auslesen
geschrieben von guteseiten
ja Danke
das ist auch gut und deutlich schlanker als meine bisherigen Versionen
ABER ... das Problem großer Dateien bleibt dabei bestehen, (Memory Limit)
weil durch while(!feof($file)) wird ja auch wieder immer die ganze Datei in einem Lauf behandelt
Daher nochmal genauere Beschreibung der Idee mit dem Datei-Zeiger setzen (fseek)
die Datei nicht im ganzen auszulesen, sondern (je Script-Lauf) nur Teile davon
und jeder Script-Lauf durch META-REFRESH neu starten, damit Script-Laufzeit ausreicht
nach dem öffnen den Dateizeiger setzen, z.B. bei 3000 Zeilen
Lauf 1: Dateizeiger an Beginn Zeile 1 setzen und bis Ende Zeile 1000 lesen
Lauf 2: Dateizeiger an Beginn Zeile 1001 setzen und bis Ende Zeile 2000 lesen
Lauf 3: Dateizeiger an Beginn Zeile 2001 setzen und bis Ende Zeile 3000 lesen
wenn ich die Script-Läufe mit header("Location:....") neu starte, dann kommt Laufzeit-Fehler
daher die Idee per META-REFRESH und GET-Werte den Script-Lauf neu starten
also wenn Limit erreicht, dann Wert von Zeiger ftell() und Wert neue Datei-Nummer
per GET übergeben (Seite neu laden mit Meta-Refresh)
damit im nächsten Script-Lauf direkt ab dem Zeiger (mit fseek) weiter gelesen werden kann
... $zeiger = ftell($file) wenn limit erreicht ... $zeiger übergabe (GET) ... lesen ab fseek($zeiger)
leider bekmme ich das nicht hin, die Datei-Zeiger sind immer falsch
?
PS:
Wenn die Quell-Datei in utf-8 ist, muss ich dann nicht Zeichen mit mb_strlen() zählen ?!
if( mb_strlen($content, 'utf8') > $limit ) { ...
$limit = 1024; ist doch 1 KB, oder ?! .. für 300 KB dann (1024*300) ??
-
in: mysql_fetch_object: Werte vor Ausgabe vergleichen
geschrieben von guteseiten
yorecords schrieb:
Ne, so funktioniert es 100%ig. Hab es mehrmals versucht und sehe kein Problem.
Aber Du bekommst so doch immer nur (!!!) die letzte Ausgabe / Zeile
wenn vorher in "Treffer" war, wird der wieder überschrieben .... ?!?!
ich denke immernoch das war wohl ein Zufalls-Treffer
dass zufälllig das letzte gefundene Ergebnis "gepasst" hat,
würde danach noch ein "nicht passendes" kommen, dann gehts schon nicht mehr
weil das vorher "passende" ja wieder überschrieben wird ....
Wenn Du prüfen willst, ob Spalte schonmal genau so belegt, gehts einfacher
für so ein Ergebnis bräuchtest Du gar nicht den String selber mit if in while prüfen
da geht es direkt in SQL wie hackyourlife es geschrieben hat
--- und dann "nur" prüfen, ob es überhaupt ein Ergebnis gibt.
Bsp:
Prüfen, ob die eMail-Adresse für neuer User schon von einem anderen User verwendet wird
// --- von User-Eingabe / Formular $neumail = mysql_real_escape_string($_POST['mail']); $sql = "SELECT id FROM userdata WHERE email = '".$neumail."' LIMIT 1"; $res = mysql_query($sql); if ( mysql_num_rows($res) == 1) { echo "<br />Die Email wird schon von einem anderen User verwendet ... zurück ... \n"; } else { echo "<br />OK ... die Email wird noch nicht verwendet (ist noch frei) ... weiter ... \n"; }
also nicht in if() den String prüfen, sondern ob SQL mind. 1 Ergebnis liefert
das ist einfacher (schneller) als die ganze Tabelle einzulesen und durchlaufen (while)
um zu Prüfen, ob in mind. 1er Zeile eine bestimmte Spalte einen bestimmten Wert hat.
geht also analog auch für Prüfung, ob Username schon existiert, etc.
... oder was hast Du sonst damit vor ??
hackyourlife schrieb:
Eventuell sollte yorecords nochmals beschreiben warum immer nur die letzte Zeile ausgegeben werden soll...
ich bitte auch darum :) mehr Input
und ich vermute mal, er will prüfen, ob der String schon im Feld vorhanden ist,
wie oben in meinem BSP die Email eines Users darf nur 1x in DB stehen
... dafür ist aber das mit "nur letzte Zeile" auch nicht geeignet .... !!
hackyourlife schrieb:
Auch wäre es interessant diese Pyramide zu sehen
ich vermute mal, er meint einfach die Aneinander-Reihung der Ergebnisse (Ausgaben) ohne Zeilenumbruch, zumindest passiert das wenn man bem dazu-schreiben der nächsten Ausgane keinen Zeilenumbruch einbaut. Aber scheinbar will er ja gar keine "Liste" sondern nur doe Prüfung ob String schon in DB (in Spalte), und je nacdem ob ja oder nein eine andere Ausgabe
... der Username ist noch frei ... oder .... der Username wird schon verwendet
bzw. siehe BSP mit email
-
in: Datei ab bestimmter Zeile (mit LImit) auslesen
geschrieben von guteseiten
kataloge schrieb:
aber wie gesagt vermute ich, dass dies bei sehr grossen Datein
wegen Memory-Limit oder Script-Laufzeit zu Problemen (Abbruch) kommt
Hallo, das Script funktioniert zwar (prinzipiell), aber nicht für gro0e Datei
ich habe genau das Problem, das du angesprochen hast
habe sogar unabhängig von Deiner Funktion ein sehr ähnlich arbeitendes Script geschrieben,
aber bei sehr großen CSV-Dateien bekomme ich immer Memory Error
Meine Version ist quasi das gleiche wie Deine Funktion: (nur nicht als Funktion)
<?php // --------------------------------------------------------- ini_set('display_errors','on'); error_reporting(E_ALL); header("Content-Type: text/html; charset=utf-8"); // ----------------------------------------------------------- $c_path = 'data'; // --- ohne Slash / am Ende $c_name = 'bestand2012'; $c_file = $c_path.'/_'.$c_name.'.csv'; // ------------- To-Do: Update CACHE --------------- $csvsource = $c_file; // --- Pfad und Dateiname der Quell-Datei $debuginfo = false; // --- Debug-Ausgabe on (true) oder off (false) $csvheader = true; // --- die CSV hat eine Kopfzeile mit Spalten-Namen $max_fsize = 50; // --- max. Anzahl Daten-Zeilen je Sub-Datei // ------------------------------------------------------------ $rnum = 0; // --- Zeilen Zähler $fnum = 0; // --- Datei Zähler $handle_read = @fopen($csvsource, "r"); // --- Quell-Datei zum Lesen öffnen ---- if ($handle_read) { if ($csvheader) { $headrow = fgets($handle_read); // --- Kopf-Zeile einlesen ---- } else { $headrow = ''; } // -------------------------------------------------- while (($buffer = fgets($handle_read)) !== false) { $rmax = ($rnum % $max_fsize); if ($rmax == 0) { // --- Start neue Sub-Datei $fnum++; // --- Datei Zähler if (isset($handle_write)) { fclose($handle_write); } // --- alte Sub-Datei schliessen $sub_file = $c_path.'/_'.$c_name.'_sub_'.$fnum.'.csv'; // --- Dateiname neue Sub-Datei $handle_write = @fopen($sub_file, "w+", 0666); // --- neue Sub-Datei erstellen echo "<br />NEW SUB FILE: <strong>".$sub_file."</strong>\n"; echo "<br />\n"; $entry = $headrow.$buffer; // --- erster Eintrag in neue Sub-Datei } else { $entry = $buffer; // --- weitere Zeile Eintrag in Sub-Datei } fwrite($handle_write,$entry); // --- neuer Eintrag in Sub-Datei schreiben ---- ######### DEBUG INFO ######### if ($debuginfo) { $inrow = ($rnum - ($fnum*$max_fsize) + $max_fsize); echo "<br />Sub ID Nummer: ".$fnum." \n"; echo "<br />Sub File-Name: ".$sub_file." \n"; echo "<br />Gesamt Zeilen: ".($rnum+1)." \n"; echo "<br />Interne Zeile: ".($inrow+1)." \n"; print "<pre style=\"margin:0px 0px 0px 10px; padding:6px; background:#DEDEDE;\">\n"; print_r($entry); print "</pre>\n"; } ######### $rnum++; // --- Zeilen Zähler } // -------------------------------------------------- if (!feof($handle_read)) { echo "<p>Fehler ... unerwartetes Ende</p>\n"; } fclose($handle_read); } else { echo "<p>Fehler ... kann Datei nicht lesen</p>\n"; } // -------------------------------------------------- fclose($handle_write); // --- letzte Sub-Datei schliessen ---- // -------------------------------------------------- echo "<br />\n"; echo "<br />\n"; echo "<br />Anzahl Sub-Files: ".$fnum."\n"; echo "<br />\n"; echo "<ol>\n"; for ($x=1; $x<=$fnum; $x++) { $sname = $c_path.'/_'.$c_name.'_sub_'.$x.'.csv'; echo "<li><a href=\"".$sname."\" target=\"_blank\">".$sname."</a></li>\n"; } echo "</ol>\n"; echo "<br />\n"; echo "<br />\n"; // --------------------------------------------------------- ?>
gibt es eine andere Möglichkeit, um eine große Datei in in mehrere kleinere Dateien aufzuteilen
aber nicht mitten in der Zeile abschneiden, sondern immer Zeilen "ganz" lassen ?
habe es mit Datei-Zeiger aisprobiert, so dass nach 100 KB eine neue Datei angelegt wird
(und aus der großen Datei jeweils dann wieder erst ab diesem Zeiger gelesen wird)
das geht zwar, aber so werden Zeilen "abgeschnitten" und ist daher für CSV nicht brauchbar
oder wie kann ich den Datei-Zeiger so setzen,
dass er alle (max.) 100 KB aber immer am (direkt nach) Zeilenumbruch gesetzt wird ?
geht das überhaupt? .. bzw. andere (Speicher-sparende) Methode,
um eine große Datei in mehrere kleine aufzuteilen, ohne Zeilen abzuschneiden ?
... jemand ne Idee ?
-
in: mysql_fetch_object: Werte vor Ausgabe vergleichen
geschrieben von guteseiten
so funktioniert es perfekt ???? ... kann so doch garnicht sein .... :xD
Wenn du $ausgabe = ''; innerhalb der while() Schleife als Leerstring neu definierst,
dann wird bei jedem Durchgang der Wert von $ausgabe ja wieder auf "Leerstring" gesetzt
und dadurch kommen am Ende bei $ausgabe nur die Inhalte der letzten $row (Zeile) an
meiner Meinung nach MUSS $ausgabe = ''; vor die while() Schleife als neu definiert werden
und innerhalb der while() Schleife dann nur noch dran-hängen, mit $ausgabe .= "......";
so wie Du es im letzten Beitrag geschrieben hast,
kann es nur ein Zufalls-Treffer gewesen sein, das es funktioniert hat
und um - wie Du es nennst - "Pyramide" zu verhindern,
kannst Du ja Zeilenumbruch vor / nach jeder Einzel-Ausgabe machen: <br/> \n
hier nochmal der Code mit <span> und CSS anstatt <font> TAG
und mit Zeilenumbruch, jedes Ergebnis ausgeben, nicht nur die "roten"
(sonst wäre das else { } in der if Bedingung ja Sinnlos)
$result = mysql_query('SELECT ...'); $ausgabe = ''; while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') { $ausgabe .= "<br/> JAAA <span style=\"color:red;\">".$row->Spalte."</span> \n"; } else { $ausgabe .= "<br/> NEIN <span style=\"color:#000000;\">".$row->Spalte."</span> \n"; } } echo $ausgabe;
Eine Alternative wäre noch, es als Liste <ul> ausgeben
$result = mysql_query('SELECT ...'); $ausgabe = '<ul>\n'; while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') { $ausgabe .= " <li style=\"color:red;\">".$row->Spalte."</li>\n"; } else { $ausgabe .= " <li style=\"color:#000000;\">".$row->Spalte."</li>\n"; } } $ausgabe = '</ul>\n'; echo $ausgabe;
PS: .... style="color:#000000;" ist schwarze Schrift ... black .... :)
-
in: mysql_fetch_object: Werte vor Ausgabe vergleichen
geschrieben von guteseiten
Hallo
doch das sollte gehen, aber ...
... Achtung, wenn du das in einer (while) Schleife machst
dann wird $ausgabe = "..."; immer wieder überschrieben
also kommt am Schluß nur das "letzte" Ergebnis raus
Du musst entweder in ein Array ablegen oder an $ausgabe String anhängen
damit jedes einzelne Ergebnis am Schluß verfügbar ist
und "nur Not" kannst Du den Objekt-Inhalt auch explizit als String umwandeln
mit (string) davor oder mit get_object_vars() aber das muss glaub garnicht sein
$sql = "SELECT ... ... "; $result = mysql_query($sql); while ($row = mysql_fetch_object($result)) { $present = (string)$row->Spalte; ## oder: ## $present = get_object_vars($row->Spalte); $suchstr = 'Das ist der String'; $ausgabe1 = ''; // ----- Ausgabe als String vorbereiten $ausgabe2 = array(); // ----- Ausgabe als Array vorbereiten if ( $present == $suchstr ) { // ---- an String anhängen $ausgabe1 .= "<br /> <font color='red'>".$present."</font> \n"; // ---- oder in Array einfügen $ausgabe2[] = "<font color='red'>".$present."</font>"; } else { $ausgabe1 .= "<br /> <i>".$present."</i> \n"; $ausgabe2[] = "<i>".$present."</i>"; } }
also entweder mit $ausgabe1 als String oder mit $ausgabe2 als Array
(beides macht keinen Sinn, hier nur als BSP)
Dann kannst Du $ausgabe1 (als String) direkt per echo ausgeben
... und für $ausgabe2 (als Array) dann z.B. in einer foreach-Schleife:
foreach ($ausgabe2 as $item) { echo "<br />".$item."\n"; }
das Problem bei Deinem Code ist, das $ausgabe immer wieder überschrieben wird
und daruch kommt immer nur die letzte $row in $ausgabe an ...
... daher .... entweder je $row an String hinten-dran-hängen mit .= oder in ein Array ablegen
-
in: XML zu Objekt: Fehler wegen Wort item in Element ?
geschrieben von guteseiten
trueweb schrieb:
$myitem ist hier nicht der Inhalt von $myitem, sondern das Objekt "myitem"
das ist schon klar, deshalb ja auch print_r($myitem);
Wie ich (grundsätzlich) auf die einzelnen Inhalte komme ist nicht das Problen
das problem ist, das ich auf das übergeordnete Objekt garnicht zugreifen kann,
weil der Element-Name in XML (bzw. dann der Objekt-Name) ein - (Minus) Zeichen entält ... inhalt-item
hackyourlife schrieb:
Seit wann sind denn Minus-Zeichen in Variablennamen erlaubt?
also liegt's am - (Minus Zeichen) ...nicht am Wort item (könnte ja ein reserviertes Wort sein)
deshalb "denkt " PHP ja auch, das item eine Konstante wäre
(und will das von $res_obj->inhalt abziehen ... "Minus" rechnen (Subtraktion)
also muss die XML gleich so erstellt erden, das kein Element-Name mit Minus-Zeichen ist
... beste Alternative wäre wohl _ Unterstrich
-
in: XML zu Objekt: Fehler wegen Wort item in Element ?
geschrieben von guteseiten
Hallo
ich lese mit simplexml_load_file eine XML-Datei aus
die XML Datei "meinedaten.xml" sieht (vom Prinzip her) so aus:
<?xml version="1.0" encoding="utf-8"?> <inhalte> <inhalt-item> <id>123</id> <name>Blablabla</name> <info>Text text Text text ...</info> </inhalt-item> <inhalt-item> <id>456</id> <name>Hullahup</name> <info>Oink Oink Eeek Eeek ...</info> </inhalt-item> </inhalte>
PHP-Code:
$source = 'meinedaten.xml'; $res_obj = simplexml_load_file($source); print "<pre>\n"; print_r($res_obj); print "</pre>\n";
und als Ausgabe (Objekt) bekomme ich dann:
SimpleXMLElement Object ( [inhalt-item] => Array ( [0] => SimpleXMLElement Object ( [id] => 123 [name] => Blablabla [info] => Text text Text text ... ) [1] => SimpleXMLElement Object ( [id] => 456 [name] => Hullahup [info] => Oink Oink Eeek Eeek ... ) } )
wenn ich jetzt nur auf das Array (innerhalb 'inhalt-item' Objekt) zugreifen will
$data_arr = $res_obj->inhalt-item;
... dann kommt als Fehlermeldung:
Notice: Use of undefined constant item - assumed 'item' in ....
und ich kann mir das Array (innerhalb des Haupt-Objekts) nicht in eine Variable ablegen
diese Fehlermeldung kommt auch,
wenn ich in einer foreach-Schleife auf das Array zugreifen will:
foreach ($res_obj->inhalt-item as $myitem) { print "<pre>\n"; print_r($myitem); print "</pre>\n"; }
darf also in der XML das Element für einzelne Items nicht das Wort "item" enthalten ??
oder liegt es am Minus-Zeichen ?
würde es funktionieren, wenn ohne das Minus-Zeichen, also <inhaltitem>...</inhaltitem> ???
würde es funktionieren, wenn anstatt Minus Unterstrich, also <inhalt_item>...</inhalt_item> ???
... oder was läuft hier falsch ???
PLS HELP .. Danke!