Login-System mit PHP und MYSQL

alexbot

Mitglied
Hallo,
ich arbeite gerade fieberhaft an einen Login-System mit Session, nach dem Vorbild eines Tutorials von hier.
Nun bin ich aber mit meinem Latein am Ende.
Alle Datein funktionieren nis auf die Datei login.php. Die anderen sind ja auch nicht so schwer.
1. Weiß ich gar nicht warum nichts geht, wenn ich die Passwortabfrage starte läuft login.php durch und formular.php sagt falsche eingabe.
2. Hab ich mir die ID die über mysql_num_rows mal per echo anzeigen lassen, sie ist null, obwohl ich in php myadmin sehen kann das sie mindestens 1 ist. die Datenbank und der Zugriff funktionieren auch einwandfrei.
Ich weiß nun wirklich net woran es liegt ich hab schon mindesten 5 Stunden alle Tricks probiert die ich kenn vielleicht könnt ihr mir ja helfen.?

Hier mein login.php die x stehn für zeichen die net bekannt gebe ;-)
PHP:
<?php
session_start();
  if ($_SERVER["HTTP_HOST"] == "127.0.0.1") {
    $server = "localhost";
    $datenbank = "xx-xxxxxxxx-xx";
    $benutzer = "root";
    $passwort = "";
  }
  else {
    $server = "xxxxxxx.xxxxxxxxxxx.xxxxxxxxx.de";
    $datenbank = "xx_xxxxxxxxxx_xx_2";
    $benutzer = "ftpxxxxxx";
    $passwort = "xxxxxxxxx";
  }
 $verbindung = mysql_connect($server, $benutzer, $passwort) or die("Keine Verbindung zur Datenbank!");
  if(!mysql_select_db($datenbank, $verbindung)) {die("Datenbank konnte nicht ausgewählt werden!");}
  $sql ="SELECT".
  		"ID, Benutzer, Vorname, Nachname, Kennwort".
		"FROM".
		"otb_infologin".
		"WHERE".
		"(Benutzer like '".$_REQUEST["coname"]."')AND".
		"(Kennwort ='".md5 ($_REQUEST["pass"])."')";
  $result =mysql_query ($sql);
  if(mysql_num_rows($result) > 0)
  }
		$data=mysql_fetch_assoc ($result);
		$_SESSION["user_id"] =$data["ID"];
		$_SESSION["user_benutzer"] = $data["Benutzer"];
		$_SESSION["user_vorname"] = $data["Vorname"];
		$_SESSION["user_nachname"] = $data["Nachname"];
		header ("Location: intern.php");
		}
		else
		{
		header ("Location: formular.php?fehler=1");
		}
		echo mysql_error();
		
?>
 
Hi Alexbot,

Herzlich Willkommen auf tutorials.de! :)

Nach
PHP:
if(mysql_num_rows($result) > 0)
ist die geschweifte Klammer falsch herum ... könnte das bereits der Fehler sein?

Liebe Grüße,
Mark.
 
Dein Query hat voll den falschen Syntax:

Probiers so:
PHP:
$sql = 'SELECT 
              `ID`, `Benutzer`, `Vorname`, `Nachname`, `Kennwort` 
          FROM 
              `otb_infologin` 
          WHERE 
              `Benutzer` = "'.$_POST['coname'].'" 
          AND 
              `Kennwort` = "'.md5($_POST['pass']).'" 
          LIMIT 1';

//edit
Ich würde es machen mit `Benutzer` = ..., da das genauer ist. Der Name sollte ja eindeutig sein.
Das Limit 1 am Ende kannst du rausnehmen, wenn es jeden Benutzernamen mehrmals geben darf

Und du schreibst folgendes so:
$result = mysql_query ($sql)
lasse die Leerzeichen wech:
$result = mysql_query($sql);


Der Rest ist korrekt


//edit2
ja ok, das eine da. Mit der geschweiften Klammer. Musste mal gucken, wo die richtig beendet wird
 
Zuletzt bearbeitet:
Muss Kalma da mal widersprechen.

Die Syntax des Queries ist in Ordnung. Auch Like könnte man nutzen, da es syntaktisch genau wie = arbeitet, solange keine WildCards verwendet werden. (Eben _ bzw. %)

Die Verkettung von $sql ist zwar nicht notwendig, kann man aber durchaus trotzdem benutzen. Es ist also kein Fehler, sondern eine reine Formsache.

Allerdings fehlen mir da einige Leerzeichen bei der Verkettung:
PHP:
$sql ="SELECT".
          "ID, Benutzer, Vorname, Nachname, Kennwort".
        "FROM".
        "otb_infologin".
        "WHERE".
        "(Benutzer like '".$_REQUEST["coname"]."')AND".
        "(Kennwort ='".md5 ($_REQUEST["pass"])."')";
# Ausgabe:
 SELECTID, Benutzer, Vorname, Nachname, KenntwortFROMotb_infologinWHERE # usw.


Ansonsten mal schön [phpf]mysql_error[/phpf] benutzen bzw. ggf. [phpf]error_reporting[/phpf] hochstellen.
 
Aber ist eigentlich doch schreibarbeit :confused:

Ich kenns so wie von mir genannt.. Probierne kann ja nicht schaden :P
 
Aber ist eigentlich doch schreibarbeit :confused:

Ich kenns so wie von mir genannt.. Probierne kann ja nicht schaden :P

Ich würde sagen, es ist einfach eine Frage des Stils, genauso wie bei den geschweiften Klammern:

PHP:
if(xxx) {
# do sth
}

if(xxx)
{
  #do sth
}

