[PHP] auslesen von txt - find den fehler einfach nich

powercat

Cadet 2nd Year
Registriert
Okt. 2004
Beiträge
17
hi leute, bin noch ein relativer newbie in sachen php und in meinem script is bestimmt nur irgendwo ein simpler fehler drin.

ich will den inhalt einer textdatei in spalten ausgeben. mittlerweile bekomme ich schon keine fehlermeldungen mehr *puh* und meine tabelle wird erstellt. aber meine txt-datei wird nich ausgegeben.... ich hab mich schon totgesucht. und langsam verzweifel ich....

ich hoffe, jemand von euch hat die springende idee.

hier der code:

PHP:
$eintrag=file("daten/angebote.txt");
$temp=count($eintrag);

function show_angebot()
{
print "
<center>
	<img src=\"grafik/verfug.gif\" width=\"312\" height=\"35\">
</center>
<br><br>
 <table cellpadding=\"2\" cellspacing=\"0\" align=\"center\">
	<tr>
		<td width=\"20%\" align=\"center\"><code class=\"head\">Produkt</code></td>
		<td width=\"63%\" align=\"center\"><code class=\"head\">Beschreibung</code></td>
		<td width=\"7%\" align=\"center\"><code class=\"head\">Preis</code></td>
		<td width=\"10%\" align=\"center\"><code class=\"head\">Ansicht</code></td>
	</tr>
	<tr>";

$element=explode("#",$eintrag[$i]);
foreach($element as $value)
{
	{
			echo "<td>".$value."</td>";
	}
}
echo "</tr></table>";
} #EOF show_angebot()

schon mal danke im voraus - pc
 
Zuletzt bearbeitet von einem Moderator: (Bitte Foren-Tags nutzen!)
ähm sorry, doch ja in ner index.php.
mir gehts ja hier nur darum, dass die datei (die ich angegeben habe) die textdatei nicht ausgibt, deswegen hatte ich diese info unterschlagen - sorry
 
Wo wird $i gesetzt? $i ist hier doch immer 0. Warum übergibst du nicht die Zeile als Parameter an die Funktion?
 
jetzt versteh ich nur bahnhof muss ich ehrlich gestehen (doofer newbie). kannst du mir das ein bißchen näher erläutern *bitte*
 
Das könnte dann so aussehen.

$eintrag=file("angebote.txt");
$i=0;
while($i<count($eintrag)){
show_angebot($eintrag[$i]);
$i++;
}

function show_angebot($zeile)
{
print "
<center>
<img src=\"grafik/verfug.gif\" width=\"312\" height=\"35\">
</center>
<br><br>
<table cellpadding=\"2\" cellspacing=\"0\" align=\"center\">
<tr>
<td width=\"20%\" align=\"center\"><code class=\"head\">Produkt</code></td>
<td width=\"63%\" align=\"center\"><code class=\"head\">Beschreibung</code></td>
<td width=\"7%\" align=\"center\"><code class=\"head\">Preis</code></td>
<td width=\"10%\" align=\"center\"><code class=\"head\">Ansicht</code></td>
</tr>
<tr>";

$element=explode("#",$zeile);
foreach($element as $value)
{
{
echo "<td>".$value."</td>";
}
}
echo "</tr></table>";
} #EOF show_angebot()

ich habs hier getestet und es hat die Werte aus einer Datei mit folgendem Aufbau ausgelesen.

Wert1#Wert2#Wert3#
Wert1#Wert2#Wert3#
Wert1#Wert2#Wert3#
 
Zuletzt bearbeitet:
powercat schrieb:
jetzt versteh ich nur bahnhof muss ich ehrlich gestehen (doofer newbie). kannst du mir das ein bißchen näher erläutern *bitte*

Du benutzt in der Zeile
PHP:
$element=explode("#",$eintrag[$i]);
eine Variable namens $i.

Diese Variable wird aber in der gesamten Funktion weder lokal noch global erstellt.
Damit ist $i an dieser Stelle immer nicht vorhanden und hat immer den gleichen Wert.

