kostenloser Webspace werbefrei: lima-city


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 :-o
    :wazzup:

    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 :wall:

    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!

Login zum Webhosting ohne Werbung!