if(xxx)
  {
    #do sth
  }

Alle syntaktisch korrekt, aber alle verschiedene Stile sozusagen. Alles eine Frage des Geschmacks würde ich sagen und wie man es persönlich vorzieht bzw. übersichtlicher empfindet...

Alles natürlich auf eigene Projekte bezogen... Bei größeren Projekten sollte man sich natürlich an die Richtlinien halten bzw. an die vorgegebenen Dinge ;)
 
Danke für eure Antworten.
Aber funktionieren tut es trozdem nicht.
In den Kommentaren, die jeweils unter den echos stehen, seht ihr die Ausgabe des jeweiligen Echos.
Der Fehler tritt meiner Meinung nach auf weil php die IF-Schleife unten nicht aufrufen kann, da $hollid =0 ist, was aber nicht sein dürfte, da mindestens ein Eintrag in der Datenbank ist und ID mit Not Null definiert ist. so kann das Programm ja nur die ELSE - Anweisung ausführen und im formular.php schreiben ungültiger Login.
Also irgendein Bock ist darin und ich weiß nicht wie ich den daraus bekomme.
Unter mysql_error() gibt es hierbei keine Meldung.
Bitte Versucht weiter mir zu helfen
lieber Gruß Alex

@Felix Jacobi, Danke das mit den Freizeichen war auch son Ding das ich übersehen hatte sieht jetzt ja ganz gut aus. Danke , und die Klammer bei der IF-Schleife hab ich ausversehen hier so gesetzt im script war die richtig rum.

PHP:
$sql ="SELECT ".
  		"ID, Benutzer, Vorname, Nachname ".
		"FROM ".
		"otb_infologin ".
		"WHERE ".
		"(Benutzer = '".$_REQUEST["coname"]."') AND ".
		"(Kennwort = '".md5 ($_REQUEST["pass"])."')";
  echo $sql;
  //SELECT ID, Benutzer, Vorname, Nachname FROM otb_infologin WHERE (Benutzer = '') AND (Kennwort = 'd41d8cd98f00b204e9800998ecf8427e')
  $result =mysql_query($sql);
  echo $result;
  //Resource id #3
  $hollid=mysql_num_rows($result);
  echo $hollid;
  //0
  if($hollid > 0) 
  {
        $data=mysql_fetch_assoc($result);
        $_SESSION["user_id"] =$data["ID"];
        $_SESSION["user_benutzer"] = $data["Benutzer"];
        $_SESSION["user_vorname"] = $data["Vorname"];
        $_SESSION["user_nachname"] = $data["Nachname"];
        header ("Location: intern.php");
        } 
        else 
        { 
        header ("Location: formular.php?fehler=1"); 
        } 
        echo mysql_error(); 

		
?>
 
Kann man mysql error so anwenden?


Mach doch mal so:
PHP:
$result = mysql_query($sql) or die(mysql_error());
 
@Kalma
hab das so gemacht wie du sagst, trotzdem bekomm ich nur die echos und kein error, also scheint da an der query abfrage ja nix zu sein.
Aber könnt ihr mir nicht vielleicht sagen, woran es liegt das bei der mysql_num_rows abfrage der wert null ist statt 1 wie er sein sollte?
gruß alex
 
Kann man mysql error so anwenden?


Mach doch mal so:
PHP:
$result = mysql_query($sql) or die(mysql_error());

@Kalma: Jepp genau so ;)

@all ;)

Und dann noch nen Tipp, an alle die Login-Systeme erstellen wollen, vergesst nicht, eine $_SESSION mit einem User-eigenen Code zu übergeben, der sich bei jedem Loginversuch ändert, denn damit könnt ihr dies dann etwas.

PHP:
if($_SESSION['code'] == NULL){
	$_SESSION['code'] = md5(123456789+time());
	$smarty->assign("code", $_SESSION['code']);
}else{
	$smarty->assign("code", $_SESSION['code']);
}

Die Zahl 123456789 könnt ihr entweder selbst verändern oder durch ein Random automatisch festlegen lassen.

Den SESSION-Code übergebt ihr einfach noch in dem Formular mit einem HIDDEN-Feld, welches ja hoffentlich auf POST eingestellt ist.

Dann überprüft ihr, ob die $_SESSION[ code ] und die $_POST['code'] den selben Inhalt haben. Wenn ja, dann wertet ihr die die restlichen Formular Daten aus, wenn nein, dann könnt ihr gleich eine Fehlermeldung zurückgeben, da der User (oder warschein Bot) verwendete nicht das eigentliche Loginformular.

Direkt nach dem Auswerten könnt ihr die $_SESSION['code'] wieder vernichten, so dass wenn die Zugangsdaten falsch waren, der User sofort einen neuen Code erhält.

Dies machst du mit:

PHP:
unset($_SESSION['code']);

Dabei ist aber noch zu beachten, dass du die Session nur innerhalb eine Subdomain nutzen kannst. Also die $_SESSION['code'] unter http://www.deinedomain.de vergeben und unter login.deinedomain.de auswerten geht leider nicht.

Gruß Matze202.

@Kalma
hab das so gemacht wie du sagst, trotzdem bekomm ich nur die echos und kein error, also scheint da an der query abfrage ja nix zu sein.
Aber könnt ihr mir nicht vielleicht sagen, woran es liegt das bei der mysql_num_rows abfrage der wert null ist statt 1 wie er sein sollte?
gruß alex

Hi @alexbot,

Der wert ist nur NULL, wenn er keinen passenden Eintrag gefunden hat.

Gruß Matze202.
 
Zurück