Wenn du mit allen "einträgen" arbeiten willst, musst du $i einen wert zuweisen, je nachdem, mit welchem "$eintrag" du arbeiten willst. Oder halt eine Zählschleife benutzen, in der du alle "einträge" durchzählst.

"$eintrag" müsstest du übrigens auch noch "global" machen.
 
also ich hab das jetzt einfach erst mal probiert, obwohl ich mir immer noch nich soo ganz sicher bin, wie ich das am besten verstehen soll *puh* haken ist..... jetzt gibt er mir die tabellenüberschriften immer wieder erneut aus (so als ob in jeder zweiten zeile die überschrift stehen müsste). meine textdatei liest er immer noch nicht ein :o((

die textdatei besteht ja aus mehreren zeilen (anzahl unbestimmt) mit verschiedenen elementen, die in 4 spalten geteilt werden sollen (produkt, beschreibung, preis und ansicht) diese elemente sind durch # getrennt. die überschrift soll natürlich nur einmal erscheinen.

übrigens habe ich eine geschweifte klammer zuviel in meinem code entdeckt...

soo. und nu? *lächel*

ich bastel nebenbei auch weiter - keine frage :o)
 
@pcw: ok - heißt, ich weise der $i erst mal den wert 0 zu (weil 0 ja der erste inhalt von einem array sein soll) und bastel dann direkt vor foreach die erhöhung für diese variable? liest foreach aber nicht alle teile eines arrays aus?

und $eintrag deklarier ich einfach vor der funktion als global

hab ich das jetzt so erst mal richtig verstanden?
 
Hier das Ganze noch mal ohne Funktion, so das der Kopf nur einmal ausgegeben wird.

PHP:
$eintrag=file("angebote.txt");
print "
<center>
    <img src=\"grafik/verfug.gif\" width=\"312\" height=\"35\">
</center>
<br><br>
<table cellpadding=\"2\" cellspacing=\"0\" align=\"center\">
    <tr>
        <td width=\"20%\" align=\"center\"><code class=\"head\">Produkt</code></td>
        <td width=\"63%\" align=\"center\"><code class=\"head\">Beschreibung</code></td>
        <td width=\"7%\" align=\"center\"><code class=\"head\">Preis</code></td>
        <td width=\"10%\" align=\"center\"><code class=\"head\">Ansicht</code></td>
    </tr>
    <tr>";
$i=0;
while($i<count($eintrag)){
	$element=explode("#",$eintrag[$i]);
	print "<tr>";
	foreach($element as $value)
	{
		print "<td>".$value."</td>";
	}
	print "</tr>";
	$i++;
}
print "</table>";

$i ist die Zählvariable mit der du die Zeilen hoch zählst bis du den Wert von count($eintrag) erreicht hast. $eintrag[$i] enthält dann die jeweilige Zeile die du durch explode splittest.
 
Zuletzt bearbeitet von einem Moderator:
@mrichter: werde es gleich mal ausprobieren. habe unterdessen aber mal gebastelt

PHP:
global $eintrag;
global $i;

function show_angebot()
{
print "
<center>
	<img src=\"grafik/verfug.gif\" width=\"312\" height=\"35\">
</center>
<br><br>
 <table cellpadding=\"2\" cellspacing=\"0\" align=\"center\">
	<tr>
		<td width=\"20%\" align=\"center\"><code class=\"head\">Produkt</code></td>
		<td width=\"63%\" align=\"center\"><code class=\"head\">Beschreibung</code></td>
		<td width=\"7%\" align=\"center\"><code class=\"head\">Preis</code></td>
		<td width=\"10%\" align=\"center\"><code class=\"head\">Ansicht</code></td>
	</tr>
	<tr>";
	
$eintrag=file("daten/angebote.txt");
$temp=count($eintrag);
$i= 0;
$element=explode("#",$eintrag[$i]);

foreach($element as $value)
{
			echo "<td>".$value[$i]."</td>";
}
$i++;
echo "</tr></table>";
} #EOF show_angebot()

und erhalte nun das ergebnis, dass mir eine tabelle mit einer zeile generiert wird, in dessen zellen die werte: f, a, 6, 0, 0 stehen..... ??? würdet ihr vor mir sitzen, ihr würdet dieses irsinnig große fragezeichen über meinem haupt schweben sehen :o)
 
