PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variblen falsch übergeben


thorben
26.09.2004, 22:05:42
Guten Abend selfphp-forum.

Folgender Code scheint meiner Ansicht nach logisch, es wird aber etwas falsches ausgegeben:


...
$link = $zeile[5];

if(empty($link)) {
$linkshow = "<br><br>";
$link = "";
}
else {
$linkshow = "<br><br><b>Infos im Netz</b><div class='link'>&bull; $link</div>";
}
...


Es wird eine Variable geprüft, ob sie leer ist oder nicht, wenn Sie leer ist, sollen zwei <br>'s ausgegeben werden, wenn sie nicht leer ist soll HTML-Code ausgegeben werden.

Ich vermute bei der Übergabe der Variablen gerate ich ins Stolpern :-(
Wo liegt mein Fehler?
Gruß thorben.

xabbuh
26.09.2004, 22:08:07
Was wird dir denn ausgegeben? Welchen Wert hat die Variable $link. Wo kommt das Array $zeile her?

Usul
26.09.2004, 22:10:53
was wird denn falsches ausgegeben?

haste ueberprueft ob $zeile[5] noch richtig ist, oder ob da schon der fehler ist?

nebenbei:
wennde keine variablen ausgibts, dann benutz apostrophe anstelle von anfuehrungszeichen, das verschnellert die scriptausfuehrung, da der interpreter dann nicht nach variablen sucht.

thorben
26.09.2004, 22:12:13
Vollständig sieht der Code so aus:

<?php
$x = $_GET['sent'];
$news = file('data/news.csv'); //news.csv in Array packen
$zeile = $news[$_GET['sent']]; //Bestimmte Zeile raussuchen
$zeile = explode('|',$zeile); //Zeilen-Segmente trennen
$titel = $zeile[0];
$datum = $zeile[1];
$uhr = $zeile[2];
$kurztext = $zeile[3];
$langtext = $zeile[4];
$link = $zeile[5];

if(empty($link)) {
$linkshow = "<br><br>";
$link = "";
}
else {
$linkshow = "<br><br><b>Infos im Netz</b><div class='link'>&bull; $link</div>";
}

echo "<div class='headeinzel'>$titel</div><span class='datum'>$datum</span> | <span class='datum'>$uhr</span><hr size='1'>
<b>$kurztext</b><br><br>$langtext $linkshow
<div align='right'><a href='versenden.php?sent=$x'>Artikel versenden</a> |
<a href='print.php?sent=$x' onclick="neuesFenster(this.href,'name','500','600','no','no');return false">Artikel drucken</a><br><br><a href='javascript:history.back();'>zurück</a></div>";
?>


Das letzte Stück ist in meiner Datei definitiv leer - das habe ich 100x geprüft.

Ausgegeben wird mir ein leere Inhalt, allerdings nicht die zwei <br>'s, sondern "nichts" umgeben von der Klasse, die eigentlich gezogen werden soll, die Prüfung nicht wahr ist.

Gruß thorben.

xabbuh
26.09.2004, 22:17:47
Du weißt aber schon, dass <br> nicht direkt im Browser sondern nur im HTML-Quelltext sichtbar sind?

Usul
26.09.2004, 22:19:46
mach mal folgendes, und sag mir ob beim testen "BLA" oder "KEKS" ausgegeben wird.


if(empty($link)) {
$linkshow = "BLA";
$link = "";
}
else {
$linkshow = "KEKS";
}

echo $linkshow;

thorben
26.09.2004, 22:20:48
Ne, die <br>'s sind nicht darin enthalten, wenn die Prüfung wahr ergibt. Dafür ist das HTML drinne:
<br><br><b>Infos im Netz</b><div class='link'>&bull;
</div>

Gruß thorben.

Usul
26.09.2004, 22:22:57
mach bitte meinen oben genannten test.

zusaetzlich pruefe ob dein skript ueberhaupt aufgerufen wird, fallsde es nicht direkt aufrufst.

xabbuh
26.09.2004, 22:23:01
Kann dir da jetzt nicht ganz folgen, aber mach doch mal bitte das, was Usul geschrieben hat und schreibe die Ausgabe, die du erhälst, hier rein.

thorben
26.09.2004, 22:23:20
Es wird Keks ausgegeben - in beiden Fällen (wenn die Prüfung wahr ist und falsch)!

(Auf die Idee hätte ich eigentlich mal kommen müssen!)

Gruß thorben.

Usul
26.09.2004, 22:25:49
Original geschrieben von thorben
Es wird Keks ausgegeben - in beiden Fällen (wenn die Prüfung wahr ist und falsch)!


dann ist die pruefung nie wahr. also ist der fehler vorher.
Original geschrieben von thorben
(Auf die Idee hätte ich eigentlich mal kommen müssen!)
[/B]

ab jetzt kannste ja selbst debuggen. einfach immer die variablen schritt fuer schritt mit "echo" pruefen und schauen, obse das enthalten, was du erwartest. fehler koennen manchmal an den unerwartesten stellen sein.

thorben
26.09.2004, 22:33:38
Hmmm, vor der Prüfung (mit if) enthält die Variable genau das, was sie enthalten soll. Im Endeffekt war mir das vorher auch schon klar.

Es liegt also an der Prüfung, ist diese falsch aufgestellt?

xabbuh
26.09.2004, 22:34:11
Und was enthält die Variable?

thorben
26.09.2004, 22:35:57
Sie enthält im Falle, dass etwas vorhanden ist den Link (<a href...) oder wenn nichts vorhanden ist, enthält sie auch wirklich nichts, absolut kein Zeichen - so ist es ja auch richtig.

xabbuh
26.09.2004, 22:37:01
Nicht einmal ein Leerzeichen? Schreib doch am besten in der entsprechenden Zeile:


<?php
$link = trim($zeile[5]);
?>

Usul
26.09.2004, 22:37:51
mach mal for der if-abfrage folgendes und schreib uns dann die ausgabe:


echo 'I'.$link.'I';

if(empty($link)) {
...

Usul
26.09.2004, 22:41:04
hab noch mehr tolle tests:



if( !isset($link) )
{
echo 'Variable existiert nicht!';
}
if( is_null($link) )
{
echo 'Variable ist null.';
}

thorben
26.09.2004, 22:42:27
Also, wenn die Variable "voll" ist, dann wird der vollständig richtige Inhalt ausgegeben |xxx"Leerzeichen"|; ist die Variable leer, dann enthält sie lediglich: I"Leerzeichen"I.

Was macht das Leerzeichen da? Liegt es daran?

xabbuh
26.09.2004, 22:46:37
Vermutlich trägt dein Script in die news.csv ein Leerzeichen für die E-Mail ein, wenn diese nicht angegeben wird. Aus diesem Grund ist dann in dem Script, mit dem die News angezeigt werden sollen, die Variable $link auch nicht leer. Wie du das umgehen kannst, habe ich dir oben weiter ja schon geschrieben (trim() (http://www.php.net/trim))

Usul
26.09.2004, 22:47:01
ist die ausgabe wirklich zitat:
I"Leerzeichen"I ???


Ja dann liegts NATUERLICH an "Leerzeichen", was ja wohl ne folge von Zeichen ist, womit die Variable nicht leehr ist. Oder war die Ausgabe folgende
I I

?

thorben
26.09.2004, 22:47:12
Bei Deinem Beispiel Usul bekomme ich bei beiden Varianten (wahr & falsch) keine Ausgabe.

Usul
26.09.2004, 22:50:14
hab grade mal hier (http://de2.php.net/manual/en/function.empty.php) nachgelesen.

empty prueft wirklich fast alles:
"", 0, "0", NULL, FALSE, array(), var $var;

aber eben NICHT leerzeichen. :-)

thorben
26.09.2004, 22:55:02
Es klappt!

Meine Güte, jetzt habe ich aus 'ner Maus wieder einen Elefanten gemacht, dabei lag die Lösung ganz nah:

$link =trim($link);

Somit werden da die Leerzeichen entfernt, scheinbar hatte sich beim Schreiben in die Datei doch ein Leerzeichen verirrt, dagegen scheint man ja nichts tun zu können.

Danke für Eure Hilfe.
Gruß thorben.

Usul
26.09.2004, 22:58:14
und was haben wir gelernt?

echo ist der besto debugger.

thorben
26.09.2004, 22:59:37
Richtig, eigentlich habe ich das schon irgendwann mal gelernt, halt vergessen, weil ich einfach zu selten zu programmieren versuche - ich schreib's mir einfach an den Rand vom Monitor "Debbugen = Echo" :-)

meikel (†)
26.09.2004, 23:10:08
Original geschrieben von thorben
Es klappt!

Meine Güte, jetzt habe ich aus 'ner Maus wieder einen Elefanten gemacht, dabei lag die Lösung ganz nah:

$link =trim($link);

Somit werden da die Leerzeichen entfernt, scheinbar hatte sich beim Schreiben in die Datei doch ein Leerzeichen verirrt, dagegen scheint man ja nichts tun zu können.
Ich vermute mal ganz kühn, daß Du die Textdatei unter Windows getippert und nicht im ASCII Modus (FTP) auf den Webserver gepackt hast. Auch möglich, daß Du Dein Script unter Windows testest.

file() liest die Datei so ein, daß nach jedem n (LineFeed: UNIX Enter) ein neues Arrayelement erzeugt wird.

Windows erzeugt am Zeilenende allerdings ein rn (cariageReturn/lineFeed). Es dürfte also in jedem Arrayelement am Stringende ein r stehen. Deshalb scheitert empty(), weil der String nicht leer ist. trim() entfernt auch sowas:

Diese Funktion entfernt Leerraum am Anfang und Ende einer Zeichenkette. Der gekürzte String wird zurück gegeben. Als überflüssige Zeichen werden z.Zt. angesehen: "n", "r", "t", "v", "" und normale Leerzeichen.

thorben
26.09.2004, 23:12:19
Ja danke Meikel für die Info.

Gute Nacht.