Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

header probleme :-(

liebe php spezialisten,

ich glaube ich stell mich mal wieder ein bisschen doof an. aber wenn ihr mir helfen könnt währe es echt cool.

also ich will dass man automatisch auf 2 alternative seiten veitergeladen wird. sind die angaben im vorherigen forular gemacht richtig so geht es einfach weiter mit der aktuellen seite sind sie falsch soll man auf eine andere seite umgeleitet werden.
ich dachte das geht mit headern, aber entweder muss man da noch zusätzliches berücksichtigen wie z.b. irgendwelche sessionen? oder es fehlt noch irgendetwas anderes
also hier der Quellcode:

//die Variablen $Kunden_Nr und $Passwort sind aus dem formular aus der vorseite übergeben worden und kommen auch an
// Kunden_Nr ueberpruefen
$kunden_nr_check = mysql_query("SELECT * FROM Kunden WHERE Passwort='$Passwort' AND Kunden_Nr='$Kunden_Nr'");
if ($my_kunden = mysql_fetch_assoc($kunden_nr_check))
{
$kundenlogin=1;
}
else
{
$kundenlogin=0;
}

if($kundenlogin==0)
{
header("Location: http://www.irgendeinedns/kundenlogin.php";);
exit();
}

Hier gehts zum Orginal Eintrag "header probleme :-(" im Forum

Antworten

16.14. Warum soll ich nicht SELECT * schreiben?
http://www.dclp-faq.de/q/q-sql-select.html

Und was passiert? Schon mal echo's in das Script eigebaut. Ich darf mal wieder Oimel zitieren:

Richtig debuggen
1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
2. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
3. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
4. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
5. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
6. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
7. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

*** Nobody ***


2.

was gibt es dir als fehler aus???


3.

Lieber nobody,

sei mir nicht böse, aber deine altklugen sprüche kannst du dir sparen.
um das sql geht es hier gar nicht. Trotzdem ist in diesem fall das "* from" die richtige abfrage form kannst du mir glauben.

Was das debuggen angeht.. als ex Betatester der Blue Byte Software Inc. weiß ich wie man das macht.Ich bin im mom bei Schritt 6 wie du vielleicht bemerkt hast.
es gibt keine echo oder print befehle im sscript vor dem header().
Die krittische stelle ist der header(), an dieser Stelle bricht das script ab, wenn es zu dessen ausführung kommen soll.

Hallo reloader,

leider gibt es gar keine fehlermeldung, da der PHP-Server auf dem das script läuft, so eingestellt ist, das er keine Fehlermeldungen ausgibt sondern nur eine blanke seite :-(. Das kann/darf ich leider auch nicht ändern.

trozdem vielen dank für eure antwort falls euch noch was einfällt...nur her damit


4.

<zynisch>Also als "ex Betatester der Blue Byte Software Inc." - ist es da nicht frustrierend, wenn man bereits an den einfachsten Problemen scheitert. Mir wäre das peinlich als ehemaliger Entwickler der ProSieben Digital Media.</zynisch> ;)


5.

nö warum war ja kein entwickler sonder nur tester und hatte mit php nix am hut warum soll es mir peinlich sein probleme beim erlernen einer programmiersprache zu haben? ;-)


6.

Naja, dann solltest Du vielleicht lieber daran denken, dass Nobody seine Ratschläge durchaus ernst meint, denn von Deinem ersten Posting konnte man nicht erkennen, dass Du bereits irgendwelche Schritte unternommen hast, um den Fehler zu finden. Auch eine ordentliche Fehlerbeschreibung finde ich hier nach wie vor nicht. Sprich: Das bisherige Skript hat durchaus das Potential, etwas sinnvolles zu machen.


7.

