 |
24.10.2005, 11:29
| Nach oben
#1 | | Gast | Problem mit Bens tutorial
Hallo,
ich habe leider auch ein Problem mit Bens loginscript. Hab mich schon durch dieses Forum gewühlt, einige scheinen ja dieses Problem auch zu haben, andere wiederum nicht. Allerdings habe ich noch keine konkrete Lösung gefunden... kann der Fehler auch an der PHP-Version liegen??
Also, hier ist erstmal die Fehlermeldung: Code: Warning: Cannot modify header information - headers already sent by (output started at c:\inetpub\wwwroot\config.inc.php:20) in c:\inetpub\wwwroot\validateLogin.inc.php on line 48 Und nun der Code der beiden Dateien:
Zuerst die config.inc.php: PHP-Code: <?php
// Array initialisieren ... $_config = array();
// ... und mit Werten füllen
// Der Datenbankserver. $_config['host'] = 'localhost';
// Ein User, der auf den Server zugreifen darf. $_config['user'] = 'SÜSSE';
// Das zum User passende Passwort. $_config['password'] = 'golfie';
// Der Name der Datenbank, die auf dem Datenbankserver angesprochen werden soll. $_config['database'] = 'versuch';
?> Und jetz die validateLogin.inc.php: PHP-Code: <?php session_start(); // Einbinden der Konfigurationsdatei include ('config.inc.php'); // Überprüfen, ob das Formular abgeschickt wurde und ob beide Angaben gemacht wurden. if( isset($_POST['username'], $_POST['passwort']) AND strcmp(trim($_POST['username']),'') != 0 AND strcmp(trim($_POST['username']),'') != 0 ) {
// Erstellen der Verbindung zur MySQL-Datenbank if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) { die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' ); }
if( !mysql_select_db( $_config['database'], $connection ) ) { die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br /> MySQL-Error: <br />' . mysql_error() ); } // SQL-Anweisung an die Datenbank senden, um erstens herauszufinden, ob // diese Kombination von Usernamen und Passwort überhaupt existiert und // zweitens bei Existenz Userinformationen auszulesen $sql = "SELECT _id, _anzahlLogins FROM archiv_login WHERE _username = '" . trim($_POST['username']) . "' AND _passwort = '" . md5(trim($_POST['passwort'])) . "'"; $res = mysql_query($sql) or die( 'Error[SELECT|User]: <br /> <pre>' . $sql . '</pre> <br /> MySQL-Error: ' . mysql_error() ); // Nur wenn genau ein Datensatz selektiert wurde wird der User eingeloggt. // In allen anderen Fällen wird er zurück zum Loginformular geleitet. if( mysql_num_rows($res) != 1 ) { header('Location: http://localhost/loginfehler.html'); exit(); } else { // Der Schlüssel 'loggedIn' erhält den Wert 'true'. So kann überprüft später werden, // ob der User eingeloggt ist oder nicht. $_SESSION['loggedIn'] = true; // Die userspezifischen Daten werden ausgelesen und der Session hinzugefügt $user = mysql_fetch_object($res); $_SESSION['anzahlLogins'] = $user->_anzahlLogins; $_SESSION['id'] = $user->_id; // Aktualisierung des Anzahl der Logins $sql = 'UPDATE archiv_login SET _anzahlLogins = _anzahlLogins + 1 WHERE _id = ' . $user->_id; mysql_query($sql) or die( 'Error[UPDATE|User]: <br /> <pre>' . $sql . '</pre> <br /> MySQL-Error: ' . mysql_error() ); // Der Login war erfolgreich und der User wird zur Startseite des // passwortgeschützen Bereichs weitergeleitet header('Location: http://localhost/geheim.php'); exit(); } } else { header( 'Location: http://localhost/loginformular.html' ); exit(); }
?> Bin sehr sehr dankbar über jede Hilfe....
| |
| |
24.10.2005, 12:46
| Nach oben
#2 | | Benutzer
Registriert seit: 05.09.2005 Ort: Ostarrichi
Beiträge: 51
|
was ist zeile 20 in config.inc.php?
$_config['host'] = 'localhost';?
$_config['user'] = 'SÜSSE';?
__________________ -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- |
| |
24.10.2005, 13:46
| Nach oben
#3 | | Gast |
Das ist ja das komische.... Zeile 20 ist eigentlich nur noch:
?>
| |
| |
24.10.2005, 14:15
| Nach oben
#4 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.212
|
Ich habe soeben noch einmal die Dateien an das Tutorial drangehängt. Ggf. testet du das nochmal mit den Originaldateien. Diese nämlich produzieren bei mir lokal, wie auch auf dem Server keinen Fehler.
|
| |
24.10.2005, 16:19
| Nach oben
#5 | | Lutz
Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
Also wodurch die Fehlermeldung verursacht wird habe ich denke ich hier: http://forum.developers-guide.net/thread431.html recht deutlich gemacht. Kann es sein, dass in deiner config.inc.php vielleicht noch nachfolgende Leerzeichen kommen, die eine Ausgabe bilden?
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| |
24.10.2005, 17:20
| Nach oben
#6 | | Gast |
Das Problem ist behoben!! Vielen Dank!!
Allerdings is da auch schon das nächste Problem im Anmarsch... bin leider wirklich absolute Anfängerin...
Hab ein bißchen an dem Anmeldescript gebastelt, aber noch nicht so wirklich was hinbekommen... könntet ihr mich vielleicht wenigstens auf ein paar Fehler hinweisen?? Hoffe ja das nicht alles falsch ist... hier der Code: PHP-Code: <?php session_start(); // Einbinden der Konfigurationsdatei include ('config.inc.php'); // Überprüfen, ob das Formular abgeschickt wurde und ob beide Angaben // gemacht wurden. if( isset($_POST['username'], $_POST['passwort']) AND strcmp(trim($_POST['username']),'') != 0 AND strcmp(trim($_POST['username']),'') != 0 ) { // Erstellen der Verbindung zur MySQL-Datenbank if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) { die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' ); }
if( !mysql_select_db( $_config['database'], $connection ) ) { die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br /> MySQL-Error: <br />' . mysql_error() ); }
if( mysql_num_rows($res) != 0 ) { header('Location: http://localhost/loginfehler.html'); exit(); } else {
$sql = "INSERT INTO archiv_login ( _username, _passwort ) VALUES ( '" . $username . "', MD5('" . $passwort . "') ) $res = mysql_query($sql) or die( 'Error[SELECT|User]: <br /> <pre>' . $sql . '</pre> <br /> MySQL-Error: ' . mysql_error() ); exit(); } ?> | |
| |
24.10.2005, 18:00
| Nach oben
#7 | | Lutz
Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
| PHP-Code: <?php
session_start();
// Einbinden der Konfigurationsdatei
include ('config.inc.php');
// Überprüfen, ob das Formular abgeschickt wurde und ob beide Angaben
// gemacht wurden.
if (isset ($_POST['username'], $_POST['passwort'])
AND
strcmp (trim ($_POST['username']), '') != 0
AND
strcmp (trim ($_POST['username']), '') != 0)
{
// Erstellen der Verbindung zur MySQL-Datenbank
if (!$connection = mysql_connect ($_config['host'], $_config['user'], $_config['password']))
{
die ('Verbindung zum Datenbankserver konnte nicht hergestellt werden.');
}
if (!mysql_select_db ($_config['database'], $connection))
{
die ('Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br />' .
'MySQL-Error: <br />' .
mysql_error ());
}
?> Bis hier hin ist alles soweit OK. PHP-Code: <?php
if (mysql_num_rows ($res) != 0)
{
header ('Location: http://localhost/loginfehler.html');
exit ();
}
?> Woher soll $res auf einmal kommen? Du hast gerade erst eine Verbindung zur DB aufgebaut und $res kann dementsprechend nicht gefüllt sein bzw. was anderes als 0 enthalten, da kein Query ausgeführt wird. Ergo: Sinnlos diese Abfrage (zumindest solange $res nicht gesetzt wird) PHP-Code: <?php
else
{
$sql = "INSERT INTO `archiv_login` (`_username`, `_passwort`) VALUES ('" . $username . "', MD5('" . $passwort . "')";
?> Du solltest einen angefangenen SQL-Query auch wieder schließen. Letztlich ist es erstmal nur ein String in PHP, aber wenn du kein "; ans Ende setzt, wirst du einen Parse-Error bekommen. PHP-Code: <?php
$res = mysql_query ($sql) OR die ('Error[SELECT|User]: <br />' .
'<pre>' . $sql . '</pre>' .
'<br />' .
'MySQL-Error: ' . mysql_error ());
exit ();
}
}
?> Du hast vergessen zusätzlich noch den ELSE-Part zu schließen mit einem }. Ansonsten ist mir aufgefallen, dass du dir erstmal einen Coding-Style angewöhnen solltest, denn du hast in diesem kurzen Script bereits etliche Dinge unterschiedlich geschrieben (OR einmal groß, einmal klein, dann einfache Quotes für Strings, dann wieder doppelte Quotes...) Ein einheitliches Layout des Quelltextes wirkt nicht nur professioneller, sondern ist auch übersichtlicher.
Achja: Die Einrückungen sollten etwas einheitlicher sein (ich favorisiere 2 Spaces für eine Ebene).
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| |
24.10.2005, 19:22
| Nach oben
#8 | | Gast |
OK, habe versucht deinen Ratschlag zu befolgen und zumindest ETWAS ordnung in die sache gebracht... ne fehlermeldung kommt nun zwar nicht mehr, aber ich werde immer wieder zum anmeldeformular geleitet und in die Datenbank wird auch nix geschrieben.... PHP-Code: <?php session_start(); // Einbinden der Konfigurationsdatei include ('config.inc.php'); // Überprüfen, ob das Formular abgeschickt wurde und ob beide Angaben // gemacht wurden. if( isset($_POST['username'], $_POST['passwort']) AND strcmp(trim($_POST['username']),'') != 0 AND strcmp(trim($_POST['username']),'') != 0 ) { // Erstellen der Verbindung zur MySQL-Datenbank if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) { die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' ); }
if( !mysql_select_db( $_config['database'], $connection ) ) { die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br /> MySQL-Error: <br />' . mysql_error() ); }
$sql = "SELECT _id, _anzahlLogins FROM archiv_login WHERE _username = '" . trim($_POST['username']) . "' OR email = '" . md5(trim($_POST['email'])) . "'";
$res = mysql_query($sql) or die( 'Error[SELECT|archiv_login]: <br /> <pre>' . $sql . '</pre> <br /> MySQL-Error: ' . mysql_error() ); if( mysql_num_rows($res) != 0 ) { header('Location: http://localhost/loginfehler.html'); exit(); } else {
$sql = "INSERT INTO archiv_login ( _username, _passwort ) VALUES ( '" . $username . "', MD5('" . $passwort . "')"; mysql_query($sql) or die( 'Error[INSERT INTO|archiv_login]: <br /><pre>' . $sql . '</pre><br /> MySQL-Error: ' . mysql_error() ); header('Location: http://localhost/loginformular.html'); exit(); } } else { header( 'Location: http://localhost/anmeldeformular.html' ); exit(); } ?> | |
| |
24.10.2005, 19:49
| Nach oben
#9 | | Lutz
Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
Der Fehler steckt also hier: PHP-Code: if( isset($_POST['username'], $_POST['passwort'])
AND
strcmp(trim($_POST['username']),'') != 0
AND
strcmp(trim($_POST['username']),'') != 0 )
{
Mal abgesehen davon, dass das eine wohl eher $_POST['passwort'] sein sollte, würde ich die Verwendung von empty() empfehlen: PHP-Code: if( isset($_POST['username'], $_POST['passwort'])
AND
empty ($_POST['username']) === FALSE
AND
empty ($_POST['passwort']) === FALSE )
{
Wenn der Fehler immernoch auftritt (was ich für wahrscheinlich halte), stimmt entweder was mit der Übergabe der Variablen nicht (Die Namen der Felder im Formular sind anders geschrieben, als im Script, man beachte Groß- und Kleinschreibung) oder irgendwoanders werden diese Daten bereits überschrieben (config.inc.php?)
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| |
24.10.2005, 20:02
| Nach oben
#10 | | Goldman.de
Registriert seit: 09.10.2005 Ort: Frankfurt am Main
Beiträge: 190
|
und ich würd empfehlen bei Vergleichen, den zu vergleichenden String, Array, Hash, Scalar oder sonstwas immer auf die linke Seite des Vergleichs zu schreiben
bsp.:
$str = 'x';
if ('x' === $str ) { .....
warum ?
ganz einfach:
um Fehler wie if ($str = 'x') { .....
zu vermeiden ...
mfg
[edit]
und wenn man schon dabei ist ...
um ein mehrfach laden von "modulen/dateien" auszuschließen
anstatt von include und require lieber include_once, require_once
Geändert von J33d3X (24.10.2005 um 20:51 Uhr).
|
| |
24.10.2005, 22:13
| Nach oben
#11 | | Gast |
Erstmal vielen vielen Dank für eure Hilfe!!
Nun bekomm ich allerdings folgende Fehlermeldung nach dem anmelden: Code: Error[INSERT INTO|archiv_login]:
INSERT INTO
archiv_login ( _username, _passwort )
VALUES
( '', MD5('')
MySQL-Error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4
Kann das evtl. daran liegen, dass meine MySQL Tabelle schon mehrere Spalten hat als die 2?? Habe dort schon email und so eingefügt, wollte diese Felder dann aber erst mit einbeziehen, wenn ich es mit 2 Feldern (sprich username und passwort) zum laufen bekommen habe....
| |
| |
24.10.2005, 22:14
| Nach oben
#12 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.212
|
versuch doch mal dein sql-statement in phpmyadmin abzusetzen. Dann siehst du gleich - wenn es geklappt hat - wie es richtig sein muss.
|
| |
25.10.2005, 05:37
| Nach oben
#13 | | Lutz
Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
Soe wie es da steht ist dein SQL-Query auch ohne Werte aufgerufen worden, was mich zu der Annahme bringt, dass deine Variablen $_POST['username'] und $_POST['passwort'] leer sind. Eigentlich dürfte er diese Fehlermeldung aber nicht auftauchen, da durch empty ($_POST['username']) === FALSE eigentlich sichergestellt wird, dass der Username angegeben ist, ebenso wie das Passwort.
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| |
26.10.2005, 15:40
| Nach oben
#14 | | Gast |
OK, erstmal vielen vielen Dank für eure Hilfe!!
Hab den Code nochmal etwas umgestellt, Passwort wird auch in die Datenbank eingetragen, nur der Username nicht...  warum muss das denn alles so kompliziert sein??
Ich poste nur nochmal den SQL-insert Code, das andere müßte glaube gleich geblieben sein... vielleicht bemerkt ja jemand einen Fehler??? PHP-Code: $sql = "INSERT INTO archiv_login ( _username, _passwort ) VALUES ('" . $username . "', MD5('" . $passwort . "'))";
| |
| |
26.10.2005, 15:44
| Nach oben
#15 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.212
|
lass dir doch mal an der entspr. Stelle mittels
echo $sql;
das zusammengesetzte sql-statement ausgeben, dann kannst du kontrollieren, ob das auch richtig ist!
|
| | |