PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Session Login Script



Milchbox
17.06.2005, 19:24
Ich brauche mal wieder hilfe :D
Diesmal mit Erklärung :eek:
Also ich bin dabei ein session login script für mein clan cms zu machen.
in der login datei ist irgendwo ein fehler.ich glaube es hat was mit mysql_fetch_assoc zu tun.aber ich hab keine ahnung wie ich die sonst als assoziativen array machen kann.
@dadie:mach dich nicht wieder über mich lustig!!! :D
achja beinahe den code vergessen:

<?php
include("connect.inc.php");
include("logdata.php");
$userdata="SELECT * FROM member";
$result=mysql_query($userdata);
$row=mysql_fetch_assoc($result);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
session_start();

$username = $_POST['username'];
$passwort = $_POST['passwort'];

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

// Benutzername und Passwort werden überprüft
if ($username == '$row[name]' && $passwort == '$row[pass]') {
$_SESSION['angemeldet'] = true;

// Weiterleitung zur geschützten Startseite
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
if (php_sapi_name() == 'cgi') {
header('Status: 303 See Other');
}
else {
header('HTTP/1.1 303 See Other');
}
}

header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');
exit;
}
}
?>

Manni
17.06.2005, 19:30
Bei deinem jetztigen Script wird nur ein User überprüfst, weil du mit "SELECT * FROM member" zwar alle Benutzerdaten auswählst, aber nur einen von ihnen mit mysql_fetch_assoc() herausgreifst. Die Funktion mysql_fetch_assoc() gib immer nur eines von den Ergebnissen zurück. Wenn du also alle Benutzer überprüfen willst, musst du das ganze zB in eine while()-Schleife packen zB so:

while($row = mysql_fetch_assoc($result)) {
// Überprüfen der Benutzerdaten
}

Dein ganze Code müsste also etwa so aussehen (ungetestet):

<?php
include("connect.inc.php");
include("logdata.php");
$userdata="SELECT * FROM member";
$result=mysql_query($userdata);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
session_start();

$username = $_POST['username'];
$passwort = $_POST['passwort'];

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

// Benutzername und Passwort werden überprüft
$korrekt = false;
while($row=mysql_fetch_assoc($result))
if ($username == '$row[name]' && $passwort == '$row[pass]')
$korrekt = true;

if ($korrekt) {
$_SESSION['angemeldet'] = true;

// Weiterleitung zur geschützten Startseite
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
if (php_sapi_name() == 'cgi') {
header('Status: 303 See Other');
}
else {
header('HTTP/1.1 303 See Other');
}
}

header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');
exit;
}
}
?>

Milchbox
17.06.2005, 19:38
thx ich dachte mir schon mit einer while-schleife aber wusste nicht genau wie und wo ich die hin machen sollte aber jetzt weis ichs

dadie
17.06.2005, 19:46
thx ich dachte mir schon mit einer while-schleife aber wusste nicht genau wie und wo ich die hin machen sollte aber jetzt weis ichs


Naja es gng aber auch hir einfacher (und besser ^^)

Undzwar kann man es über SQl Lösen :D

Ich würde das Ganze dann so lösen



<?php
include("connect.inc.php");
include("logdata.php");
$userdata="SELECT * FROM `member` WHERE `user` = '$username' AND `pass` = '$passwort'";


if ($_SERVER['REQUEST_METHOD'] == 'POST') {
session_start();

$username = $_POST['username'];
$passwort = $_POST['passwort'];

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

$result=mysql_query($userdata);


// Benutzername und Passwort werden überprüft
if (@mysql_num_rows($result) == "1") {
$_SESSION['angemeldet'] = true;

// Weiterleitung zur geschützten Startseite
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
if (php_sapi_name() == 'cgi') {
header('Status: 303 See Other');
}
else {
header('HTTP/1.1 303 See Other');
}
}

header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');
exit;
}
}
?>


Dadurch erspart man sich Starke Server Probs wenn man z.B. 900 User hat kann die Whil schleiff schonmal 10 sekunden dauern ^^,

