Coins auf 250 gestellt aber zeigen trotzdem 0 an

  • Hallo,


    überschrift sagt alles. Habe in der DB eine Tabelle namens "world-coins" erstellt INT( 8 ) und bei "Wie defeniert" auf 0 geschrieben.


    So habe nun von einem User die Coins auf 250 gestellt aber er zeigt mir trotzdem 0 an.


    Falls der User eingeloggt ist, dann selectiere die Coins:



    Woran liegt es


    [Blockierte Grafik: http://fs5.directupload.net/images/151227/temp/svkkcmgh.png]


    €:Falls ich bei SELECT die ` ` oberen Striche wegmache erscheint diese Fehlermeldung: Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'world' in 'field list' )

  • Zum Fehler: das passiert, weil ohne `` der Server versucht das Wort zu "erkennen".
    Mit Unterstrichen geht da so gut wie alles klar. Mit Bindestrich nicht. (Am besten im db-seitig immer nur klein Schreiben und Unterstriche verwenden.)
    (Ich würde empfehlen immer die `` zu verwenden. Es gibt reservierte Namen. Wenn Du Spaltennamen/Tabellennamen immer mit `` schreibst, dann solltest du keine Probleme bekommen)


    Zum Problem:

    PHP
    <?php
    // $stmt = $DB_con->prepare("SELECT `world-coins` FROM user_daten;"); false
    $stmt = $DB_con->prepare("SELECT `world-coins` FROM user_daten WHERE `user_id` = :user_id;"); // oder wie auch immer du den usser identifizierst


    Du hattest immer den gleichen Benutzer (nämlich den Ersten) ausgewählt)


    EDIT:
    BTW: Ausgabe (post, get, aus files oder db) immer maskieren:

    PHP
    // echo $_SESSION['email'] 
    echo htmlspecialchars($_SESSION['email'])
  • Hab's nach einer halben Stunde nach dem Therad auch gelöst^^ hatte es aber so gemacht:



    Oder doch lieber die ID verwenden.?

  • Ids wo immer es geht.
    Beim Login ist klar -- username/email und pw - da kannst du ja keine id nutzen.


    Aber mit dem Laden des Benutzers per email/name solltest Du die id mit selektieren: select id, name, email, pw, [...] from ...
    Wenn Login ok, dann alles andere per id.

  • Jo hast recht ^^.


    Ein kleines Problem: User kauft ein und es wird abgezogen von den Coins: Aber Fehlermeldung sagt das an:


    PHP
    Array ( [0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM w_user_data WHERE `world_coins` = '2250'' at line 1 )[u] erfolgreich gekauft[/u]



    Und es wird nicht abgezogen auch wenn da jetzt der error steht , es steht ja es wurde erfolgreich gekauft:


  • Kann ja nicht gehen
    -- UPDATE ... FROM ?

    SQL
    UPDATE db.tbl
    SET
     column = :value,
     column2 = :value2,
     column = :value3
    WHERE user_id = :user_id


    oder

    SQL
    UPDATE db.tbl (col1, col2, col3) VALUES (1, 2, 3) 
    WHERE user_id = :user_id
  • Jo danke dir hat geklappt. Aber so ist es doch sicher mit :user_id etc also keine SQL-Injection möglich?


    €: Sollte die user_id auch so sein $_SESSION['u_id'] = $row['u_id']; oder ist es egal?

  • Solange Du Platzhalter verwendest - keine Injection möglich.

    Zitat von http://php.net/manual/de/pdo.prepared-statements.php


    Die Parameter für Prepared Statements müssen nicht maskiert werden. Der Treiber übernimmt das automatisch. Wenn eine Anwendung ausschließlich Prepared Statements benutzt, kann sich der Entwickler sicher sein, dass keine SQL-Injection auftreten wird. (Wenn aber trotzdem andere Teile der Abfrage aus nicht zuverlässigen Eingaben generiert werden, ist dies immer noch möglich.)


    Es ist sicher, solange man es richtig anwendet.


    EDIT: zu der id
    Wenn Du die id im Ablauf brauchst, dann ja - klar.

  • Aso ok gut, aber immer wenn ich ID's verwende spinnt es und zeigt keine Coins or etc an.



    Login ID


    Einmal Coins Function:

  • Fehlermeldung?
    if($user->is_loggedin())
    is denn user logged in?
    Warum bindParam? Also ist ok, aber ich finde diese ? -Platzhalter irgendwie nervig :D (Du nutzt PDO, hast also den Vorteil (gegenüber mysqli_), dass Du :platzhalter_statt_fragezeichen verwenden kannst)
    Gibts Fehler bei prepare oder execute?
    Was steckt in $row und/oder in $coins (var_dump($row) zB)

  • User ist sicher eingeloggt. Keine Fehlermeldung bei Execute oder Preapre.


    Var_dump($coins) = NULL


    Var_dump($_SESSION['u_id']) = NULL


    €: Hab mich ein & ausgeloggt, aufeinmal funktonierts. Könnte daran liegen das ich eingeloggt war aber nicht u_id selectiert habe im login-script (SELECT u_id)

  • Hehe - ja. Deine $_SESSION wird wohl nur beim Login erstellt.
    Das sollte selten vorkommen - also so ein Szenario. Man ändert ja nicht ständig was am Code.
    Beim Arbeiten am Code solltest Du aber immer mal wieder vom Anfang aus gehen -- also den niedrigsten Stand annehmen (neuer Benutzer, nicht eingeloggt, keine Session ect).


    BTW Es gibt eine Möglichkeit sowas zu "verhindern". Ich bin Freund von einfachsten cookies/sessions.
    - user logged in -> setze cookie/session mit (nur) id und hash
    - hat user cookie/session und ist cookie/session valid -> db-loadUserById


    Nachteil: mehr db-Abfragen bei jedem Seitenaufruf


    Edit: wollte das dann doch nochmal bissl besser erklären:
    Eine Session ist eine Datei auf dem Server. Ein Cookie im Browser enthält eine id (oder ohne Cookie gibts auch die url-session-id).
    Durch diese id findet der Server die zugehörige Datei. Und in dieser Datei findet sich alles wieder, was Du in $_SESSION[...][...][...]... schreibst.


    Kurz:
    Browser meldet sich beim Server mit id abcdef12345... (via "session-cookie" oder url-session)
    server sucht nach Datei abcdef12345...
    Server lädt Inhalt dieser Datei
    am Ende hast Du via PHP Zugriff auf $_SESSION...


    Jetzt müsste man abwiegen: nur ids in der Session, und bei jedem Seitenaufruf die db abfragen, oder gleich alle Daten in die Session?
    Ein Zugriff (IO) auf die Platte erfolgt sowieso - also könnte man sich einen db Zugriff sparen.
    Aber die Daten in der Session (-Datei) könnten "veraltet" sein. Außerdem sind sie redundant -- so ziemlich alles (name, email, ...) steht in der Session UND in der db.


    Wie man es macht, muss man (sicherlich) für sich selbst entscheiden.

  • Aso nice Sache. Nehmen wir dieses Beispiel:
    <?php
    $lifetime=600;
    session_start();
    setcookie(session_name(),session_id(),time()+$lifetime);
    ?>


    Habe ich mir kurz aus php.net rausgepickt. Was müsste dann in den session_name & session_id() stehen in den Klammern um es so zu machen.


    Habe nie mit Cookies gearbeitet, da ich andere Dinge lerne.

  • als Namen (key) nimmst Du einfach einen String der Dir gefällt.
    Hier im Forum zB gibt es ein Cookie: wcf_userID
    als Wert (Value) nimmst Du zB die user_id (bei Dir glaub ich u_id) und den Passwort-hash (den, den Du in der db stehen hast).


    So kannst Du das Cookie als Login sehen/verstehen (was es am Ende auch ist).


    gibt es Login $_POST? -> lade user per name/email ... konnte gefunden werden? -> check email/name und pw -> ok? -> setze user als logged in
    ODER
    gibt es Session? -> lade user per id ... konnte gefunden werden? -> check pw-hash -> ok? -> setze user als logged in
    ODER
    gibt es Cookie? -> lade user per id ... konnte gefunden werden? -> check pw-hash -> ok? -> setze user als logged in


    Und in allen Scripten fragst Du dann einfach ab, ob user->isLoggedIn()

  • Werde i-wie immer ausgeloggt wenn ich eine Seite betrete wo dieser Code drin ist. So habe ich es auch geschrieben aber es existiert ja der Cookie & manchmal geht es.


  • Bitte Code einrücken -- so sieht doch keiner durch.


    Auf Anhieb sehe ich einen groben Schnitzer:

    PHP
    $stmt->execute();
    if(!$stmt->execute()) {
    print_r($stmt->errorInfo());
    }


    2 mal execute.


    Zur Frage:
    Du setzt ein Cookie in Zeile 2 -- OK
    Du prüfst in Zeile 19, ob $_COOKIE['login_user'] gesetzt ist -- NICHT ok


    Warum:
    $_COOKIE wird erst gesetzt sein, wenn die Setie erneut geladen/aufgerufen wird.
    $_COOKIE beinhaltet in diesem Moment den Zustand als der Benutzer die Seite aufgerufen hatte.


    Eine Lösung wäre:

    PHP
    /* functioniert nicht if(!isset($_COOKIE['login_user'])) {
    session_destroy();
    unset($_SESSION['email']);
    header('location: page.php');*/
    if(!$user->is_loggedin()){ 
        header('location: page.php');
    }
  • Nein, du rufst die Funktion execute auf .. lösung A:

    PHP
    #...
    $stmt->BindParam(1, $_SESSION['u_id']);
    if(!$stmt->execute())#..


    wenn du den Result danach noch brauchen solltest B:

    PHP
    #...
    $stmt->BindParam(1, $_SESSION['u_id']);
    if(!$lb_result = $stmt->execute())#..


    meiner Meinung nach unschön.. C:

    PHP
    #...
    $stmt->BindParam(1, $_SESSION['u_id']);
    $lb_result = $stmt->execute();
    if(!$lb_result)# ...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!