PHP [SQL] Username weitergeben für ein SQL Statement

toxic189

Lieutenant
Registriert
Jan. 2012
Beiträge
773
Hallo freunde,

Ich habe ein Problem an dem ich momentan hänge, und zwar habe ich ein Login Script das wie folgt aussieht (login.php)



PHP:
<?php
    $_db_host = "localhost";            # meist localhost
    $_db_datenbank = "xxx";
    $_db_username = "root";
    $_db_passwort = "xxx";

    SESSION_START();

    # Datenbankverbindung herstellen
    $link = mysql_connect($_db_host, $_db_username, $_db_passwort);

    # Hat die Verbindung geklappt ?
    if (!$link)
        {
        die("Keine Datenbankverbindung möglich: " . mysql_error());
        }

    # Verbindung zur richtigen Datenbank herstellen
    $datenbank = mysql_select_db($_db_datenbank, $link);

    if (!$datenbank)
        {
        echo "Kann die Datenbank nicht benutzen: " . mysql_error();
        mysql_close($link);        # Datenbank schliessen
        exit;                    # Programm beenden !
        }

    ##################################################################

    # Ist die $_POST Variable submit nicht leer ???
    # dann wurden Logindaten eingegeben, die müssen wir überprüfen !
    if (!empty($_POST["submit"]))
        {
        # Die Werte die im Loginformular eingegeben wurden "escapen",
        # damit keine Hackangriffe über den Login erfolgen können !
        # Mysql_real_escape ist auf jedenfall dem Befehle addslashes()
        # vorzuziehen !!! Ohne sind mysql injections möglich !!!!
        $_username = mysql_real_escape_string($_POST["username"]);
        $_passwort = mysql_real_escape_string($_POST["passwort"]);

        # Befehl für die MySQL Datenbank
        $_sql = "SELECT * FROM kunde WHERE
                    gruppen_id='$_username' AND
                    passwort='$_passwort' AND
                    user_geloescht=0
                LIMIT 1";

        # Prüfen, ob der User in der Datenbank existiert !
        $_res = mysql_query($_sql, $link);
        $_anzahl = @mysql_num_rows($_res);

        # Die Anzahl der gefundenen Einträge überprüfen. Maximal
        # wird 1 Eintrag rausgefiltert (LIMIT 1). Wenn 0 Einträge
        # gefunden wurden, dann gibt es keinen Usereintrag, der
        # gültig ist. Keinen wo der Username und das Passwort stimmt
        # und user_geloescht auch gleich 0 ist !
        if ($_anzahl > 0)
            {
            echo "Der Login war erfolgreich.<br>";

            # In der Session merken, dass der User eingeloggt ist !
            $_SESSION["login"] = 1;

            # Den Eintrag vom User in der Session speichern !
            $_SESSION["kunde"] = mysql_fetch_array($_res, MYSQL_ASSOC);

            # Das Einlogdatum in der Tabelle setzen !
            $_sql = "UPDATE kunde SET letzter_login=NOW()
                     WHERE id=".$_SESSION["kunde"]["id"];
            mysql_query($_sql);
            }
        else
            {
            echo "Die Logindaten sind nicht korrekt.<br>";
            }
        }

    # Ist der User eingeloggt ???
    if ($_SESSION["login"] == 0)
        {
        # ist nicht eingeloggt, also Formular anzeigen, die Datenbank
        # schliessen und das Programm beenden
        include("login-formular.html");
        mysql_close($link);
        exit;
        }

		
    # Hier wäre der User jetzt gültig angemeldet ! Hier kann
    # eine Weiterleitung stehen oder etwas, was nur eingeloggte UserUser sehen sollen.
	header("Location: index.php/"); 
	

    ##################################################################

    # Datenbank wieder schliessen
    mysql_close($link);
?>




So nun habe ich eine index.php die ich gesichert habe mit einer Session abfrage.
In dieser index.php habe ich, bzw möchte ich eine abfrage auf Basis des Usernamens erstellen

So nun kommt meine frage wie kann ich den Wert der login.php weiter an die index.php reichen und mit der variabel $_username Arbeiten? sprich mit dieser eine Abfrage gestalten


Beispiel:

PHP:
SELECT * FROM auftrag INNER JOIN kunde ON auftrag.gruppen_id = kunde.gruppen_id WHERE auftrag.gruppen_id='$_username';


Wenn ich da eine Auftragsnummer zb. direkt abfrage dann funktioniert alles wie gewollt.




Ich bin wie immer sehr dankbar für jede Hilfe von euch :)



MFG
Dome :)
 
Du speicherst doch in Zeile 65 die ganzen Daten in der Session. Greif doch darauf zu.
 
Vielen dank für deine Antwort,
wie greife ich direkt auf die Session beinhaltete Daten zu?

Habe mit Sessions leider in dem Zusammenhang und mit Sessions alleine noch nicht ganz sooo viel zu tun.
 
Ähm genauso wie du sie oben zuweist oder auf andere Variablen/Arrays zugreifst (siehe $_POST oben). Sind auch nur ganz normale Variablen, halt nur im Superglobalen $_SESSION-Array.
 
