[Beginner] PHP Script Problem

Xypro

Neu angemeldet
Registriert
15 Juli 2013
Beiträge
341
Ort
127.0.0.2 !!
Hallo zusammen,

ich versuche gerade bisschen mit php zu basteln und komme - bei einem wahrscheinlich kleinem Anfängerproblem - nicht weiter:

Ich habe eine txt Datei "produktliste.txt":
[src=php]10001|rot
10002|rot
10003|gelb
10004|gelb[/src]

und dann folgenden php Code:
[src=php]<?php
$produktnr = $_POST["prod_nr"];

$log = 0;
$produktdatei = fopen ("produktliste.txt","r");
while (!feof($produktdatei))
{
$zeile = fgets($produktdatei,500);
$produktarray = explode("|", $zeile);

if ($produktarray[0]==$produktnr and $produktarray[1]=="rot"){
echo "Rot!";
$log = 1;
} elseif ($produktarray[0]==$produktnr and $produktarray[1]=="gelb"){
echo "Gelb!";
$log = 2;
}
}
fclose($produktdatei);

if ($log==0)
{
echo "Grün!";
}
?>[/src]

Egal welche Eingabe ich im Vorgeschalteten Formular mache - als Ergebnis kommt immer "Grün!" heraus.
Die Weitergabe des Formulars habe ich schon geprüft "$produktnr = $_POST["prod_nr"];" funktioniert korrekt.

Sinnigkeit des ganzen sei dahingestellt - ist einfach eine Spielerei mit Code.

Schonmal Danke vorab!
 
Und was soll der Code tun?

Aus deinem Post kann man jetzt mutmaßen das es in einigen Eingabefällen wohl nicht "Grün" ausspucken soll, aber das kann man auch deutlich einfacher bewerkstelligen.
[src=php]if($input != "green")
{
die("Definetly not green!");
}[/src]
:D

Generell:
Verzichte auf Steinzeitfunktionen wenn du keinen trifftigen Grund für ihren Einsatz hast. Es gibt Tausend einfachere Wege mit Dateien zu arbeiten wenns schon unbedingt eine Datei sein muss.

In deinem Fall wäre file() vielleicht angebracht.
 
Offenbar willst du es nicht verstehen. Denn exakt wegen diesem Satz habe ich dir sogar noch ein Beispiel gegeben.

Wenn du keine Hilfe willst, dann frag nicht. Aber wenn dir einer helfen soll muss zumindest das Ziel klar sein.
 
Hast du dich schonmal gefragt woher ein Texteditor eigentlich weiss, wo er einen Zeilenumbruch zu machen hat und wo nicht?

Um zu speichern, wo eine neue Zeile beginnt werden neben dem eigentlichen Text zudem sogenannte Steuerzeichen eingefügt, vielleicht hast du sowas schonmal in Form einer Escape-Sequenz (Bspw. \n) gesehen:

[src=php]echo "Eine neuer Absatz\n"[/src]

Dein Script liest diese Steuerzeichen mit aus, deswegen sieht deine Abfrage für PHP etwa so aus:

[src=php]if("rot\r\n" == "rot") { ... // false[/src]

Mit der PHP-Funktion kannst du solche Steuerzeichen rausfiltern.


Update
Gut, du hast die Lösung selbst gefunden, aber hier nochmal die Erklärung.
 
  • Thread Starter Thread Starter
  • #6
@Alter_Bekannter

Dass man die Sinnigkeit dahinter nicht versteht war mir klar. Aber ich wollte nicht wissen auf welch anderem Weg ich zum gleichen Ergebnis komme, sondern wo der Fehler in dem gelisteten Code ist. Hätte ich an der Stelle mehr verdeutlichen sollen als nur den Hinweis, dass die Sinnigkeit zu vernachlässigen sein. Bin dir für deinen Hinweis auf file() trotzdem dankbar!

@ sars
Ja weiß ich... eigentlich... *peinlich* aber manchmal vergisst man das Offensichtliche ;)
Das meinte ich auch, dass sich irgendwo ein "Anfängerfehler" eingeschlichen hat *g*

Danke!
 
Noch mal in aller Deutlichkeit: Die Sinnigkeit ist mir Scheissegal.

Aber ohne Zielvorgabe gibts auch keine Definition von "Fehler".

In der alten Weisheit das man erstmal sein Ziel kenne muss ist durchaus was dran. Da scheitern überraschend viele.
 
  • Thread Starter Thread Starter
  • #8
Hast ja Recht, ich habe nicht explizit geschrieben "Warum zeigt er mir 'Grün!' an wenn ich '10001' eingebe statt dem erwarteten 'Rot!'. Wo ist der Fehler im Code?"
 
Nicht ganz, an der Sache mit der Zieldefinition müssen wir noch arbeiten. Aber ich denke es geht in die richtige Richtung.
Die Tatsache das du es alleine geschafft hast deutet ja auch darauf hin.

DIe Zeildefinition wäre in deinem Fall wohl:
Herauszufinden welche Farbe das Produkt mit ID "X" hat.

Um die Problematik näher zu beleuchten nenne ich jetzt mal noch ein weiteres Beispiel das du erst mit Post #6 Andeutungsweise ausgeschlossen hast.
Nämlich den Fall das du versucht hast quasi eine eigene Dateibearbeitungsbibliothek zu erstellen. Nur eine der Milliarden von Möglichkeiten die einem
dazu spontan einfallen könnten. Im Brainstorming (äquivalent zu Forum) lässt sich sowas dann leicht bis zur Unendlichkeit verkomplizieren.
Je nachdem auf welche Ideen man da noch kommt weshalb du eine eigene Bibliothek möchtest. Geraten würde ich sagen du hast ganz erfolgreich ein
uraltes Tutorial durchgearbeitet richtig?

Daher würde ich Grundsätzlich dazu raten die verwendeten Funktionen hier: gegen zu checken
Denn da wäre schon der Verweis auf file() gewesen. Dessen Seite wiederum die Verwendung von trim() empfiehlt. Denn in die "Falle" rennen die meisten
mehr oder weniger häufig, das gehört echt zu den Dingen die nahezu jeden Programmieranfänger mehr oder weniger lang beschäftigen.
 
Eigentlich wird ja schon zu fopen alles in der Doku gesagt:

Hinweis:

Verschiedene Betriebssysteme haben unterschiedliche Zeilenende Konventionen. Wenn sie eine Text Datei schreiben und einen Zeilenumbruch einfügen möchten, müssen sie das/die korrekte👎 Zeilenende Zeichen für ihr Betriebssystem nutzen. Unix basierte Systeme nutzen \n als Zeilenende Zeichen, Windows basierte Systeme nutzen \r\n als Zeilenende Zeichen und Macintosh basierte Systeme nutzen \r als Zeilenende Zeichen.

Wenn sie die falschen Zeilenende Zeichen beim Schreiben ihrer Dateien nutzen, kann es sein, dass andere Anwendungen, die diese Dateien öffnen, "seltsam aussehen".

Auch wenn das mit dem "seltsam aussehen" genau meine Redewendung ist, hätte man es in der Doku natürlich spezifizieren können/sollen.
 
Ein reines \n reicht Windows allerdings Erfahrungsgemäß auch.

So einfach ist das also nicht ganz, ich würde lieber bei trim() bleiben.
 
Zurück
Oben