Code unten... Meine Änderungen:
-print gegen "normales HTML getauscht"
-$eintrag global gemacht
-foreach für $eintrag (zum durchgehen aller "einträge"
-for für die 4 Spalten (damit imemr alle 4 Spalten geschrieben werden; notfalls halt leer)

Vorschlag:
Tausch die "#" als Trennzeichen gegen "Tabulatoren". Dann hast du ein Format, was von nahezu allen Datenbanksystemen unterstützt wird.

Testen ging leider ned. hab grad kein Webserver hier...

PHP:
<?php
$eintrag=file("daten/angebote.txt"); 
$temp=count($eintrag);

function show_angebot()
{
    global $eintrag
?>
<center> 
    <img src=\"grafik/verfug.gif\" width=\"312\" height=\"35\"> 
</center> 
<br><br> 
<table cellpadding=\"2\" cellspacing=\"0\" align=\"center\"> 
    <tr> 
        <td width=\"20%\" align=\"center\"><code class=\"head\">Produkt</code></td> 
        <td width=\"63%\" align=\"center\"><code class=\"head\">Beschreibung</code></td> 
        <td width=\"7%\" align=\"center\"><code class=\"head\">Preis</code></td> 
        <td width=\"10%\" align=\"center\"><code class=\"head\">Ansicht</code></td> 
    </tr>
<?php
    foreach($eintrag as $value)
    {
        echo "<tr>";
        $element=explode("#",$value); 
        for($n=0;$n<4;$n++) 
        { 
            { 
                    echo "<td>";
                    if(isset($element[$n]))
                    {
                        echo $element[$n];
                    }
                    else
                    {
                        echo "&nbsp;";
                    }
                    echo "</td>"; 
            } 
        }
        echo "</tr>";
    }
  echo "</table>";
}
?>

edit: oops, ich sollte die <table> natürlich am Ende auch wieder schließen ;)
 
Zuletzt bearbeitet:
@pcw: also wenn ich mal deinen code verwende, dann ruft er mir aus der index meine seite nicht mehr auf, die ja eingebunden wird über show_angebot

is doch zum verrückt werden.... oder?
 
powercat schrieb:
@pcw: also wenn ich mal deinen code verwende, dann ruft er mir aus der index meine seite nicht mehr auf, die ja eingebunden wird über show_angebot

is doch zum verrückt werden.... oder?

Wie gesagt ich kann hier nicht testen.

Würdest du mir mal den gefallen tun und (sowohl im Code, als auch in der Datei) dein "Trennzeichen" in chr(9) zu ändern und es nochmal versuchen?
 
wenn du mir noch schnell verrätst, was die chr(9) bedeutet sofort und gerne *lächel*
 
ich glaub, ich habs schon begriffen *heue etwas langsamer*

also - jetzt gibt er mir das ganze aus..... zwar noch völlig chaotisch - aber er gibts aus :o)))) *freu*

kannst du mir noch erläutern, was wir da jetzt genau drinstehen haben? weil ich will ja nich nur einfach was reinschreiben, sondern es auch verstehen
 
powercat schrieb:
wenn du mir noch schnell verrätst, was die chr(9) bedeutet sofort und gerne *lächel*
wenn ich mich Recht erinner, ist 9 der ASCII-Code für das Tab-Zeichen. mit chr() bzw bei php könnte es auch char() sein, kannst du die Zahl 9 in das Zeichen umwandeln, dessen ASCII-Code diese Zahl darstellt.

Für deine Datei benutzt du natürlich praktischer weise dte Tab-taste (über Capslock) und schreibst nicht immer ALT+9 ;)

^^ich hatte übrigens vorhin beim ersten echo "<tr>"; das "; vergessen *g* füg das mal bei dir ein.
 
