Session wird nicht gespeichert/gestartet

Also bin zur Zeit am programmieren eines “Clanregisters” und nu hab ich ein Adminmenu programmiert.
Der Login funktioniert mit Session, aber wenn ich richtige Logindaten eingebe, speichert es nicht die Session-Variablen.

hier mal mein Script:

[code]<?
session_start();

// DB verbinden
include ('includes/config.php');


// Status prüfen
if($s_user_s == "logged")
{
echo '<script type="text/javascript">
'; } else {
	// Formular-Daten prüfen
	if(isset($_POST['submit'])) {
		if(!empty($_POST['userid'])) {
			if(!empty($_POST['pass'])) {
					

		
				// Formulardaten festlegen
					$f_user = $_POST['userid'];
					$f_pass = $_POST['pass'];
				
			
				// Daten des Admins überprüfen und ausgeben wenn gültig
					$abfrage = "SELECT * FROM cr_user WHERE userid LIKE '$f_user'";
					$ergebnis = mysql_query($abfrage);
					while($row = mysql_fetch_object($ergebnis))
					{
											
						// Passwort verschlüsseln
							$pw_verschlüsselt =  md5($f_pass);
							
						// Eingeloggt wenn Passwort stimmt
							if($pw_verschlüsselt == $row->password) {
					
								// Session festlegen
									session_register("s_user_n");
									session_register("s_user_s");
									session_register("s_user_p");
									$s_user_n = $row->userid;
									$s_user_s = "logged";
									$s_user_p = $f_pass;
									
									echo '<img src="images/loading.gif" alt="loading...">';
									echo '<script type="text/javascript">
'; } else { echo 'Ihre Eingaben waren falsch!'; }
					}
			} else { echo 'Password eingeben!<br />'; }
		} else { echo 'UserID eingeben!<br />'; }
	}



} // <-- Ende Status Prüfung



// HTML : Formular
  
  // Formular
	if($s_user_s == "logged") { } else { include('sites/login.html'); }

?>
[/code]
Also ich kann keinen Fehler erkennen o0 und bei meinen Cookies zeigt es auch ne Sessid an… und nu weis ich nich mehr weiter.

…so wie das Script oben ist, funktioniert es z.B. bei Funpic.de

hat glaub was damit zu tun, dass register global hier off ist!

session_register ist veraltet und sollte nicht mehr genutzt werden.

Und “alle” Datensätze mit dem Usernamen auszulesen, und dann in einer Schleife darüber zu laufen (wie viele soll’s denn davon geben, etwa mehr als einen?), ist im allgemeinen auch Unfug.
Man macht eine Abfrage, in der man nach “allen” Datensätzen suchen lässt, bei denen Username und Passwort mit den eigegebenen übereinstimmen - und zieht dann aus der Anzahl gefundener Datensätze den passenden Schluss.
Und MD5 kennt MySQL auch, das braucht man also auch nicht noch separat in PHP anwenden.

Hi,

wie chrisb schon meint, der Skript ist völlig veraltet.

Ich werde ihn kurz mal umarbeiten.

Weißt du eigentlich, dass man niemals Umlaute in Variablen verwenden darf?

MfG, xcube

//edit: :neutral_face: zu langsam…
ich sehe zwar keinen fehler im script aber es könnte sein das die funktion session_register inzwischen aus php entfernt wurde bzw nicht mehr funktioniert.

[quote]Warnung
Diese Funktion ist seit PHP 5.3.0 DEPRECATED (veraltet) und wird in PHP 6.0.0 ENTFERNT. Sich auf diese Funktion zu verlassen ist in keiner Weise empfehlenswert.
php-manual[/quote]
siehe hier

normalerweise verwendet man für session variabeln das superglobale $_SESSION array.
tut zu sessions gibt hier
:ps:

if($s_user_s == "logged") { } else {

das geht auch so:

if($s_user_s != "logged") {

in Sachen php steh ich noch in den Kinderschuhen und lerne nur von tutorials usw…

Naja was kann ich durch Session ersetzten? Cookies etwa?

[quote]Man macht eine Abfrage, in der man nach “allen” Datensätzen suchen lässt, bei denen Username und Passwort mit den eigegebenen übereinstimmen - und zieht dann aus der Anzahl gefundener Datensätze den passenden Schluss.[/quote] Wie soll ich es sonst machen, kenne keine andere Möglichkeit :frowning:

[quote]Und MD5 kennt MySQL auch, das braucht man also auch nicht noch separat in PHP anwenden.[/quote] Ich muss doch erstmal dass eingegebene Passwort in md5 umwandeln und dann in die DB reinschreiben…

Wer hat etwas von ersetzen gesagt?

Man benutzt $_SESSION, und gut is’.

Die andere Möglichkeit nannte ich dir doch gerade!

Wird sind doch hier an der Stelle, wo es ums Auslesen bzw. Vergleichen geht - wo soll da das reinschreiben interessant sein?

MySQL kennt eine Funktion namens MD5(), und die kann man auch in Statements wie INSERT/UPDATE und SELECT verwenden.

So ich habe den Skript mal ein wenig umgearbeitet:

[code]

<?php session_start(); // DB verbinden include ('includes/config.php'); // Status prüfen if($_SESSION['logged_in'] == 1) { header('Location: index.php'); } else { // Formular-Daten prüfen if(isset($_POST['submit'])) { if(!empty($_POST['userid']) && !empty($_POST['pass'])) { // Formulardaten festlegen $f_user = $_POST['userid']; $f_pass = $_POST['pass']; // Daten des Admins überprüfen und ausgeben wenn gültig $abfrage = "SELECT * FROM cr_user WHERE userid = '" . $f_user . "'"; $ergebnis = mysql_query($abfrage); if($row = mysql_fetch_object($ergebnis)) { // Passwort verschlüsseln $pw_verschluesselt = md5($f_pass); // Eingeloggt wenn Passwort stimmt if($pw_verschluesselt == $row->password) { // Session festlegen $_SESSION['logged_in'] = 1; header('Location: index.php'); } else { echo 'Ihre Eingaben waren falsch!'; } } } else { echo 'Alles eingeben!
'; } } } // Ende Status Prüfung // HTML : Formular // Formular if($_SESSION['logged_in'] == 1) { //... } else { include('sites/login.html'); } ?>[/code]

Ist aber ungetestet, da es mir zu blöd ist, extra eine Datenbank etc. anzulegen.

MfG, xcube

Kommt folgender Fehler:

Warning: Cannot modify header information - headers already sent by (output started at /users/ahrtas/www/register/control/includes/config.php:1) in /users/ahrtas/www/register/control/login.php on line 11

Schwer zu glauben, dass du überhaupt mal in irgendein Tutorial reingeschaut haben willst …

google.com/search?q=Warning: … ready+sent

Das liegt an der header()-Weiterleitung (Die hab ich genutzt, da JS nicht zuverlässig ist).
Ich habe jetzt aber nicht mehr die Zeit, eine Alternative zu überlegen.

Ändere einfach die header-Zeilen in eine Link-Weiterleitung um.

MfG, xcube

ja das header-Problem hab ich nicht mehr…
aber wenn jetzt meine Session-variablen richtig gespeichert sind, sehe ich immer noch keinen Adminbereich…

index.php

[code]<?php
session_start();

// DB verbinden
include ('includes/config.php');



// Logindaten prüfen

$abfrage = "SELECT * FROM cr_user WHERE userid LIKE '$s_user_n'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{

	// Passwort verschlüsseln
	$pw_verschluesselt = md5($s_user_p); 

	if($_SESSION['s_user_s'] == 'logged'){
	  if($pw_verschluesselt == $row->password){
		if($row->typ == "-1")
		{
		
			// Adminbereich laden
	
			ob_start();
			include "contents/start.php";
			$content = ob_get_clean();
			
			$data = array(	
			'content' => $content,
			);
			$template = file_get_contents('templates/admin1/design.html');
			foreach ($data as $key => $value) { $template = str_replace('{' . $key . '}', $value, $template); }

			echo $template;

		} else {  }
	  } else {  }
	} else {  }
}

?>[/code]

und start.php die in die index eingefügt wird:

[code]<?php

session_start();

// Config Laden
include ('includes/config.php');



// Logindaten prüfen

$abfrage = "SELECT * FROM cr_user WHERE userid LIKE '$s_user_n'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{

	// Passwort verschlüsseln
	$pw_verschluesselt = md5($s_user_p); 

	if($_SESSION['s_user_s'] == 'logged'){
	  if($pw_verschluesselt == $row->password){
		if($row->typ == "-1")
		{
		/// -- Seiten-Inhalt --		
			
			
			// Einträge ermitteln
			
			/// Allgemein: Version
	
				$abfrage = "SELECT * FROM cr_config";
				$ergebnis = mysql_query($abfrage);
				while($row = mysql_fetch_object($ergebnis))
				{
				$version = $row->status;
				}

			// Einträge: Gesamt, Aktiviert, Deaktiviert       
				$gesamt = mysql_query("SELECT * FROM cr_clans");
				$entry1 = mysql_num_rows($gesamt);
				
				$frei = mysql_query("SELECT * FROM cr_clans WHERE status Like '1'");
				$entry2 = mysql_num_rows($frei);
		
				$closed = mysql_query("SELECT * FROM cr_clans WHERE status Like '0'");
				$entry3 = mysql_num_rows($closed);
		
			/// User: Gesamt, Neuester
				$user = mysql_query("SELECT * FROM cr_user");
				$user1 = mysql_num_rows($user);
				
				$abfrage = "SELECT * FROM cr_user ORDER BY id DESC LIMIT 1";
				$ergebnis = mysql_query($abfrage);
				while($row = mysql_fetch_object($ergebnis))
				{
				$user2 = $row->userid;
				}		
				
				
			/// Seite laden
	
				$data = array(	
				'version' => $version,
				'entry1' => $entry1,
				'entry2' => $entry2,
				'entry3' => $entry3,
				'user1' => $user1,
				'user2' => $user2,
				);
				$template = file_get_contents('sites/start.html');
				foreach ($data as $key => $value) { $template = str_replace('{' . $key . '}', $value, $template); }
		
				echo $template;


		/// -- Seiten-Inhalt ENDE --
		} else {  }
	  } else {  }
	} else {  }
}

?>[/code]

woran liegt dass es jetzt? -.-

Sry… bin manchmal echt etwas dumm. -.-

Habs nach einwenig rumbasteln hinbekommen thx für die Hilfe und den “frischen” Code. :wink:

Wie kann ich Daten aus einem Formular einem script übergeben wenn global_register auf off is??

Genau so, wie du auch Sessions ohne register_globals speicherst - register_globals war immer schon die Lösung für einfachen Code. Die Beschäftigung mit Global-Arrays ist Pflicht, vor allem wo es register_globals (zum Glück) nicht mehr lange geben wird - Post- und Get-Daten findest du ihn den Superglobalsvariablen $HTTP_POST_VARS[‘formularfeldname’], $HTTP_GET_VARS[‘formularfeldname’] bzw. $HTTP_REQUEST_VARS[‘formularfeldname’] für beide zusammen.

Danke funktioniert!

Ahm habt ihr nen Link zu ner Seite mit Global-Arrays, dass ich eben nicht immer hier fragen muss sondern auf der Seite schaue und wenn ich nicht weiter weis dann erst hier im Forum frage…?

Dann muss ich halt nich wegen jedem kleinen Problem euch damit nerven. :wink:

php.net/manual/en/language.v … lobals.php
Und da kannst du auch bei anderen Fragen, zu Funktionen oder sonstwas, immer erst schauen …

danke für den Link!

Sorry aber muss jetzt doch nochmal fragen :p da ich keinen Fehler erkenne, aber das Script auch nicht richtig läuft -.-

also hier erst mal die navi.php

[code]<?php

session_start();

// Standart-Links ausgeben
$abfrage = "SELECT urlname, url, typ FROM cr_navi WHERE typ LIKE '0'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
$t_sitename = $row->urlname;
$t_url = $row->url;
			
echo '<a href="'.$t_url.'" class="navi_link">'.$t_sitename.'</a>';
}


