chris: Frage PHP-Bedingungen

hallo zusammen,

ich habe ein ähnliches problem wie in diesem beitrag:

http://forum.de.selfhtml.org/archiv/2009/5/t186810/

nachdem ich diese einfach lösung probiert habem hab ich festgestellt, dass es wunderbar funktioniert.

meine frage wäre nun, ob man den eintrag mit einer "if"beziehung verbinden kann.

da ich mich erst neu in die materie einlese, ist meine erfahrung mit programmieren noch relativ bescheiden.  in worten ausgedrückt lautet mein problem "zähle + 1 pro login aber nicht mehr als +3 innerhalb von 24h."

für eure hilfe wäre ich sehr dankbar.

beste grüße

  1. Hi,

    in worten ausgedrückt lautet mein problem "zähle + 1 pro login aber nicht mehr als +3 innerhalb von 24h."

    Dazu müsstest du zunächst mal die Zeitpunkte der letzten drei Logins mit abspeichern.

    Und dann überlegst du dir die Logik - bei welchem Zahlerstand darf sofort erhöht werden, bei welchem muss erst geprüft werden.

    Wozu das gut sein soll, wäre auch noch interesssant.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi,

      in worten ausgedrückt lautet mein problem "zähle + 1 pro login aber nicht mehr als +3 innerhalb von 24h."

      Dazu müsstest du zunächst mal die Zeitpunkte der letzten drei Logins mit abspeichern.

      Und dann überlegst du dir die Logik - bei welchem Zahlerstand darf sofort erhöht werden, bei welchem muss erst geprüft werden.

      Wozu das gut sein soll, wäre auch noch interesssant.

      MfG ChrisB

      hallo und vielen dank für die antworten.

      ok, das prinzip soll wie folgt aufgebaut sein:

      ich möchte eine loginseite erstellen, wo jemand ein punkt pro login bekommt.
      maximal dürfen 3 punkte pro tag gesammelt werden. außerdem sollen dem user seine punkte angezeigt werden.

      daher war meine erste überlegung:

      $Punkte = $row["Punkte"];
      session_register('Punkte');
      $_SESSION['Punkte'] = $Punkte;

      in Worten:  prüfe Punkte = Feld Reihe Punkte
          prüfe Punkte = der letzten 24h variable > 3 = false

      	if  
      		$result = false  
      		trage keine ein  
      		  
      	else  
      		  
      		$result = true  
      		trage +1 ein  
      	  
      	 mysql\_query("UPDATE xyz SET Punkte=$Punkte WHERE user='$user'");  
      	  
      
      1. Hi,

        bitte zitiere sinnvoll, und nicht einfach alles!

        ich möchte eine loginseite erstellen, wo jemand ein punkt pro login bekommt.
        maximal dürfen 3 punkte pro tag gesammelt werden.

        Was denn nun, pro Tag (Datum) oder pro 24 Stunden?
        Mach' dir klar, dass das ein wesentlicher Unterschied ist.

        daher war meine erste überlegung:

        $Punkte = $row["Punkte"];
        session_register('Punkte');
        $_SESSION['Punkte'] = $Punkte;

        session_register ist veraltet. Nutze ausschliesslich $_SESSION.

        in Worten:  prüfe Punkte = Feld Reihe Punkte
            prüfe Punkte = der letzten 24h variable > 3 = false

        Wie gesagt, dann musst du die Zeitpunkte schon mitspeichern.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Hi,

          bitte zitiere sinnvoll, und nicht einfach alles!

          ich möchte eine loginseite erstellen, wo jemand ein punkt pro login bekommt.
          maximal dürfen 3 punkte pro tag gesammelt werden.

          Was denn nun, pro Tag (Datum) oder pro 24 Stunden?
          Mach' dir klar, dass das ein wesentlicher Unterschied ist.

          daher war meine erste überlegung:

          $Punkte = $row["Punkte"];
          session_register('Punkte');
          $_SESSION['Punkte'] = $Punkte;

          session_register ist veraltet. Nutze ausschliesslich $_SESSION.

          in Worten:  prüfe Punkte = Feld Reihe Punkte
              prüfe Punkte = der letzten 24h variable > 3 = false

          Wie gesagt, dann musst du die Zeitpunkte schon mitspeichern.

          MfG ChrisB

          okay, verstehe. dann ist die richtige formulierung innerhalb von 24stunden.

          soweit kann ich es nachvollziehen. aber wie setzt man sowas in die realität um?

          zunächst müsste ich also weitere felder in der tabelle anlegen.

          in meinem bisherigen code sieht es bisher so aus:

          <?php
          if ($_POST['email'] != "") {

          include_once "connect_to_mysql.php";

          $email = $_POST['email'];
          $pass = $_POST['pass'];
          $remember = $_POST['remember'];

          $email = strip_tags($email);
          $pass = strip_tags($pass);
          $email = mysql_real_escape_string($email);
          $pass = mysql_real_escape_string($pass);
          $email = eregi_replace("", "", $email); $pass = eregi\_replace("", "", $pass);

          $pass = md5($pass);

          $sql = mysql_query("SELECT * FROM xyz WHERE email='$email' AND Passwort='$pass' AND email_activated='1'");
          $login_check = mysql_num_rows($sql);

          if($login_check > 0){

          while($row = mysql_fetch_array($sql)){

          $id = $row["id"];
                  session_register('id');
                  $_SESSION['id'] = $id;

          $Vorname = $row["Vorname"];  
          

          session_register('Vorname');
                  $_SESSION['Vorname'] = $Vorname;

          $email = $row["email"];  
          

          session_register('email');
                  $_SESSION['email'] = $email;

          mysql_query("UPDATE xyz SET last_log_date=now(), Logins=Logins + 1 WHERE user='$user'");

          das heißt mit anderen worten, sobald der user sich einloggt, wird das feld "last_log_date" auf den aktuellen zeitpunkt gesetzt. wie könnte ich den code nun erweitern, dass alle logins der letzten 24h gezählt werden? da fehlt mir gerade die vorstellungskraft und das php-wissen. verdammt.

          danke.

          1. Moin!

            okay, verstehe. dann ist die richtige formulierung innerhalb von 24stunden.

            soweit kann ich es nachvollziehen. aber wie setzt man sowas in die realität um?

            Speichere den Zeitpunkt des letzten gepunkteten Logins. Wenn der beim erneuten Login um mehr als 8 Stunden zurückliegt, gibts wieder einen zusätzlichen Punkt, und du speicherst dann diesen Zeitpunkt.

            Drei Punkte pro 24 Stunden sind ein Punkt pro acht Stunden. Die Aufgabe auf das Hinzuzählen von einem Punkt runterzubrechen ist sinnvoller, als sich mit der Dreierkombi rumzuschlagen.

            - Sven Rautenberg

            1. Hallo,

              okay, verstehe. dann ist die richtige formulierung innerhalb von 24stunden.
              Speichere den Zeitpunkt des letzten gepunkteten Logins. Wenn der beim erneuten Login um mehr als 8 Stunden zurückliegt, gibts wieder einen zusätzlichen Punkt, und du speicherst dann diesen Zeitpunkt.

              das ist eine unzulässige Vereinfachung, finde ich.

              Drei Punkte pro 24 Stunden sind ein Punkt pro acht Stunden.

              Im Mittel. Drei Punkte innerhalb einer Stunde, und danach 23 Stunden Ruhe erfüllen die gestellte Bedingung aber auch. Mit deiner Vereinfachung würden zwei von drei Punkten nicht berücksichtigt.

              Die Aufgabe auf das Hinzuzählen von einem Punkt runterzubrechen ist sinnvoller, als sich mit der Dreierkombi rumzuschlagen.

              Aber eine Verfälschung der Aufgabenstellung.

              Eigentlich müsste man die Zeitpunkte letzten drei Ereignisse speichern. Wenn ein weiteres Ereignis eintritt, prüft man, ob der Zeitpunkt des drittletzten gespeicherten Ereignisses (also des am weitesten zurückliegenden) mindestens 24 Stunden zurückliegt.
              Wenn ja: Punkt, gespeicherte Ereignisse aufrücken. Letztes fällt raus, aktuelles kommt neu rein (FIFO).
              Wenn nein: kein Punkt, aktuelles Ereignis verwerfen.

              So long,
               Martin

              --
              why the heck do you jerk think, that wir ein doppelposting nicht bemerken, wenn you zwischendurch the sprache wechselst?
                (wahsaga)
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hi,

                Drei Punkte pro 24 Stunden sind ein Punkt pro acht Stunden.

                Im Mittel. Drei Punkte innerhalb einer Stunde, und danach 23 Stunden Ruhe erfüllen die gestellte Bedingung aber auch. Mit deiner Vereinfachung würden zwei von drei Punkten nicht berücksichtigt.

                Das verbessert das Konzept aber m.E. sogar.
                Sonst kannst sich der Nutzer durch Login-Logout-Login-Logout-Login seine drei Punkte innerhalb von vermutlich einer Minute holen.
                Wenn echte Aktivität belohnt werden soll, ist einmal alle acht Stunden vielleicht sinnvoller.

                MfG ChrisB

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                1. Hi,

                  Drei Punkte pro 24 Stunden sind ein Punkt pro acht Stunden.

                  Im Mittel. Drei Punkte innerhalb einer Stunde, und danach 23 Stunden Ruhe erfüllen die gestellte Bedingung aber auch. Mit deiner Vereinfachung würden zwei von drei Punkten nicht berücksichtigt.

                  Das verbessert das Konzept aber m.E. sogar.
                  Sonst kannst sich der Nutzer durch Login-Logout-Login-Logout-Login seine drei Punkte innerhalb von vermutlich einer Minute holen.
                  Wenn echte Aktivität belohnt werden soll, ist einmal alle acht Stunden vielleicht sinnvoller.

                  MfG ChrisB

                  rein theoretisch hat martin recht. jedoch macht es aus meiner sicht ebenso sinn, dass man eine zeitsperre einbaut. somit entspricht die idee von chrisb mehr meinen vorstellungen.

                  nachdem die bedingungen nun festgelegt sind, vielleicht wärd ihr so freundlich und könntet mir bei dem code helfen?

                  denn dort seh ich erstmal mit meinen kenntnissen schwarz.

                  <?php
                  if ($_POST['email'] != "") {

                  include_once "connect_to_mysql.php";

                  $email = $_POST['email'];
                  $pass = $_POST['pass'];
                  $remember = $_POST['remember'];

                  $email = strip_tags($email);
                  $pass = strip_tags($pass);
                  $email = mysql_real_escape_string($email);
                  $pass = mysql_real_escape_string($pass);
                  $email = eregi_replace("", "", $email); $pass = eregi\_replace("", "", $pass);

                  $pass = md5($pass);

                  $sql = mysql_query("SELECT * FROM xyz WHERE email='$email' AND Passwort='$pass' AND email_activated='1'");
                  $login_check = mysql_num_rows($sql);

                  if($login_check > 0){

                  while($row = mysql_fetch_array($sql)){

                  $id = $row["id"];
                          session_register('id');
                          $_SESSION['id'] = $id;

                  $Vorname = $row["Vorname"];
                          session_register('Vorname');
                          $_SESSION['Vorname'] = $Vorname;

                  $email = $row["email"];
                          session_register('email');
                          $_SESSION['email'] = $email;

                  $log_date1 = $row["log_date1"];
                          session_register('log_date1');
                          $_SESSION['log_date1'] = $log_date1;

                  $log_date2 = $row["log_date2"];
                          session_register('log_date2');
                          $_SESSION['log_date2'] = $log_date2;

                  $log_date3 = $row["log_date3"];
                          session_register('log_date3');
                          $_SESSION['log_date3'] = $log_date3;

                  mysql_query("UPDATE xyz SET log_date1=now(), log_date2=log_date1, log_date3=log_date2  log_date4=log_date3 WHERE user='$user'");

                  rein theoeretisch müssten es dann doch auch 4 logdates sein, oder? weil der aktuelle login doch immer mit dem am weitesten zurückliegenden gegengeprüft wird. und ich würde denken, dass dann durch sich dann folgendes bild ergibt: jetzt - 8h.(log_date2) - 8h(log_date3) - 8h(log_date4) = 24h bei rauskommen müsste, oder hab ich da einen denkfehler?

                  wie kann ich das mit der zeit im code realisieren?

                  danke.

                  1. Hi!

                    nachdem die bedingungen nun festgelegt sind, vielleicht wärd ihr so freundlich und könntet mir bei dem code helfen?

                    Helfen ja, aber üblicherweise geht es hier um das Helfen beim Verstehen und nicht um das Präsentieren von fertigem Code. Also frag bitte nach, wo genau du ein Verständnisproblem hast. Dazu solltest du soweit Debugging treiben können, um die fehlerhafte Stelle finden zu können. Prüfe also mit Kontrollausgaben (mit var_dump()) ob die Variableninhalte und Ausdrucksergebnisse deinen Vorstellungen entsprechen.

                    if ($_POST['email'] != "") {

                    Prüfe lieber mit empty($_POST['email']), denn wenn $_POST['email'] nicht vorhanden ist, ist das ein eigentlich nicht zulässiger Lesezugriff. empty() und isset() berücksichtigen das Nichtvorhandensein von Array-Elementen und einfachen Variablen. Alle anderen Lesezugriffe erzeugen zumindest eine Notice-Meldung, die man sich beim Programmieren immer anzeigen lassen solle. Sie zeigt nämlich auch auf, wenn beispielsweise durch Tippfehler ein falscher Zugriff erfolgt. error_reporting(E_ALL) am Scriptanfang und nur während der Entwicklung oder eine globale Konfiguration auf der Testmaschine kannst du dafür verwenden.

                    $email = $_POST['email'];
                    $pass = $_POST['pass'];
                    $remember = $_POST['remember'];

                    Das Umkopieren in "einfache" Variablen bringt keine Punkte. Es verschleiert nur die Herkunft von Variablen und ist wegen einer Altlast aus früheren PHP-Tagen leider viel zu oft in Scripten zu sehen.

                    $email = strip_tags($email);
                    $pass = strip_tags($pass);

                    strip_tags() ist in der Regel nicht notwendig. Besonders auf Email-Adressen und Passwörter ist es kontraproduktiv, weil es da völlig legitim ist die <>-Zeichen in einer Form zu verwenden, die wie ein HTML-Tag aussehen.

                    $email = mysql_real_escape_string($email);
                    $pass = mysql_real_escape_string($pass);

                    Das ist schonmal nicht schlecht, aber es steht so separat von der Query. Beim Kopieren der Query, um sie an anderer Stelle zu verwenden, darf man den Teil nicht vergessen.

                    $sql = sprintf("SELECT * FROM xyz WHERE email='%s' AND Passwort='%s' AND email_activated='1'",
                      mysql_real_escape_string($email),
                      mysql_real_escape_string($pass));

                    So hast du alles in einer Anweisung. Der Vorteil von sprintf() ist, dass die Query nicht aufgesplittet werden muss, um die Funktionsergebnisse der mysql_real_escape_string()-Aufrufe einzufügen.

                    $email = eregi_replace("", "", $email); $pass = eregi\_replace("", "", $pass);

                    Zum einen sind die ereg-Funktionen veraltet und missbilligt (deprecated). Zum anderen brauchst du bei keine Unterscheidung nach Groß- und Kleinschreibung, weswegen die Variante ohne i ausreichend wäre. Aber, und zum dritten, brauchst du bei solch einer einfachen Stringersetzung keine Funktionen für Reguläre Ausdrücke, da reicht str\_replace(). Zum vierten ist es in deinem Fall nicht notwendig, die-Zeichen zu entfernen weil sie in dem Kontext, in dem du sie einsetzen willst keinen Schaden anrichten. Im Gegenteil, durch das Entfernen von ` aus dem Passwort (und auch schon mit dem strip_tags()) verfälschst du dieses und vereinfachst damit unter Umständen einen Brute-Force-Angriff.

                    $pass = md5($pass);

                    Das Passwort nicht im Klartext zu speichern ist eine gute Sache. Aber beachte die Verarbeitungsreihenfolge. Du entfernst zuerst aus dem Passwort Zeichenfolgen, die wie HTML-Tags aussehen, behandelst es dann für den SQL-Kontext (mysql_real_escape_string()), entfernst daraus einfach die `-Zeichen und anschließend erst ermittelst du den MD5-Wert. Du bildest den MD5-Wert also nicht aus der Benutzereingabe sondern aus einer veränderten Form. Wenn du nun das Passwort an anderer Stelle vergleichen wolltest, musst du es auch wieder in dieser Form verändern, damit es den gleichen MD5-Wert ergibt. Das könnte aber sinnlos aussehen, wenn du gar keinen SQL-Kontext hast und trotzdem mysql_real_escape_string() darauf anwendest. Wenn du diese Prozedur vergisst, hast du in schwer zu findenden Fällen, dass der Benutzer mit seinem Passwort nicht weiterkommt. Deswegen lass den ganzen Quatsch und bilde den MD5-Wert aus den Rohdaten. Und behandle Werte erst dann für einen bestimmten Kontext, wenn sie in diesen eingefügt werden sollen und nicht irgendwann vorher.

                    $sql = mysql_query("SELECT * FROM xyz WHERE email='$email' AND Passwort='$pass' AND email_activated='1'");

                    Zudem ist es ungünstig, das Ergebnis von mysql_query() in einer Variablen namens $sql abzulegen. Denn SQL ist nur das SQL-Statment. Das Ergebnis ist es nicht mehr. $result wäre schon ein besserer Name, obwohl er immer noch sehr allgemein ist und eventuell in Konflikt mit anderen Results kommen kann.

                    Eine Fehlerbehandlung fehlt ebefalls. Wenn einer auftritt, den du nicht abfragst, ist es sinnlos einfach weiterzuarbeiten und gibt Folgefehler bei den nachfolgenden mysql_*-Funktionen.

                    $id = $row["id"];
                            session_register('id');
                            $_SESSION['id'] = $id;

                    session_register() - wurde dir ja schon gesagt - ist nicht mehr notwendig. Lass diese Zeile einfach weg. Du brauchst heutzutage nur das session_start() am Anfang und greifst dann nur noch auf das $_SESSION-Array lesend und schreibend zu. Die anderen session_*-Funktionen brauchst du nur in Spezialfällen, und die (un)register-Funktionen gar nicht mehr.

                    mysql_query("UPDATE xyz SET log_date1=now(), log_date2=log_date1, log_date3=log_date2  log_date4=log_date3 WHERE user='$user'");

                    Hier fehlt die kontextgerechte Behandlung von $user. Und das Ergebnis von mysql_query solltest du nicht einfach unter den Tisch fallen lassen, denn es gibt dir Auskunft über das Gelingen der Query.

                    Das war schon mal eine ganze Menge allgemeiner Kram, der falsch oder bedenklich ist ...

                    Lo!

  2. http://forum.de.selfhtml.org/archiv/2009/5/t186810/

    in worten ausgedrückt lautet mein problem "zähle + 1 pro login aber nicht mehr als +3 innerhalb von 24h."

    Dazu musst du die zu zählenden Ereignisse einzeln speichern, denn anders kannst du nicht feststellen, was innerhalb von 24 Stunden passiert ist.

    Speicherst du die Ereignisse einzeln, stellt sich allerdings die Frage, ob du überhaupt noch einen Zähler brauchst, denn der Zähler ist ja erstmal nur eine Zusammenfassung der Ereignisse – anstatt den Umweg über einen Zähler zu gehen, kannst du auch direkt eine zählende SQL-Abfrage einsetzen.

    Ob du einen Zähler brauchst oder nicht, hängt von deiner konkreten Aufgabenstellung ab.