oh man... ich unwissende...
ich muss sagen, das ist ja das erste prob, dass ich in diesem forum gepostet habe. aber ich bin super dankbar :o))
also es funktioniert. ohne dich hätte ichs nich hingekriegt :o)) schon viiiel wert. ich mach mich jetzt erst mal an die formatierung und evtl. noch das reinbasteln der ggf-bilder.... *smile* und guck nachher mal, ob du geantwortet hast. aber zuerst pack ich jetzt mal ein und fahr zum essen...
danke - danke - danke - danke!

seh grad, du lernst ja auch fisi :o) - ich muss erst mal los, bis später dann :o) lang kanns ja nich dauern, bis ich wieder verzweifel... *lol*
 
powercat schrieb:
oh man... ich unwissende...
ich muss sagen, das ist ja das erste prob, dass ich in diesem forum gepostet habe. aber ich bin super dankbar :o))
also es funktioniert. ohne dich hätte ichs nich hingekriegt :o)) schon viiiel wert. ich mach mich jetzt erst mal an die formatierung und evtl. noch das reinbasteln der ggf-bilder.... *smile* und guck nachher mal, ob du geantwortet hast. aber zuerst pack ich jetzt mal ein und fahr zum essen...
danke - danke - danke - danke!

seh grad, du lernst ja auch fisi :o) - ich muss erst mal los, bis später dann :o) lang kanns ja nich dauern, bis ich wieder verzweifel... *lol*

löl, inzwischen lern ich FiAe ;)

Aber schön, dass es jetzt geht und sorry nochmal für den dummen Fehler *gg*
 
guten morgen :)
es funzt immer noch *freu* und ich kann dich auch gleich mit der nächsten hürde belästigen.... hab fleißig gebastelt und mir machts immer mehr spass - auch wenn ich noch regelmäßig verzweifel. aber wenn ich so weitermache, dann sollte es kein problem sein immer mehr dazu zu lernen :)

ich poste mal den kompletten code:

PHP:
<?php 
$eintrag=file("daten/angebote.txt"); 
$temp=count($eintrag); 

function show_angebot() 
{ 
    global $eintrag 
?> 
<center> 
    <img src="grafik/verfug.gif" width="312" height="35"> 
</center> 
<br><br> 
<table cellpadding="2" cellspacing="0" align="center"  width="780" border="1"> 
    <tr> 
        <td width="130" align="center"><code class="head">Produkt</code></td> 
        <td align="center"><code class="head">Beschreibung</code></td> 
        <td width="50" align="center"><code class="head">Preis</code></td> 
        <td width="100" align="center"><code class="head">Ansicht</code></td> 
    </tr> 
<?php 
    
foreach($eintrag as $value) 
    { 
        echo "<tr>"; 
        $element=explode("#",$value); 
        for($n=0;$n<3;$n++) 
        { 
			echo "<td valign=\"top\">"; 
            if(isset($element[$n])) 
            { 
            	echo $element[$n]; 
            } 
            else 
            { 
              	echo "&nbsp;"; 
            } 
                echo "</td>"; 
        } 
		#spalte für bilder definieren mit if abfrage....
		if(isset($element[4]))
		{
			echo "<td><a href=$element[5].jpg><img src=$element[4].jpg></a></td>";

		}
		else
		{
			echo "kein Bild verfügbar";
		}
		#versuche zuende			
	}
  		echo "</tr></table>"; 
}
?>

jetzt siehste erst mal, was ich bisher schon umgebastelt habe....

stehe nun vor folgendem problem: in spalte 4 soll (wenn ein eintrag erfolgt ist) entsprechend dem dateinamen ein link und ein vorschaubild gezeigt werden. beide liegen dann entsprechend vor. nur wird mir kein bildname übergeben. mmmh

übrigens funktioniert das ganze jetzt sowohl mit tabs als auch mit der #. demjenigen, der die txt-datei ändern muss, ist die # lieber.... aber wie gesagt, es funzt ja mit beiden.

so.... kreativer vorschlag? *smile* freu mich schon

du lernst fiae? wieso nicht mehr fisi? oder jetzt noch im anschluss. ich bin in 8 monaten fertig. wir haben ja hier ne verkürzte ausbildung von 21 monaten. na mal sehen, was das so wird.
ps: und das mit dem fehler vergiß mal schnell - jeder macht fehler
 
Zurück
Oben