die array_unshift-Funktion hab ich mir angesehen, user comments übrigens auch, jetzt sogar zum zweiten Mal. Da habe ich aber nichts besonderes entdeckt.
Auf http://www.php.net/manual/de/function.array-unshift.php steht als Syntax:
int array_unshift ( array array, mixed var [, mixed ...])
Das "int" am Anfang mag etwas unscheinbar sein, deutlicher wird's in der Beschreibung:
Diese Funktion gibt die neue Anzahl der in array enthaltenen
Elemente zurück.
Vergleiche das mit der Ausgabe Deines echo-Befehls. Er sagt "1" - und genau das ist passiert, array_unshift() hat "1" Element Deinem Feld hinzugefügt. Diesen Rückgabewert "1" hast Du der Variable zugewiesen, in der eigentlich Dein Feld steht - etwas ungeschickt, wenn man das Feld respektive die Variable noch benötigt :)
Die Warnung von implode() hat hier ihre Ursache. implode() möchte ein Feld als Parameter, Du gibst ihm eine Zahl.
Die file()-sache hatte ich aus einem Buch, über dessen Unzulänglichkeit ich mich aber inzwischen schon mehrfach gewundert hab.
Nun, auf http://www.php.net/manual/de/function.file.php steht
file -- Liest eine Datei komplett in ein Array
Vergleiche auch das mit der Ausgabe Deines echo-Befehls. echo kann mit Feldern ("Arrays") nichts anfangen, deshalb gibt er nur den hilflosen Text "Array" aus.
Wie man Felder zeilenweise ausgibt, findest Du als erstes Beispiel auf obiger Anleitungsseite (ich vermute mal, Du hast einfach die implode()-Zeile falsch positioniert).
Tipp am Rande: Felder lassen sich mit print_r() oder var_dump() zwecks Untersuchung ausgeben (eventuell in einen <pre>-Block einhüllen).
Optional kann der Parameter use_include_path benutzt und auf '1' gesetzt werden, wenn in dem include_path ebenfalls nach der Datei gesucht werden soll.
Aber ich denke mal, sowas brauche ich auch nicht?
Nein, wenn Deine Datei nicht in diesem zusätzlichen Pfad gesucht werden soll, brauchst Du das nicht.
Btw. was heißt Binary_safe?
In Bezug auf file() bedeutet das aller Wahrscheinlichkeit nach, daß die Funktion nicht über einige besondere Werte in Dateien stolpert. Ein Zeichensatz besteht nicht nur aus darstellbaren Buchstaben und Ziffern, sondern auch aus Steuerzeichen. Einige Bytewerte bedeuten beispielsweise "Gib ein A aus" oder "Gib die Ziffer 1 aus", andere "Beginne eine neue Zeile". file() benutzt letztere um die Zeilenenden zu erkennen, es gibt derer aber noch eine ganze Reihe mehr (siehe auch nächster Absatz).
Anmerkung: Jede Zeile in dem resultierenden Array enthält das Zeilenende ('\0'), weshalb Sie trim() verwenden müssen, falls Sie dieses Zeichen nicht vorhanden sein soll.
Jedes Zeichen hat, wie Du sicher weißt, einen numerischen Wert, in der Regel im Bereich von 0 bis 255. Mit dem Rückstrich kannst Du diesen Wert unter anderem direkt angeben; bei "\0" würde also ein einzelnes Byte mit dem Wert Null herauskommen, ein Zeichen, für das es nirgends eine Taste gibt und die Rückstrichgeschichte also unerlässlich ist.
Nullbytes stellen nebenbei bemerkt häufig das Ende einer Zeichenkette im Speicher dar. PHP benutzt AFAIK die andere Möglichkeit, es merkt sich einfach die Länge (weshalb file() sich an Nullbytes auch nicht stören sollte).
Zum Thema Rückstrich siehe auch http://www.php.net/manual/de/language.types.string.php.
Was das else angeht: Gib vor den jeweiligen if-Zeilen Deine Bedingungen 1:1 mit var_dump() aus.
Damit werd ich mich nu beschäftigen, aber auf Anhieb verstehen muss ich es nicht, oder?
Doch, deshalb solltest Du es ja machen :) Es ging mir lediglich darum, daß Du bei der Konstruktion
if (a==1)
blabla();
nicht einfach sagst "Ich habe 20 Zeilen höher a auf 1 gesetzt, also muß diese if-Bedingung funktionieren und blabla() ausführen.". Sowas nennt man trügersiche Sicherheit, und die hat schon so manchen zur Verzweiflung gebracht (bzw. die übersehene Anweisung "a++;" drei Zeilen über dem if).
Deshalb sollte man bei unerklärlichem Programmverlauf besser direkt über den fraglichen Verzweigungen die Bedingung nochmal prüfen, zum Beispiel so:
var_dump(a);
if (a==1)
blabla();
Ich hatte Dich darauf hingewiesen, weil ich in Deinem Code nichts entdecken konnte.
Auf Variablen, die von außen kommen (wie Dein $submit zum Beispiel), solltest Du _niemals_ direkt zugreifen, sondern immer nur über die dafür vorgesehenen Felder $_GET, $_POST, $_COOKIE, etc (siehe auch php_info()).
Wieso? register_globals ist an
register_globals ist seit PHP 4.1 standardmäßig aus. Gut, bei Dir ist es eingeschaltet, entweder weil Du selbst Hand angelegt hast oder eine uralte PHP-Version benutzt (aktuell ist 4.3). Nichtsdestotrotz werden Basiseinstellungen eines Systems (wie register_globals) nicht ohne wichtigen Grund geändert, erst recht nicht, wenn Tausende von Programmen nach dieser Umstellung nicht mehr funktionieren und mühselig umgeschrieben werden müssen - ein Hinweis darauf, daß man auch selbst besser die Finger davon lassen sollte.
Kann natürlich sein, daß Du diesen Sachverhalt nicht kennst.
und bei so nem simplen Script spricht doch nix dagegen? Ok, sicherlich die Lehre vom reinen PHP oder so, aber das krieg ich ja doch nicht hin.
Das hat nichts mit irgendwelchen Ideologien zu tun. Der Grund ist zum ersten, daß man bei dieser Form des "Datenimports" nicht feststellen kann, woher die Daten kommen (URL, Formular, Cookie,..). Schlimmer noch, man kann nicht verhindern, daß jemand von außen über die URL in Skriptinterna eingreift. Konkrekt:
if (($nutzer=="willi") && ($passwort="wutz"))
$loginok=true;
[..]
if ($loginok)
sensible_daten_ausgeben($nutzer);
Diese Passwortprüfung ist nichts wert, weil man sie einfach umgehen kann, indem man das Skript mittels
http://example.com/login?loginok=true
aufruft. Ein zweites Beispiel wäre, daß zwar $loginok oben explizit auf false gesetzt wird, aber man kann immernoch fröhlich fremde Identitäten annehmen, indem statt "?loginok=true" "?nutzer=onkelhotte" an die Adresse gehängt wird. Man muß dazu lediglich eingeloggt sein, was nicht selten lediglich eine simple, ungeprüfte Registrierung erfordert.
Die Beispiele mögen simpel sein, aber das Spielchen lässt sich unendlich fortsetzen. Von daher ist es besser, register_globals nicht zu nutzen bzw. auszuschalten und sich gleich an die Nutzung der entsprechenden Felder zu gewöhnen.
Gruß,
soenk.e