morpheuz: Login mit Sessions funktioniert nicht

Hallo,

habe in meinem Login irgendwo einen Fehler. Ich habe das Formular login.php wo ich die daten eingeben muss (user und passwort) wenn man das ausfüllt und nach betätigung des Login Buttons kommt man auf login_a.php wo die daten geprüft werden. Die Daten werden auch richtig übergeben - habe ich mit einer echo ausgabe geprüft. Die Spalten- und Tabellenbenennung in der mySQL-DB stimmen ebenfalls - ich finde absolut den fehler nicht - vielleicht ihr?

+-------------------------------------------+
|login.php                                  |
+-------------------------------------------+

<?php
session_start ();

print "<br>

Bitte loggen Sie sich ein.<br><br>";

if (isset ($_REQUEST["fehler"]))
{
  echo "Die Zugangsdaten waren ungültig.";
}
print "<form action='login_a.php' method='post'>

<table border='0'>
<tr>
<td>Benutzername:</td><td>
<input type='text' class='textinput' size='30' name='user'></td></tr><tr>
<td>Passwort:</td><td>
<input type='password' class='textinput' size='30' name='pass'></td></tr>

<tr>
<td>&nbsp;</td><td align='right'><input type='submit' class='submit' value='Login'>
</td>

</tr>
</table>
</form>";

print "Session ID: " . SID;
?>

+-------------------------------------------+
|login_a.php                                |
+-------------------------------------------+
<?php

// Session starten
session_start ();
require "configs.php";
// Datenbankverbindung aufbauen
$connectionid = mysql_connect ($dbhost, $dbuser, $dbpass);
if (!mysql_select_db ($dbname, $connectionid))
{
  die ("Keine Verbindung zur Datenbank");
}

$sql = "SELECT * FROM users WHERE (user like '".$_REQUEST["user"]."') AND (pass = '".md5 ($_REQUEST["pass"])."')";
$result = mysql_query ($sql);

if (mysql_num_rows($result) > 0) {

// Benutzerdaten in ein Array auslesen.
  $data = mysql_fetch_array ($result);

// Sessionvariablen erstellen und registrieren
  $_SESSION["name"] = $data["name"];
  $_SESSION["user"] = $data["user"];

header ("Location: index.php");
}
else {
  header ("Location: login.php?fehler=1");
}
?>

+-------------------------------------------+
|Datenbank "users"                          |
+-------------------------------------------+

id | user | pass | name
----------------------------
1   user1   1234   User 1
2   user2   2345   User 2
3   user3   3456   User 3

----------------------------------------------------

in der login_a.php wird die datei configs.php per require reingerufen, da sind lediglich die Datenbank-Zugangsdaten als Variablen ($dbname etc) drin gespeichert - und die stimmen auch
alle.

Ich hoffe, ich konnte es so deutlich wie möglich machen - Bitte helft mir dabei, sonst werde ich noch verrückt mit den Sessions ;-)

