[PHP] Loginscript

Retep

Well-known member
ID: 102024
L
29 April 2006
378
4
PHP:
<? 
// Session starten
session_start ();

// Datenbankverbindung aufbauen 
$connectionid = mysql_connect //(...) 
if (!mysql_select_db ("//(...)", $connectionid)) 
{ 
  die ("Keine Verbindung zur Datenbank"); 
} 

$sql = "SELECT ". 
    //(...)
  "FROM ". 
   //(...)
  "WHERE ". 
    "(nick = '".$_REQUEST["name"]."' AND ". 
    "(pw = '".$_REQUEST["pwd"]."')"; 
$result = mysql_query ($sql); 

if (mysql_num_rows ($result) > 0)    // ZEILE 21
{ 
  // Benutzerdaten in ein Array auslesen. 
$data = mysql_fetch_array ($result); 

  // Sessionvariablen erstellen und registrieren 
  $_SESSION["user_id"] = $data["Id"];
 //usw 

  header ("Location: intern.php"); 
 } 
else 
{ 
  header ("Location: formular.php?fehler=1"); //ZEILE 39
} 
?>

Oben steht mein Login-Script (holt die Variablen $_REQUEST["name"] und $_REQUEST["pwd"] aus einem Formular in "formular.php").
Ich habe überall "//(...)" eingefügt, wo ich nicht die Daten preisgeben möchte.

Ich bekomme nun folgende Fehlermeldungen:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /var/www/web147/html/login.php on line 21

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web147/html/login.php:21) in /var/www/web147/html/login.php on line 39
Habe nun nach ein paar Std. keinen Fehler gefunden, vielen Dank im Voraus!
 
Dein Query buggt. Mach mal in Zeile 19 (müsste es zumindest sein) folgendes:
PHP:
$result = mysql_query ($sql) or die(mysql_error());
Dadurch solltest Du eine Fehlermeldung erhalten, die auf den Fehler schliessen lässt.

BTW: Das Verwenden von den [php][/php]-Codes ist hier äußerst gerne gesehen. ;)
 
.

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 1
Ist die durch echo mysql_error(); resultierende Fehlermeldung.

Aber in Zeile steht doch nur Kleinerzeichen und Fragezeichen?
 
Die Zeilenangabe bezieht sich auf das Query, welches übrigens interessant wäre, komplett zu sehen, um den Fehler zu entdecken. Spalten- und Tabellennamen sind ja nun auch eigentlich nicht so sicherheitsrelevant, dass man die verstecken müsste oder? ;)

[edit]

Grad gesehen, da fehlt im Query irgendwo 'ne schliessende Klammer. Entweder vorm AND oder am Ende des Querys.
 
PHP:
$sql = "SELECT Id FROM ".$tabelle." WHERE nick = '".$_REQUEST['name']."' AND pw = '".$_REQUEST['pwd']."'";

sollte eigntlich tun ^^

Edit: Zum Headerproblem folgendes ganz am anfang in die Datei einsetzten
PHP:
ob_start('ob_gzhandler');
 
.

PHP:
$sql = "SELECT ". 
    "nick, pw, x, y, z ". 
  "FROM ". 
    "benutzer ". 
  "WHERE ". 
    "(nick = '".$_REQUEST["name"]."' AND ". 
    "(pw = '".$_REQUEST["pwd"]."')"; 
$result = mysql_query ($sql); 
echo mysql_error();
if (mysql_num_rows ($result) > 0)   //ZEILE 21
{ 
  // Benutzerdaten in ein Array auslesen. 
$data = mysql_fetch_array ($result); 

  // Sessionvariablen erstellen und registrieren 
  $_SESSION["user_id"] = $data["Id"];
  $_SESSION["nick"] = $data["nick"]; 
  $_SESSION["pw"] = $data["pw"]; 
  $_SESSION["x"] = $data["x"]; 
  $_SESSION["y"] = $data["y"]; 
  $_SESSION["z"] = $data["z"]; 


  header ("Location: intern.php"); 
} 
else 
{ 
  header ("Location: formular.php?fehler=1"); // ZEILE 39
} 
?>

Das ist jetzt alles nach der Verbindungsaufnahme zur Datenbank
 
Ok, wie schon in meinem Edit angedeutet, fehlt hier 'ne Klammer:
Code:
"(nick = '".$_REQUEST["name"]."' AND ".
"(pw = '".$_REQUEST["pwd"]."')";
Mach da mal das hier draus:
Code:
"(nick = '".$_REQUEST["name"]."') AND ".
"(pw = '".$_REQUEST["pwd"]."')";
Und nochmals:

Wenn Du PHP-Code postet, mach da bitte die [php][/php]-Codes drum. Das hilft so ungemein beim Lesen...
4 Posts mit Quote- und PHP-Tags versehen ;) ** edit by theHacker **
 
.

Eine fehlende Klammer, ohje.. trotzdem vielen Dank.
Es läuft noch nicht ganz wie es soll, aber immerhin sind jetzt schonmal die beiden Fehlermeldungen weg.
 
die klammerung ist überflüssig..

das pw sollten man aber lieber wie folgt prüfen

WHERE BINARY pw = '...'
 
Der normale Vergleich von MySQL ist nicht case-sensitive. Mit BINARY davor wird er es hingegen.
 
Nö, bei MD5-Hashes ist es egal, da es bei diesen nicht auf die Gross- und Kleinschreibung ankommt. Der Hash entspricht ja einem 32-stelligen Hexadezimalwert und in der hexadezimalen Schreibweise ist ein E ein e, egal ob gross oder klein. ;)