// Logindaten prüfen

$abfrage = "SELECT * FROM cr_user WHERE userid LIKE '" . $_SESSION['s_user_n'] . "'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{

	// Passwort verschlüsseln
	$pw_verschluesselt = md5($_SESSION['s_user_p']); 

	if($_SESSION['logged_in'] == 1){
	  if($pw_verschluesselt == $row->password){
		if($row->typ == 1 or $row->typ == "-1")
		{

			// Html : Dropdown

				echo '<div id="sample_attach_menu_parent_1" class="sample_attach">Userlogin</div><div id="sample_attach_menu_child_1">';


			// Navigation: Userlogin
			$abfrage = "SELECT urlname, url, typ FROM cr_navi WHERE typ LIKE '1'";
			$ergebnis = mysql_query($abfrage);
			while($row = mysql_fetch_object($ergebnis))
			{
			$t_sitename = $row->urlname;
			$t_url = $row->url;
			
			echo '<a class="sample_attach" href="user/'.$t_url.'">'.$t_sitename.'</a>';
			}


			echo '<script type="text/javascript">

at_attach(„sample_attach_menu_parent_1“, „sample_attach_menu_child_2“, „hover“, „y“, „pointer“);

';
		} else { echo '<a href="add.php" class="link"><b>Eintragen</b></a>'; }
	  } else { echo '<a href="add.php" class="link"><b>Eintragen</b></a>'; }
	} else { echo '<a href="add.php" class="link"><b>Eintragen</b></a>'; }
}