ciao morpheuz

  1. Hallo nochmal,

    hatte vergessen zu erwähnen was er bzw. was PHP nicht macht. Nach der Logineingabe springt die Seite direkt auf login_a.php testet die Daten und schickt mich wieder zurück auf die login.php?fehler=1

    ciao morpheuz

  2. hi,

    $sql = "SELECT * FROM users WHERE (user like '".$_REQUEST["user"]."') AND (pass = '".md5 ($_REQUEST["pass"])."')";

    echo sql;

    -> copy und paste dieses query-strings -> direkt auf der DB ausführen lassen (administrationsoberfläche oder phpMyAdmin)

    ergebnis?

    gruß,
    wahsaga

    --
    I'll try being nicer if you'll try being smarter.
    1. hallo,

      ergebnis?

      habs getestet und habe beim SQL-Statement die md5 Verschlüsselung raus genommen.

      Das Ergebnis vor Herausnahme ist folgender:

      SELECT * FROM spd_users WHERE (user like 'test') AND (pass = 'asdf')

      das ist auch richtig, habs im mySQL Control Center getestet, dann zeigt er mir den Datensatz an.

      Er muss allerdings nun die Daten erfolgreich annehmen, da sonst die Fehlermeldung kommen würde, daher denke ich dass ich datenbankprobleme ausschliessen kann.

      morpheuz

      1. hi,

        habs getestet und habe beim SQL-Statement die md5 Verschlüsselung raus genommen.

        warum herausgenommen?

        Das Ergebnis vor Herausnahme ist folgender:

        SELECT * FROM spd_users WHERE (user like 'test') AND (pass = 'asdf')

        das ist auch richtig, habs im mySQL Control Center getestet, dann zeigt er mir den Datensatz an.

        ist das passwort in der DB jetzt verschlüsselt oder nicht ...?

        gruß,
        wahsaga

        --
        I'll try being nicer if you'll try being smarter.
        1. hallo

          ist das passwort in der DB jetzt verschlüsselt oder nicht ...?

          nein war es nicht - deswegen habe ich md5 auch rausgenommen. Ich habe jetzt den Fehler denke ich mal herausgefunden - weiß allerdings nicht wie ich es beheben soll.

          Problem ist, dass er in der login_a.php nach dem er den test macht, ob der user gültig ist, die SESSION-Werte registriert und in die SESSION-Variablen speichert. Diese scheint er aber nicht weiter an das zu kontrollierende Skript zu übergeben (checkuser.php) das auf jeder seite per include eingebunden wird. Warum keine Ahnung hier noch mal die login_a.php und das zu kontrollierende Skript:

          login_a.php
          -------------------------------------------
          <?php

          // Session starten
          session_start ();
          require "configs.php";
          // Datenbankverbindung aufbauen
          $connectionid = mysql_connect ($dbhost, $dbuser, $dbpass);
          if (!mysql_select_db ($dbname, $connectionid))
          {
            die ("Keine Verbindung zur Datenbank");
          }

          $sql = "SELECT * FROM users WHERE (user like '".$_REQUEST["user"]."') AND (pass = '".$_REQUEST["pass"]."')";
          $result = mysql_query ($sql);

          if (mysql_num_rows ($result) > 0)
          {
            // Benutzerdaten in ein Array auslesen.
            $data = mysql_fetch_array ($result);

          // Sessionvariablen erstellen und registrieren
            $_SESSION["id"] = $data["id"];
            $_SESSION["name"] = $data["name"];
            $_SESSION["user"] = $data["user"];

          header ("Location: index.php?modul=normal");
          }
          else
          {
           print $sql ."<br>";
           print $_REQUEST["user"]. " und " . $_REQUEST["pass"]. " und SessionID: " .SID;

          //header ("Location: login.php?fehler=1");
          }
          ?>

          ----------------------------------------
          checkuser.php
          ----------------------------------------

          <?php
          session_start ();
          if (!isset ($_SESSION["id"]))
          {
            header ("Location: login.php");
          }
          ?>

          ----------------------------------------

          warum gibt er die Variable id nicht weiter?

          ciao morpheuz

          1. Hallo zusammen,

            habe den Fehler gefunden - es liegt daran, dass die SESSION kein Cookie ablegt, ich habe das Formular mit der SID angehängt uns siehe da - es hat funktioniert!

            Danke für eure Hilfe!

            ciao morpheuz

    2. servus nochmal,

      der fehler liegt denke ich mal an der überprüfung auf den restlichen Seiten ob die SESSION noch existiert.

      <?php
      session_start ();
      if (!isset ($_SESSION["user"]))
      {
        header ("Location: login.php");
      }
      ?>

      ist das falsch ?

      ciao morpheuz

  3. Hi morpheuz!

    Das wird zwar nicht der Fehler sein, aber ersetze die relative URL in

    header ("Location: index.php");

    doch durch header ("Location: http://www.mysite.com/index.php");

    da auf Location immer eine absolute URL folgen muss.

    ---------------------------------------------------------

    Grüße,

    Fabian St.

    1. hi fabian,

      doch durch header ("Location: http://www.mysite.com/index.php");

      ist aber lokal auf dem rechner

      ciao morpheuz

      1. Hi,

        doch durch header ("Location: http://www.mysite.com/index.php");

        ist aber lokal auf dem rechner

        das spielt keine Rolle. Wenn es bei dir lokal auf dem Rechner liegt, muss es korrekt dann eben z.B.

        header ("Location: http://localhost/index.php");

        heissen.

        Grüsse
        Frankie

        1. Moin!

          das spielt keine Rolle. Wenn es bei dir lokal auf dem Rechner liegt, muss es korrekt dann eben z.B.

          header ("Location: http://localhost/index.php");

          Schlauer ist es, den verwendeten Hostnamen aus $_SERVER['HTTP_HOST'] zu nehmen. Dann muß man diese Redirects vor dem Hochladen nicht mehr an den eigentlichen Server anpassen.

          Außerdem: Was ist, wenn "localhost" gar nicht der eingerichtete virtuelle Host der Testdomain ist? :-P

          - Sven Rautenberg

          1. Hi Sven,

            Schlauer ist es, den verwendeten Hostnamen aus $_SERVER['HTTP_HOST'] zu nehmen. Dann muß man diese Redirects vor dem Hochladen nicht mehr an den eigentlichen Server anpassen.

            Ja, das wäre besser.

            Außerdem: Was ist, wenn "localhost" gar nicht der eingerichtete virtuelle Host der Testdomain ist? :-P

            Das stimmt, daher schrieb ich auch "[...] z.B. [...] localhost [...]".

            Grüsse
            Frankie