Einfach nach erfolgreichem Login den Username in die Session speichern:
PHP:
 $_SESSION['username'] = $_username;

Und in der index.php:

PHP:
SESSION_START();
.
.
.
$_username=$_SESSION['username'];

SELECT * FROM auftrag INNER JOIN kunde ON auftrag.gruppen_id = kunde.gruppen_id WHERE auftrag.gruppen_id='$_username';
 
Ich würd aber nicht nur den Usernamen sondern auch die User-ID speichern. Die Verknüpfung innerhalb der Tabellen sollte schließlich nicht über Namen sondern numerische IDs erfolgen. Ist einfach so üblich.

Und weils hier wieder mal angebracht ist:
Finger weg von der alten prozeduralen mysql_... - Notation. Gewöhn dich direkt an PDOs, das ist nicht nur effektiver und sauberer, es ist auch noch viel SICHERER. Prepared Statements via PDO sind absolut immun gegen SQL Injection.
 
PHP:
if(isset($_SESSION['username'])) {
	$_username=$_SESSION['username'];
	SELECT * FROM auftrag INNER JOIN kunde ON auftrag.gruppen_id = kunde.gruppen_id WHERE auftrag.gruppen_id='$_username';
}

wirft sonst nur unnötige Fehlermeldungen ... und bitte PDO nutzen.
 
Vielen dank für eure Antworten :)
hat mich direkt auf die richtige spur gebracht und auch zum gewünschten erfolg :)

Da es nur für mich Hobby mäßig ist und es erstmal ums Verständnis geht, habe ich leider noch nie was von PDO gehört muss ich mir mal näher anschauen.





Nächste Frage:

Ich habe nun erfolgreich erreicht das ich beim Login den Username/User ID als SQL Statement verwenden kann.
Nun wäre meine nächste frage wie ich es realisiere das ich Kundengruppe habe wie "Kunden" und "Admin" und "Lager"
Wie bekomme ich eine Gruppenspezifische ausgabe für die Gruppen?

Sprich:
User_1 = Admin
User_2 = Kunde
User_3 = Kunde
User_4 = Lager

Sprich ich füge eine weitere Spalte in der Datenbank hinzu mit der zugehörigen Nummer.
Dann müsste ich doch eine "ifelse" funktion schreiben und jeweils auf 3 verschiedene Dateien dann verlinken oder sehe ich das Falsch?
Und wie in etwa sätze ich dies um?
Bin da ein wenig auf dem Holzweg
 
toxic189 schrieb:
Da es nur für mich Hobby mäßig ist und es erstmal ums Verständnis geht, habe ich leider noch nie was von PDO gehört muss ich mir mal näher anschauen.
Der Aufwand, die korrekte Verwendung von Prepared Statements via PDO zu erlernen, ist nicht sonderlich größer als sich mit all den Fallstricken der prozeduralen Uralt-Notation herumzuschlagen. So gesehen ist es gerade für Einsteiger wichtig, PDO zu lernen.

Sprich ich füge eine weitere Spalte in der Datenbank hinzu mit der zugehörigen Nummer.
Kann man machen, aber spätestens wenn ein User mehreren Gruppen angehört geht das in die Hose.
Tabelle 1: Users (id,name,...)
Tabelle 2: Gruppen (id, bezeichnung,...)
Tabelle 3: UsersInGroups(user_id,group_id)
So wirds gemacht.

Dann müsste ich doch eine "ifelse" funktion schreiben und jeweils auf 3 verschiedene Dateien dann verlinken oder sehe ich das Falsch?
Je nachdem, wie deine Daten organisiert sind.
Aber statt monströser if elsif elsif... Konstrukte solltest du z.B. über Switch ... Case gehen. Ist übersichtlicher. Oder du schreibst dir ne richtige Content Verwaltung, in der du Elemente für Gruppen freigibst oder sperrst.
 
Ok, vielen dank :)
Werde mir bezüglich PDOs mich informieren und dementsprechend die Statements ändern :)

Ja an switch/case habe ich auch schon gedacht wusste nur nicht ob das die bessere Wahl wäre :)
Aber je länger ich mir darüber Gedanken mache, desto eher glaube ich einfach das dies die besser Wahl ist, denn er läuft die Funktion solange durch bis einmal der Punkt erreicht ist an dem die Abfrage stimmt und schickt mich dann dementsprechend weiter?

Fürs Verständnis:
Wenn jeder Kunden unterschiedlich vielen Kundengruppen zugeordnet sein kann, dann brauch ich eine Zwischentabelle (oder auch m:n-Tabelle richtig?).

Das dazugehörige SQL-Statement sähe dann in etwa so aus:

PHP:
SELECT k.* FROM kunden AS k INNER JOIN kunden_zu_gruppen AS kzg ON kzg.kunden_id=k.id INNER JOIN gruppen AS g ON g.id=kzg.gruppen_id WHERE g.id=X

oder einfacher:

PHP:
SELECT k.* FROM kunden AS k INNER JOIN kunden_zu_gruppen AS kzg ON kzg.kunden_id=k.id WHERE kzg.id=X



jetzt auf meine Tabellen eben zugeschnitten?!
 
Zurück
Oben