ok ich nehm alles zurück, hab vielleicht ein bisschen überreagiert...sorry
aber wie ich bereits geschieben habe, eine fehlermeldung gibt es nicht, weil der server keine ausgibt.
was ich wissen müsste ist, was gibt es bei header() alles zu beachten. also ausser, dass es keine echo oder print befehle geben darf. muss header() in irgeneinem zusammenhang mit anderen header() oder anderen funktionen stehen? vielleicht gibt es mal ein wirklich einfaches beispiel wo das umleiten funktioniert? in den verschiedenen php.manualen oder anderen seiten zu diesem thema finde ich einfach nichts, was erklärt wo mein fehler liegt.
:-(


8.

Also wenn Dein Skript wirklich bis zum "header" richtig funktioniert (und das glaube ich im Moment ehrlich gesagt nicht), dann sollte es so, wie Du es geschrieben hast, auch funktionieren. Was bei "header" zu beachten ist, findet man weiterhin in der offiziellen PHP-Doku unter www.php.net ... allerdings glaube ich, dass der Fehler schon in dem Select vorher begründet ist bzw. den vom Formular übergebenen Variablen ... aber das hast Du ja natürlich durchs debuggen ausgeschlossen, nicht wahr?


9.

also ich sag mal so, ich kann mir die variablen korrekt ausgeben lassen. und wenn ich das header weg lasse und mir den inhalt des select befehls ausgeben lasse ist das auch alles ok.


10.

Die Ausgabe der Fehler/Warnmeldungen wird (teilweise) über PHP_INI_ALL Werte gesteuert, d.h. es muss nicht die server-Konfiguration geändert werden, sondern "nur" zum richtigen Zeitpunkt ini_set(...) aufgerufen und ausgeführt werden: bevor die Fehler auftreten - damit läßt sich also nicht die Anzeige von parse-errors im "Hauptskript" beeinflussen. Ansonsten steht Dir so ziemlich alles offen - ohne die server-weite Konfiguration zu ändern
Code:                   In Zwischenablage kopieren (nur IE)
1">

Im kompletten Blindflug wirst Du kaum eine Chance haben...

Nobodys Tipps haben durchaus ihre Berechtigung; in den allermeisten Fällen auch das "select *" betreffend.
Ist auf dem server sicher register_globals=on eingestellt? Der Kommentar im Quelltext läßt zwar ein "ja" vermuten, aber sicher ist sicher. Im Zweifelsfall nochmal phpinfo() befragen und hier im Forum nach register_globals suchen.

Vielleicht wurden einfach schon Dokumentdaten an den client gesendet. Dann ist per Definition von http kein Senden von headern mehr möglich.
Code:                   In Zwischenablage kopieren (nur IE)
2">

edit: herje, was bin ich heute wieder lahm :-S
also noch als Zusatz:
nicht nur print/echo sind vor header() nicht zulässig, sondern jedwede Ausgabe von Dokumentdaten. Dazu zählt z.B. auch schon eine Leerzeile vor dem ersten <?php
Denn alles ausserhalb von <?php ?> Blöcken wird as-is an den client gesendet.


11.

wenn das <?php ?> im head einer html seite steht ist das schon problematisch?


12.

Mindestens alles, was Du in der Quelltextanzeige des browsers sehen kannst, war Dokumentausgabe. Also: vermutlich ja.
Den header eines html-Dokuments nicht mit http-headern verwechseln, ersteres gehört zu den Dokumentdaten, zweiteres nicht.
Code:                   In Zwischenablage kopieren (nur IE)
3">




13.

ok ich hab jetzt mal folgendes gemacht, um die header funktion zu testen

<html>
<head>
<?php

header("Location: http://www.irgendeinedns.de/kundenlogin.php";);
exit();

?>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>

</body>
</html>


da krieg ich auch nur eine blanke seite ausgegeben. Das script bricht also ab.


14.

nach dem ich noch die fehler anzeige, wie von volkerk vorgeschlagen, eingebaut habe bekomme ich folgende fehler meldung:

Warning: Cannot add header information - headers already sent by (output started at /web/html//headertest.php:3) in /web/html/headertest.php on line 7

kann damit jemand was anfangen?


15.

so isses ja auch falsch:

Code:                   In Zwischenablage kopieren (nur IE)
4">

wenn denn so:

Code:                   In Zwischenablage kopieren (nur IE)
5">

es darf vor <?php nichts stehen, auch kein leerzeichen, einfach gar nix, denn andernfalls würde, wie schon gesagt, die ausgabe des scriptes beginnen.
und zwischen <?php und dem aufruf der funktion header() darf kein befehl wie print oder echo stehn.


16.

eine html-Seite auszugeben, wenn ein redirect gesendet wird, ist eh' ..hmmm.. nutzlos?

Und nocheinmal: eine http-Antwort hat eine genau festgelegt Struktur. Erst der http-header, dann das http-Dokument. Das Dokument kann ein html-Dokument (<html><head>....</body></html) sein, oder eine zip-Datei oder oder oder, völlig egal. Auf der Ebene von http wird nur zwischen headern und Dokument unterschieden. Immer erst der header, dann das Dokument. Sobald Dokumentdaten gesendet werden, gibt es kein zurück mehr - keine weiteren header.
Mal anhand eines Beispiels:
an www.php.net port 80 schicke ich
Code:                   In Zwischenablage kopieren (nur IE)
6">

die Leerzeile am Ende markiert das Ende des request-headers, danach kämen evtl. vorhandene POST-Daten, schicke ich aber nicht. Als Antwort kommt(gekürzt)
Code:                   In Zwischenablage kopieren (nur IE)
7">

und wieder markiert die erste Leerzeile das Ende der (response-)header. Alles was danach kommt, sind (http-)Dokumentdaten - die letzte header-Information ist also Content-Type: text/html;charset=ISO-8859-1.

header('Location: http./wo.ande.rs/index.php'); tut also nichts anderes, als eben diese Zeile _vor_ den Dokumentdaten an den client zu senden. Ist dies nicht mehr möglich, kommt eben jene Warnung Warning: Cannot add header information - headers already sent by ..., wobei php noch so nett ist, anzuzeigen, an welcher Stelle das Problem ausgelöst wird - und da irrt es sich eigentlich nie - an ziemlich genau dieser Stelle werden das erste Mal Dokumentdaten an den client gesendet.*
An der Ausgabe des headers von php.net kann man deutlich sehen, dass cookies ebenfalls im response-header übertragen werden (server->client; umgekehrt allerdings auch, cookie-Daten werden client->server auch im request-header übertragen). sessions verwenden unter php per Voreinstellung ebenfalls cookies, um die session-id auf dem client zu speichern. Deshalb gibt es (solange php nicht umkonfiguriert wird) auch eine Warnung bei
Code:                   In Zwischenablage kopieren (nur IE)
8">

genau das selbe Problem.
___
* die Warnung schreibt "headers already sent by...", weil die header-Daten erst einmal zwischengespeichert werden und dann -sobald die ersten Dokumentdaten gesendet werden sollen- alle in einem Rutsch sendet. Es ist also möglich, header-Daten durch einen erneuten Aufruf von header(....) für den selben Parameter zu überschreiben.


17.

ah, ok das hat mir schonmal eine menge geholfen! danke für eure geduld mit mir :-)

die frage ist jetzt aber, wie kann man den header dann sinnfoll nutzen?
um einen login zu prüfen muss ich doch erstmal z.b eine verbindung zu einer datenbank herstellen und abfragen ob die eingegebenen daten in der db so vorkommen. und danach will ich den userbrowser erst umleiten z.b. zum erneuten login, wenn seine angaben falsch waren.
die fehlermeldung sagt mir aber, dass der header schon vom anmelden an der datenbank her erfolgt ist.
Wie löse ich das denn jetzt?


18.

hat der Verbindugsaufbau zur Datenbank evtl. bereits eine Warnung an den client gesendet? Ansonsten ist das eigentlich kein Problem.
Was genau steht in den Zeilen 1-3 von headertest.php? Und was ist Zeile 7?


19.

hallo volkerk,

bei der headertest hat alles geklappt, nachdem ich das header() vor den html-code gesetzt habe, da ist auch keine db-verbindung dran.
das problem habe ich bei der eigentlichen datei, die den login überprüft.

da habe ich den gleichen versuch gemacht und den header(...) vor den include dateien eingesetzt. dann hat es funktioniert.
setzte ich es aber nach den include dateien gibt es einen fehler vom typ, wie ich in zu erst bei der headertest hatte.
die includetatei, die dort als header sender bezeichnet ist enthält eigentlich nur die login daten für die daten bank.
also rein

<?php
$MySQL_Host="localhost";
$MySQL_User="sowieso";
$MySQL_Passw="irgendeins";
?>

und gar kein html


20.

Dann ist da irgendwo ein Leerzeichen oder ein Zeilenumbruch zu viel.


21.

muss wohl so gewesen sein *wunder* ich hab jetzt einfach alle leerzeilen im php-script gelöscht und jetzt geht er!!!
Vielen Dank für eure Hilfe!!!! :-)


Hier gehts zum Orginal Eintrag "header probleme :-(" im Forum
 
phpforum.de | Impressum