Milchbox
17.06.2005, 19:51
Hier die Seite (http://www.devilghosts.de) und hier der quelltext von der login.php :

<?php
include("connect.inc.php");
$userdata="SELECT * FROM `member` WHERE `user` = '$username' AND `pass` = '$passwort'";


if ($_SERVER['REQUEST_METHOD'] == 'POST') {
session_start();

$username = $_POST['username'];
$passwort = $_POST['passwort'];

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

$result=mysql_query($userdata);


// Benutzername und Passwort werden überprüft
if (@mysql_num_rows($result) == "1") {
$_SESSION['angemeldet'] = true;

// Weiterleitung zur geschützten Startseite
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
if (php_sapi_name() == 'cgi') {
header('Status: 303 See Other');
}
else {
header('HTTP/1.1 303 See Other');
}
}

header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');
exit;
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Test</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<form action="login.php" method="post">
Username: <input type="text" name="name" /><br />
Passwort: <input type="password" name="pass" /><br />
<input type="submit" value="Anmelden" />
</form>
</body>
</html>

Der name und pass sind test

dadie
17.06.2005, 19:54
beides klappt nicht.

o.O nicht mal die Whil schleiffe.

Evtl. sind die Taben / Spalten daten falsch , naja auf anhieb erkenne ich keinen fehler
auser die tatsache das , das passwort und der username nie in einer sassion geschreiben wird ^^ aber evtl. hast du es später gemacht oder du hast nicht den ganzen code hier gepostet.

Naja beschriebe mal geht nicht sagt er einen error oder siht er einen als Offline an ?

Edit:

Die Spalten/Taben Namen sind woll falsch zumindest nehme ich das an und hoffe irgentwie das , da der fehler liegt sonst ^^, weiss ich keine hilfe ^^,

Milchbox
17.06.2005, 20:32
muss der passworrt input auch in der datenbank angegeben werden oder normal als char?

Hier die member tabelle:
Feld Typ Attribute Null Standard Extra Aktion
id int(11) Nein auto_increment
name varchar(25) Nein
pass varchar(25) Nein

dadie
17.06.2005, 21:09
muss der passworrt input auch in der datenbank angegeben werden oder normal als char?

Hier die member tabelle:
Feld Typ Attribute Null Standard Extra Aktion
id int(11) Nein auto_increment
name varchar(25) Nein
pass varchar(25) Nein

1,Bei der id kannst du ihm auch 255 geben ;) dann hält das teil

9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
user Speichern ^^

2,Anscheinent heisst die Spalte name und bei dir oben (weil ich den fehler machte -.-)
user

Milchbox
18.06.2005, 11:36
die spalte hab ich umgeändert aber was soll das mit den 9en ???
klappt immer noch nicht!keine umleitung.
also die login.php soll falls der name und das pass true ist auf index.php umleiten.
ich poste mal alle dateien vom script:

login.php:


<?php
include("connect.inc.php");
$userdata="SELECT * FROM `member` WHERE `name` = '$username' AND `pass` = '$passwort'";


if ($_SERVER['REQUEST_METHOD'] == 'POST') {
session_start();

$username = $_POST['username'];
$passwort = $_POST['passwort'];

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

$result=mysql_query($userdata);


// Benutzername und Passwort werden überprüft
if (@mysql_num_rows($result) == "1") {
$_SESSION['angemeldet'] = true;

// Weiterleitung zur geschützten Startseite
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
if (php_sapi_name() == 'cgi') {
header('Status: 303 See Other');
}
else {
header('HTTP/1.1 303 See Other');
}
}

header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');
exit;
}
}
?>

auth.php:

<?php
session_start();

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/login.php');
exit;
}
?>

logout.php

<?php
session_start();
session_destroy();

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/login.php');
?>

Manni
18.06.2005, 15:00
Ich frage mich, warum du so einen Mist schreibst:

if(@mysql_num_rows($result) == "1")
Der Rückgabewert von mysql_num_rows() ist kein String sondern eine Zahl!
1 =! "1" - daher wird diese Bedingung immer falsch sein... :rolleyes:

Milchbox
18.06.2005, 17:36
was fragst du mich das ich wuste das aber dadie hats geschrieben.
und wie solls richtig sein.

dadie
18.06.2005, 17:56
Ich frage mich, warum du so einen Mist schreibst:

if(@mysql_num_rows($result) == "1")
Der Rückgabewert von mysql_num_rows() ist kein String sondern eine Zahl!
1 =! "1" - daher wird diese Bedingung immer falsch sein... :rolleyes:


Jetzt mal ganz erlich Warum zur Hölle laberst du so einen Müll ?

Folgender code



<?php

$array = array();

if(@count($arrary) == "0")
{
echo "geht doch !!!" ;
}

?>


$array = array( 1, 1, 1, 1, 1);

if(@count($arrary = "0"))
{
echot "geht doch !!!"
}


Würde nach dir so aussehn :



$array = array( 1, 1, 1, 1, 1); if(@count($arrary = "0")) { echot "geht doch !!!" }


Komsich nur das er so aussiht



geht doch !!! $array = array( 1, 1, 1, 1, 1); if(@count($arrary = "0")) { echot "geht doch !!!" }

Milchbox
18.06.2005, 18:09
und wie soll die login.php datei jetzt aussehen???

Dingsi
18.06.2005, 18:11
Das ganze kommt darauf an ob man == oder === benutzt. Hier (http://de.php.net/manual/de/types.comparisons.php) sieht man den Unterschied.

Milchbox
18.06.2005, 18:25
ich will nur wissen wie ich ein login script machen kann.ist das so schwer???

codec
18.06.2005, 18:41
Klick mich. (http://tutorial-zone.de/tutorials.php?a=tutorial&tutid=29)

Milchbox
18.06.2005, 19:03
thx @ all außer dadie (war ein witz lol :o)

Dingsi
18.06.2005, 19:11
thx @ all außer dadie (war ein witz lol :o)Gut erkannt, dass dadie ein Witz ist. :A

Milchbox
18.06.2005, 19:19
aber den letzte abschnitt kapier ich nicht:

### index.php ###


<?PHP
session_start();

# Wenn die Variable $login registriert ist,...
if( session_is_registered("login") ) {
?>
Deine HTML Seite...
<?
} else {
echo("Sie sind nicht eingeloggt!!");
}
?>



Ich konnte das jetzt nicht testen, aber ich denke als Beispiel reicht es allemal.

muss ich die in jede datei rein stecken die ich schützen will?
und muss ich die als aller erstes schreiben oder was?

also ich versteh das so:
falls man eingeloggt ist sieht man die seite wo steht Deine HTML Seite... oder???

Lukas
18.06.2005, 19:23
Das muss in jede Datei rein, die du schützen willst.
Der Code überprüft, ob die Session login existiert (die wird beim erfolgreichen Einloggen angelegt), und falls das nicht der Fall ist (man also nicht richtig eingeloggt ist), wird man darauf aufmerksam gemacht, dass man sich einloggen soll.

Milchbox
18.06.2005, 19:38
thx @codec
klappt jetzt auf meiner clan site *werbung mach* :D