Eine Frage zu Sessions und Datenbankabfragen

  • Hallo,


    ich habe folgendes vorgehabt:


    index.php -> Datenbank Connection herstellen. Nutzer gibt seine Daten ein. Nutzer Submitted und über Post wird das abgesendete zeug an Session weitergegeben.


    Gleichzeitig will ich auch eine Datenbankabfrage währenddessen machen und die Results ebenfalls an Session weitergeben.

    Folgendes:


    $sql2 = "Select Benutzer_ID from benutzer where EMail = '$n' "; ($n ist hier einfach mal die email Adresse des benutzers)

    $res2=mysqli_query($a, $sql2);

    $row= mysqli_fetch_assoc($res2);

    $test = $row['Benutzer_ID'];

    var_dump($test); <- Das hier liefert mir einen String zurück. Genau den Datensatz den ich möchte.


    Sobald ich $_SESSION["bla"]= $test;

    reinhaue wird die Session variable nicht für die nächste Seite gespeichert. (Es ist ein String)

    Gebe ich aber gleichzeitig testweise ich $_SESSION["bla"]= 'bla'; (ebenfalls ein String) weiter funktioniert es wieder.

    Wieso zum geier nimmt die Session variable den von SQL generierten String nicht an und behält den aber den 'bla' String?

    Ist das ein Referenzproblem?

    Ich hab schon 'ne Ewigkeit gegoogled und komme nicht weiter.


    Ich verstehe ums verrecken nicht wieso.


    Ich freue mich auf Antworten.


    Mit freundlichen Grüßen

    • Enthält der Name der Sessionvariable eventuell nur Ziffern?
    • Was gibt ein var_dump() von $_SESSION nach der Zuweisung aus?
    • Ändert sich etwas am Verhalten, wenn Du die Variable explizit zu (string) cast'est oder strval() verwendest?


    Ein einfaches lauffähiges Testscript zum Reproduzieren wäre bei so etwas sehr hilfreich. Dann sieht man meistens schneller, woran es konkret liegt.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

    • Enthält der Name der Sessionvariable eventuell nur Ziffern?
    • Was gibt ein var_dump() von $_SESSION nach der Zuweisung aus?
    • Ändert sich etwas am Verhalten, wenn Du die Variable explizit zu (string) cast'est oder strval() verwendest?


    Ein einfaches lauffähiges Testscript zum Reproduzieren wäre bei so etwas sehr hilfreich. Dann sieht man meistens schneller, woran es konkret liegt.

    Hallo,


    - der Name der Sessionvariable enthält keine Ziffern

    - ich bekomme string(0) "" zurück.

    - Habe beides versucht. Bei beidem (string und strval())bekomme ich ebenfalls string(0) ""


    Ebenfalls habe ich getestet ob meine variable auch wirklich mit dem Wert der SQL abfrage gefüllt wird.

    Das ist der Fall. Nur bei der Zuweisung zur Sessionvariable verschwindet der Wert wie von Geisterhand.


    Ein einfaches lauffähiges Testscript zum Reproduzieren wäre bei so etwas sehr hilfreich. Dann sieht man meistens schneller, woran es konkret liegt. <- wie stell ich das an? :D

  • wie stell ich das an?

    indem du dein Script auf die zu testende Funktionalität auf einen Fünfzeiler reduzierst z.B.? :)

    Sprich: alles Überflüssige raus, nur eine Variable mit Inhalt füllen und diese dann in der Session speichern und abrufen. Dann ggf erweitern bis der Fehler auftaucht/reproduzierbar ist.

  • Hallo,


    habe eben mit einer Testsite nur das notwendige gemacht und dort hat es geklappt.


    Ich glaube, ich habe herausgefunden wo der Fehler liegt. Ich ging davon aus, wenn ich einmal eine Connection zur Datenbank herstelle habe ich sie permanent?

    Das ist wohl nicht der Fall.


    Ich hab in dieser Funktion eine Datenbankverbindung hergestellt :


    function user_ok($n,$p)

    {

    $a= @mysqli_connect("bla","bla", "bla");

    if ($a === false)

    {

    die("Keine Verbindung möglich");

    }


    $b = @mysqli_select_db($a,"bla");

    if ($b === false)

    {

    die("Datenbank nicht gefunden");

    }


    $sql = "Select * from benutzer where EMail = '$n' AND active='1'";

    $res=mysqli_query($a,$sql);

    if (mysqli_num_rows($res)==0)

    return false;

    else

    {

    $ds=mysqli_fetch_assoc($res);

    if ($ds["Passwort"] != $p){

    return false;

    }

    }

    return true;
    }


    Sobald Login gedrückt wird mache ich folgendes:

    Hier wollte ich die weitere Datenbankabfrage machen, die eben nicht geklappt hat.

    Wenn ich hier in diesem if nochmal seperat eine Datenbankverbindung herstelle klappt es........ -hust-


    if (isset($_POST["Login"])){

    if (user_ok($_POST["E-Mail"],$_POST["Passwort"])){

    $_SESSION["name"]=$_POST["E-Mail"];

    }


    Der Fehler bzw. mein Fehler war(glaube ich), dass ich dachte sobald ich einmal eine Verbindung zur Datenbank hergestellt habe diese dann auch bleibt?!

  • Moin,


    im Allgemeinen solltest du bei deinen Datenbankanfragen auf Prepared Statements setzen. Es ist sehr gefährlich, in Bezug auf sql injection, Nutzereingaben blindlings zu vertrauen ohne diese Eingaben vorher geprüft bzw. gefiltert zu haben.


    Zudem solltest du davon absehen die Datenbankverbindung innerhalb einer Funktion zu initiieren. Entweder in eine separate Datei outsourcen und bei Bedarf einbinden oder global direkt in der jeweiligen Datei initiieren.


    Auch wenn deine Datenbank nicht sonderlich groß sein sollte, sollte man immer nur die auch zu benötigten Spalten ansprechen, sprich anstelle von select * from bebnutzer lieber SELECT email, active FROM benutzer. Dies steigert gerade bei vielen Anfragen / komplexen sql querys die gesamte Performance.

  • Und bitte verzichte auf die Fehlerunterdrückung (@), nutze stattdessen Exceptions (MYSQLI_REPORT_STRICT) und bei Bedarf try/catch-Blöcke.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)