?> [/code]

Nun mein Problem ist, wenn man nicht eingeloggt ist, sollte eigentlich der link „Eintragen“ eingeblendet werden (ganz unten im Script), tut es aber nicht… ich kann soweit keinen Fehler erkennen, aber dieses Problem ist bei mehreren Dateien/Scripten der Fall mit dem gleichen „Aufbau“ also komplett gleiche „Logindaten prüfen“-Funktion.

Was ist falsch…? heul

} else { echo '<a href="add.php" class="link"><b>Eintragen</b></a>'; } } else { echo '<a href="add.php" class="link"><b>Eintragen</b></a>'; } } else { echo '<a href="add.php" class="link"><b>Eintragen</b></a>'; } }
Warum gibt’s hier gleich drei Stellen, an denen der Link möglicherweise ausgegeben werden könnte?

if($_SESSION['logged_in'] == 1){ if($pw_verschluesselt == $row->password){
Wenn ich bereits als eingeloggt in der Session drin stehe - warum willst du dann noch mal das Passwort überprüfen?
Und wenn ich noch nicht eingeloggt bin - dann ist die erste Bedingung nicht erfüllt, also wird der Passwortvergleich dann überhaupt nicht durchgeführt …

… erscheint dir das nicht ein bisschen unlogisch?

Du solltest mit ein bisschen mehr Logik an die Sache rangehen.

Derzeit scheinst du dir irgendwas zusammenzuscripten - wenn’s dann durch Zufall irgendwie läuft, dann fein, und sonst - grosse Ratlosigkeit.

So einen Ablauf kann man sich auch im groben vorher mal auf Papier aufmalen - als Flussdiagramm oder Pseudocode.
Dann fällt es auch leichter, das anschliessend in ordentlichen Code umzusetzen - als wenn man gleich drauf los programmiert, ohne sich vorher ausreichend Gedanken um einen sinnvollen und in sich logischen Ablauf gemacht zu haben.

drei if-anfragen = drei else stellen mit dem link…

1-if. also bei dem ersten wird der login-status überprüft, wenn falsch dann kommt der link
2-if. wenn 1-if korrekt ist, aber das passwort falsch, kommt trotzdem der link
3-if. wenn 1-if und 2-if korrekt sind, aber Account-Typ falsch, dann kommt trotzdem der link

Ergebnis = Wenn aber alle drei richtig sind, werden die Links für den Userlogin angezeigt.

Wenn die Login-Überprüfung an allen drei if-anfragen scheitert, wird nicht der link in den else angezeigt(garnichts wird angezeigt), ist man aber eingeloggt, werden die Links für den Userlogin einwandfrei angezeigt.

Test: ahrtas.bplaced.net/register/