CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
03.07.2009, 14:21:14
|
|
Anfänger
|
|
Registriert seit: Jul 2009
Alter: 46
Beiträge: 5
|
|
Booleanwerte in Sessionvariablen
Ich brauche eure Hilfe!
Ich bastel mir gerade eine private Homepage auf der ich meinen Verwandten die Urlaubsbilder zum Betrachten einstellen möchte. Dazu brauch ich ein Login-System und möchte dies über Sessions ermöglichen.
Zunächst habe ich eine Seite main.php mit dem Login-Formular (Post-Methode), anschließend wird login.php aufgerufen. Dort wird eine Session gestartet (funktioniert) und eine Session-Variable 'eingelogt' angelegt (funktioniert) und mit 'false' belegt (ohne Anführungszeichen, es erfolgt keine Fehlermeldung). Anschließend werden Benutzername und Passwort geprüft und bei Übereinstimmung wird die Sessionvariable 'eingelogt' mit 'true' belegt (ohne Anführungszeichen, es erfolgt keine Fehlermeldung) und auf die Seite 'start.php' weitergeleitet (header mit Session-ID). Innerhalb von 'start.php' wird über 'include' die Datei 'testlogin.php' aufgerufen. Mit ihr soll geprüft werden, ob ein erfolgreicher Login stattgefunden hat - also ob die Session-Variable 'eingelogt' existiert und mit 'true' belegt ist. Abfrage lautet: if(!isset($_SESSION['eingelogt'])||!$_SESSION['eingelogt']). Wenn nun die Variable 'eingelogt' nicht existiert oder nicht mit 'true' belegt ist, dann wird man wieder per Header auf 'main.php' weitergeleitet.
Problem ist nun. Die Session wird korrekt angelegt und auch die Session-Variable 'eingelogt'. Die Variable wird auch als Booleanwert erkannt, da in der Session-Datei folgendes steht: 'eingelogt|b:1:'. Allerdings steht nach dem zweiten Doppelpunkt kein Wert und somit wird 'eingelogt' niemals 'true'. Wenn ich hingegen beim Belegen der Variable die Anführungszeichen verwende, dann steht und der Datei: 'eingelogt|s:4:"true". Der Wert wird also als String interpretiert und die Abfrage ob wird immer wahr sein, egal oben dort "true" oder "false" drinsteht.
Was mache ich falsch? Ich muss dazusagen im Phase-5-html-Editor wird false und true nicht als Schlüsselwort markiert, aber bei einfacher Abfrage - $a=true; if(!$a) - korrekt behandelt.
Geändert von frerd (03.07.2009 um 14:23:36 Uhr)
|
03.07.2009, 14:29:23
|
SELFPHP Profi
|
|
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
|
|
AW: Booleanwerte in Sessionvariablen
kenne den restlichen quelltext nicht, aber vielleicht hilft das:
if(!isset($_SESSION['eingelogt']) and !$_SESSION['eingelogt'])
reichen sollte auch:
if(!isset($_SESSION['eingelogt']))
cx
anmerkung:
isset( $x ) gibt FALSE zurück, wenn $x = null
cx
Geändert von cortex (03.07.2009 um 14:32:19 Uhr)
Grund: anmerkung
|
03.07.2009, 14:38:29
|
|
Anfänger
|
|
Registriert seit: Jul 2009
Alter: 46
Beiträge: 5
|
|
AW: Booleanwerte in Sessionvariablen
Das Problem ist wohl weniger die Abfrage, sondern eher, dass die Session-Variable weder mit 'true' noch mit 'false' belegt ist. Zumindestens, wenn ich in die Sessiondatei schaue, denn dort steht nur:
eingelogt|b:1: -> eingelogt=Variablen-Name, b=Booleanwert, 1=Länge
Gegenbeispiel:
eingelogt|s:4:"true" -> eingelogt=Variablen-Name, s=Stringwert, 4=Anzahl der Zeichen, "true"=Wert
|
03.07.2009, 14:44:38
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
|
|
AW: Booleanwerte in Sessionvariablen
b:0; ist false
b:1; ist true
Das ist schon korrekt so!
Du hast dich in deinem Postig allerdings mit : und ; vertan
|
03.07.2009, 14:44:52
|
Anfänger
|
|
Registriert seit: Nov 2004
Ort: Düsseldorf
Beiträge: 99
|
|
AW: Booleanwerte in Sessionvariablen
Hi frerd,
der Ausdruck b:1 in der Session-Datei ist korrekt. Bedeutet "b" = boolean und 1 = true. Bei false würde hier 0 stehen. Ich kann mir nur vorstellen, das deine Session in dem Testscript nicht ankommt. Gib doch bitte in der Datei start.php den Inhalt der Session-Variablen mittels
aus. Dann kannst Du sehen, ob die Variable richtig belegt ist.
Gruß
Richard
|
03.07.2009, 15:07:32
|
|
Anfänger
|
|
Registriert seit: Jul 2009
Alter: 46
Beiträge: 5
|
|
AW: Booleanwerte in Sessionvariablen
Hi Woitaschik!
Habe deine Rat befolgt. Die Ausgabe lautet wie erwartet 1. Habe dann noch die Session-Variable an $a übergeben und die Abfrage if(!$a) ausgeführt mit der Ausgabe 'FALSE' bei falsch und 'TRUE' bei wahr, Ausgabe 'TRUE'.
Die Variable wird also korrekt übergeben.
Hier mein Login-Skript:
PHP-Code:
<?php
$logintime=time();
//Session-ID erzeugen (rand()<-Zufallszahl, uniqid()<-ID erzeugen, md5()<-ID verschlüsseln
$token1=md5(uniqid(rand(),true));
$token2=md5(uniqid(rand(),true));
$token3=md5(uniqid(rand(),true));
$token4=md5(uniqid(rand(),true));
$zufall1=$token1.'-'.$token2;
$zufall1=md5($zufall1);
$zufall2=$token3.'-'.$token4;
$zufall2=md5($zufall2);
$sessiid=md5($zufall2.$zufall1); //eigentliche Session-ID erzeugen
session_id($sessiid); //Session-ID setzen
session_start(); //Session mit Session-ID starten
// diverse Session-Variablen setzen und belegen
$_SESSION['zeit']=$logintime; //Startzeit in Session-Variable "zeit" speichern
$_SESSION['eingelogt']=false; //Session-Variable "eingelogt" auf false setzen
$_SESSION['s_id']=session_id(); //Session-Variable "s_id" mit der Session-ID belegen
$s_name=session_name();
$s_id=session_id();
$benutzer=$HTTP_POST_VARS['benutzername']; //Benutzername in Variable schreiben
$pass=$HTTP_POST_VARS['passwort']; //Passwort in Variable schreiben
$status=0; //Berechtigung auf falsch setzen
$hostname=$_SERVER['HTTP_HOST']; //Hostname ermitteln
$pfad=dirname($_SERVER['PHP_SELF']); //Hostpfand ermitteln
$userdatei='user.csv';
$bol=file_exists($userdatei); //Existiert die Datei 'user.csv'?
if($bol) {
$datei=fopen($userdatei,"r"); //Wenn ja, dann öffnen zum lesen
if($datei) { //Wurde die Datei geöffnet?
$dateigroesse=filesize($userdatei); //Dateigröße ermitteln
while(($data=fgetcsv($datei,$dateigroesse,";"))!=false) { //Zeile für Zeile einlesen
if($benutzer==$data[0]) { //Stimmt der Benutzername mit einem Datensatz überein?
$status=1; //Wenn ja, dann Berechtigung auf richtig setzen
break; //Schleife beenden
}
}
fclose($datei); //Datei schließen
}
}
if($status==1) { //Ist die Berechtigung richtig?
if($data[0]==$benutzer) { //Nochmals Benutzername prüfen
if($data[1]==$pass) { //Stimmt Passwort mit Datensatz überein?
$_SESSION['eingelogt']=true;
$test=file_exists('logins.txt');
if($test) {
$offen=fopen('logins.txt','r');
if($offen) {
$groesse=filesize('logins.txt');
$logins=fread($offen,$groesse);
fclose($offen);
}
}
$logins++;
$test=file_exists('logins.txt');
if($test) {
$offen=fopen('logins.txt','w');
if($offen) {
$output=fwrite($offen,$logins);
fclose($offen);
}
}
include('sicherheit.php'); //Session-Sicherheit erzeugen
$_SESSION['codezeit']=$zeitpunkt;
$_SESSION['code']=$code;
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/start.php?'.$s_name.'='.$s_id); //Wenn ja, dann zur Homepage weiterleiten
exit;
}
else {
session_unset();
session_destroy();
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php'); //Wenn nicht, dann zurück?
exit;
}
}
else {
session_unset();
session_destroy();
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php'); //Wenn nicht dann zurück?
exit;
}
}
else {
session_unset();
session_destroy();
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php'); //Wenn nicht, dann zurück?
exit;
}
?>
und das Skript testlogin.php
PHP-Code:
<?php
session_start();
$hostname=$_SERVER['HTTP_HOST'];
$pfad=dirname($_SERVER['PHP_SELF']);
$s_name=session_name();
$s_id=session_id();
if(strpos($pfad,'hp/')>0) {
$pfad=substr($pfad,0,(strpos($pfad,'hp/')+2));
}
if(!isset($_SESSION['eingelogt']) || !$_SESSION['eingelogt']) {
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php');
exit;
}
else {
if($_SESSION['codezeit']<$_SESSION['zeit'] or $_SESSION['codezeit']>time()) {
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php');
exit;
}
else {
$bol=file_exists('sicherheit.csv');
if($bol) {
$datei=fopen('sicherheit.csv','r');
if($datei) {
$dateigroesse=filesize('sicherheit.csv');
$status=false;
while(($data=fgetcsv($datei,$dateigroesse,';'))!=false) {
if($_SESSION['codezeit']==$data[0]) {
if($_SESSION['code']==$data[1]) {
$status=true;
break;
}
}
}
fclose($datei);
}
}
}
}
if($status==false) {
header('Location: http://'.$hostname.($pfad=='/'?'':$pfad).'/main.php');
exit;
}
?>
Wo liegt jetzt der Fehler?
[mod: benutze bitte die code-Tags zur quellcode-Formatierung]
.
Geändert von cortex (03.07.2009 um 15:12:54 Uhr)
Grund: forenrichtlinien
|
03.07.2009, 15:24:49
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
|
|
AW: Booleanwerte in Sessionvariablen
Fürchterlicher Code !!!
Was hampelst du das mit der SessionID rum? Das kann PHP auch alleine.
Schon von Funktionen und include gehört?
Damit kannst du dir sicherlich die meisten der unsäglichen Weiterleitungen ersparen.
PHP-Code:
// voll überflüssig
$_SESSION['s_id']=session_id();
Alles in allem: Undurchblickbar(für mich)
Geändert von DokuLeseHemmung (03.07.2009 um 15:25:58 Uhr)
|
06.07.2009, 10:29:54
|
|
Anfänger
|
|
Registriert seit: Jul 2009
Alter: 46
Beiträge: 5
|
|
AW: Booleanwerte in Sessionvariablen
Danke für eure schnelle Hilfe.
Habe den Fehler gefunden und behoben. Er hat sich an einer vollkommen anderen Stelle versteckt.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 12:47:28 Uhr.
|