Login mit Session ohne Zugriff auf Variablen

PetraB

Mitglied
Hallo,

ich habe jetzt tagelang versucht, das Login Script mit Sessions aus dem Tutorial mit meinen vorhandenen Seiten zum laufen zu bekommen => ohne Erfolg. Nachdem ich nun auch sämtliche Forenbeiträge durchforstet habe, alles erdenkliche ausprobiert habe, ebenfalls ohne Erfolg, frage ich euch nun direkt.

Erstmal, ich arbeite mit PHP 4.3.4 unter Suse Linux 8.1.

Nun zu meinem Problem:
Ich habe das Script dahingehend geändert, dass ich statt MySQL PostgreSQL einsetzen kann. Das scheint soweit alles zu funktionieren. Den header-Aufruf beim Login-Test habe ich auch geändert, ich habe dort eine absolute Url eingetragen sowie die Session-ID drangehängt. Ich bekomme dann auch meine Startseite angezeigt, nur wenn ich dann irgendetwas machen möchte, z.B. den Maßstab wechseln (auf meiner Seite gibt es eine Karte), dann wird das Login wieder aufgerufen. Das bedeutet, dass die Session-Variable beim erneuten Aufbau des Fensters nicht mehr vorhanden ist. Wie kann ich das verhindern? Ich bin für jede Hilfe dankbar!

Ciao
 
Ohne Code kann man nur Vermutungen anstellen. Also poste doch einfach mal relevante Ausschnitte aus deinem Quelltext.

Zu beachten gilt allgemein folgendes:
- Vor dem Starten der Session auch den Namen der Session festlegen, falls nicht session_name() == 'PHPSESSID'!
- Session ID immer über die URL übergeben (falls Cookies nicht gesetzt werden können)
- php.ini Einstellungen überprüfen in Bezug auf Sessions
 
wenn ich nur wüsste, was wirklich relevant ist... aber ich versuche mal mein Glück.

login.php:
Code:
<?php 
  session_start();
  session_register( "session" );
?>
[...]
  <form action="login_test.php" method="post">
    Name:  <input type="text" name="name" size="20">
    Kennwort: <input type="password" name="pwd" size="20">
    <input type="submit" value="Login">
  </form>

login_test.php:
Code:
<?php
  session_start();
  session_register( "session" );
  // Datenbankverbindung aufbauen
  $conn_string = "host=10.0.0.71 port=5432 dbname=benutzer user=root         password=admin";
  $dbconnection = pg_connect($conn_string);

if ($dbconnection != 1)
{
  die ("Keine Verbindung zur Datenbank");
}

$sql = "SELECT id FROM benutzerdaten ".
  "WHERE Nickname like '".$_REQUEST["name"]."' AND ".
    "Kennwort = '".md5 ($_REQUEST["pwd"])."'";
$result = pg_query($sql);
if (pg_num_rows($result) > 0)
{
  $data = pg_fetch_array($result);
  $_SESSION["user_id"] = $data["id"];
  header("Location: http://gis-initiative.map2/test_applet/htdocs/index.php?".SID);
}
else
{
  header("Location: http://gis-initiative.map2/test_applet/htdocs/login.php?fehler=1");
}
?>

checkuser.php:
Code:
<?php
session_start();
session_register( "session" );
if (!isset ($_SESSION["user_id"]))
{
  header ("Location: http://gis-initiative.map2/test_applet/htdocs/login.php");
}
?>

index.php:
Code:
<? 
  include ("checkuser.php"); 
  include("php_funktionen.php");
  CheckClick();
?>
[...]
<SCRIPT LANGUAGE="JavaScript">
<!-- Beginn JavaScript
// Funktion zur Auswahl der Kartenfenstergroesse
function MapSizeSelected()
{
  if (document.forms[0].MapSize.selectedIndex != 0 &&
      document.forms[0].MapSize.selectedIndex !=1)
    document.forms[0].submit();
}
// Ende JavaScript -->
</SCRIPT>
[...]
<FORM METHOD=GET NAME="myform">
[...]
  <SELECT NAME="MapSize" onChange="MapSizeSelected()">
                <OPTION>Map Size</OPTION>
      
                <OPTION>---------------</OPTION>
      
                <OPTION VALUE="400,300"
                      <?php if (($map->width == 400) && ($map->height == 300))
                       echo "SELECTED";?>> 400 x 300</OPTION>
      
                <OPTION VALUE="600,450"
                       <?php if (($map->width == 600) && ($map->height == 450))
                       echo "SELECTED";?>> 600 x 450</OPTION>
      
                <OPTION VALUE="800,600"
                       <?php if (($map->width == 800) && ($map->height == 600))
                       echo "SELECTED";?>> 800 x 600</OPTION>
      
  </SELECT>
</form>

In php_funktionen.php werden die Änderungen ausgeführt.
Code:
<?
session_start();
session_register("session");
[...]
function CheckClick() {
[...]
if ($HTTP_FORM_VARS["MapSize"]) 
  {
    if (ereg("([0-9]+),([0-9]+)",
             $HTTP_FORM_VARS["MapSize"], $MapSizeExtents))
    {
      $dfWidthPix = intval($MapSizeExtents[1]);
      $dfHeightPix = intval($MapSizeExtents[2]);

      $map->set("width",$dfWidthPix);
      $map->set("height",$dfHeightPix);
      
      SetMapExtents($dfMinX, $dfMinY, $dfMaxX, $dfMaxY);
    }
  }
[...]
}

Ich hoffe, es lässt sich erahnen, was gemacht wird. Da der Code sehr umfangreich ist, habe ich das Ganze stark eingeschränkt. Die Karte wird mit PHP Mapscript erzeugt. Als Beispiel für eine mögliche Funktion habe ich jetzt mal die Änderung der Kartengröße gepostet. Vermutlich hat mein Problem etwas mit dem Formular in der index.php zu tun oder?
 
Grundsätzlich solltest du session_register() nicht mehr verwenden. Stattdessen benutze lieber $_SESSION['var'] = Wert (siehe [phpf]session_register[/phpf]).

Hast du mal überprüft, ob die Konstante SID auch wirklich deine Session-ID enthält? Einfach mal ausgeben lassen.
Ansonsten könntest du session_name() . '=' . session_id() anhängen.
 
Also beim Aufruf der index.php nach dem Login wird in der Url die Session-ID korrekt angehängt. Und diese Session-ID befindet sich auch unter /tmp.

Das mit dem session_register() hab ich auch nur unter session_start(), da ich das auch mal irgendwo im Forum gelesen habe. Ich weiß gar nicht, welche Auswirkungen das hat. Meine anderen Variablen übergebe ich auch mit $_SESSION["var"]. Aber ich habe das jetzt auch in $_SESSION geändert.

Ansonsten habe ich auch schon des Öfteren meine php.ini durchgeschaut, aber der Session Abschnitt erscheint mir richtig (register-globals = Off, Sessions enabled). Oder gibt es da weitere relevante Punkte, die ich beachten muss?

Was ist mit dem Formular in der index.php? Muss ich die Session evtl. da irgendwie mit übergeben?
 
Problem gelöst :-)

Ich habe die Session ID in der Datei php_funktionen.php mit <input type="hidden"... mit übergeben, nun funktioniert es!

Vielen Dank für deine Mühe, ludz!

Ciao,

PetraB
 
Zurück