chris: php datetime currentdate in tabelle eintragen

hallo,

ich möchte mit meinem loginscript festlegen, dass die letzten loginzeiten eines users in einer tabelle x gespeichert werden.

dazu stehen die folgenden drei felder bereit: Eintrag (auto increment), Datum und ID.

in einer weiteren tabelle y sollen unter einem bestimmten feld punkte zugeordnet werden, maximal jedoch nicht mehr als 3 innerhalb von 24h.

dazu habe ich folgende idee:

in der tabelle x werden nun erstmal drei loginzeiten mit der entsprechend dazugehörigen id aus tabelle y gespeichert. diese liegen alle innerhalb der letzten 24h. es soll also geprüft werden, ob die drei loginzeiten mehr als 24h zurückliegen, wenn ja, dann sollen die einträge in der tabelle x gelöscht werden. sind bereits drei loginzeiten vorhanden und liegen diese jeweils nicht länger als 24h zurück, soll nichts passieren. mein bisheriger quelltext sieht so aus:

...
...
...
mysql_query("UPDATE y SET last_log_date=now(), whole_logins=whole_logins + 1 WHERE id='$id'");

//Tabelle x mit Loginzeiten füllen
mysql_query("DELETE FROM x WHERE Datum=current_date()-24h WHERE ID='$id'");
mysql_query("SELECT COUNT(*) FROM x WHERE ID='$id'");
$result = mysql_result($result,3);

if($result == 3)
{

		}  
	else  
		{  

mysql_query("INSERT INTO x (Datum, ID) VALUES (current_date(),'$id') ");
mysql_query("UPDATE y SET punkte=punkte + 1 WHERE id='$id'");

}

}

in die tabelle x ist das feld "Datum" als timestamp klassifiziert, allerdings wird mir nur das datum korrekt angezeigt, bei der entscheidenden uhrzeit jedoch nur 00:00:00. ich habe bereits mktime() im quelltext anstatt current_date() ausprobiert, dabei hatte er mir dann aber gar kein eintrag mehr in die tabelle geschrieben. ein weiteres problem ist, dass mir mehr als drei einträge in die tabelle geschrieben.

vielleicht kann mir jemand den fehler zeigen?

vielen dank.

  1. Hi,

    in einer weiteren tabelle y sollen unter einem bestimmten feld punkte zugeordnet werden, maximal jedoch nicht mehr als 3 innerhalb von 24h.

    Wenn du ein Thema wieder aufgreifst, dass du hier bereits zu diskutieren begonnen hast - dann sei doch bitte so nett, auch den Link zur ursprünglichen Diskussion anzugeben. Dann sind auch alle Mitleser schneller im Bilde, was du schon hast, was dir schon vorgeschlagen wurde, etc.

    http://forum.de.selfhtml.org/archiv/2010/7/t198827/

    //Tabelle x mit Loginzeiten füllen
    mysql_query("DELETE FROM x WHERE Datum=current_date()-24h WHERE ID='$id'");

    Wenn du dir selber irgendeine Phantasie-Syntax ausdenkt, wird das wohl nichts werden.

    Schau dir bitte die Beschreibung der Datums- und Zeit-Funktionen im Handbuch an; http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

    in die tabelle x ist das feld "Datum" als timestamp klassifiziert, allerdings wird mir nur das datum korrekt angezeigt, bei der entscheidenden uhrzeit jedoch nur 00:00:00.

    Und das wundert dich wirklich, wenn du in diese Spalte das Ergebnis einer Funktion eintragen lässt, deren Name current_date() lautet - Betonung auf *DATE* ...?

    ich habe bereits mktime() im quelltext anstatt current_date() ausprobiert, dabei hatte er mir dann aber gar kein eintrag mehr in die tabelle geschrieben.

    Natürlich, mktime erzeugt einen Unix-Timestamp, das ist die Anzahl der Sekunden seit dem 1.1.1970, 0:00 Uhr GMT.
    Der MySQL-Datentyp TIMESTAMP erwartet aber ein anderes Format - auch das kann man im Handbuch nachlesen!

    MfG ChrisB

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

      ich habe nun also das feld in der tabelle Datum zu "datetime" umgeformt sowie das current_date in now() in der folgenden zeile geändert:

      ...
      else
      {
      mysql_query("INSERT INTO Logins (Datum, ID) VALUES (now(),'$id') ");

      ...

      die richtige zeit wird mir nun in der tabelle angezeigt.

      allerdings bei der folgenden syntax:

      mysql_query("DELETE FROM x WHERE Datum=now()-24h WHERE ID='$id'");

      folgende idee:

      mysql_query("DELETE FROM x WHERE Datum=now()-time()+0*24*0*0, WHERE ID='$id'");

      ist dies so machbar? da die zeile nicht angesprochen wurde, gehe ich davon aus, dass die if else befehle sonst soweit korrekt sind?

      mysql_query("SELECT COUNT(*) FROM Logins WHERE ID='$id'");
      $result = mysql_result($result,3);

      if($result == 3)
      {

      		}  
      	else  
      

      allerdings nach überprüfung schreibt er mir immer noch mehr als 3 einträge in die tabelle.

      für kosntruktive hilfe bin ich immer dankbar.

      1. Hi,

        allerdings bei der folgenden syntax:

        mysql_query("DELETE FROM x WHERE Datum=now()-24h WHERE ID='$id'");

        folgende idee:

        mysql_query("DELETE FROM x WHERE Datum=now()-time()+0*24*0*0, WHERE ID='$id'");

        ist dies so machbar?

        Nein. Weil auch DATETIME kein Unix Timestamp ist, time() aber einen solchen liefert.
        Und wofür du 0 mal irgendwas drauf addieren willst, ist auch nicht klar - aber hier Sekunden drauf addieren zu wollen, wäre ebenso falsch.

        Noch mal: Schau dir die Datums- und Zeit-Funktionen an, die MySQL anbietet.

        MfG ChrisB

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

          danke für die antwort und den erneuten ratschlag mir die ganzen funktionen anzusehen. das habe ich bereits getan, allerdings steht dort nirgendswo, wo man zeit von einer zeit abziehen kann. zumindest nicht so, dass ich es als laie erkenne und verstehe.

          unter welcher bezeichnung soll das stehen?

          danke

          1. Hi,

            danke für die antwort und den erneuten ratschlag mir die ganzen funktionen anzusehen. das habe ich bereits getan, allerdings steht dort nirgendswo, wo man zeit von einer zeit abziehen kann. zumindest nicht so, dass ich es als laie erkenne und verstehe.

            unter welcher bezeichnung soll das stehen?

            Sind DATE_ADD und DATE_SUB etwa keine in ausreichendem Maße „sprechenden“ Funktionsbezeichner?

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. mein fehler, hatte die seite nur auf englisch und es dabei anders verstanden.

              auf deutsch macht es nun mehr sinn. allerdings ist es immer noch ein bisschen fachchinesisch :)

              also ich benötige die DATE_SUB(date,INTERVAL expr  type) funktion.

              als beispiel ist dies eigentlich ganz passend:

              mysql> SELECT DATE_ADD('1998-01-01 00:00:00',
                  ->                 INTERVAL '-1 10' DAY_HOUR);
                      -> '1997-12-30 14:00:00'

              sprich auf mein problem hieße es:

              SELECT DATE_ADD('1998-01-01 14:00:00',
                  ->                 INTERVAL '-1' DAY);
                      -> '1997-12-31 14:00:00'

              ob im intervall nun -1 steht ist gleichbedeutend der funktion DATE_SUB mit intervall +1 und damit also egal, welche funktion man nimmt. ist das richtig?

              okay, zurück zu der zeile:

              mysql_query("DELETE FROM x WHERE Datum=now()-time()+0*24*0*0, WHERE ID='$id'");

              wie implementier ich das jetzt?

              mysql_query("DELETE FROM x WHERE Datum=DATE_ADD('',INTERVAL '-1' DAY)   WHERE ID='$id'");

              hab ich das so richtig implementiert und verstanden?

              besten dank.

              1. Hi,

                ob im intervall nun -1 steht ist gleichbedeutend der funktion DATE_SUB mit intervall +1 und damit also egal, welche funktion man nimmt. ist das richtig?

                Natürlich, ob du x addierst oder das Inverse von x, gemeinhin -x genannt, subtrahierst, respektive andersherum, kommt auf's gleiche heraus.
                Das ist eines der grundlegenden Prinzipien unserer Mathematik.

                mysql_query("DELETE FROM x WHERE Datum=DATE_ADD('',INTERVAL '-1' DAY)   WHERE ID='$id'");

                hab ich das so richtig implementiert und verstanden?

                Nein, du musst schon irgendwas angeben, von dem du das INTERVAL 1 Tag abziehen willst - '' ist kein Datumswert, mit dem man rechnen kann.

                Zu was soll der Abstand noch mal einen Tag betragen? Richtig, zum jetzigen Zeitpunkt. Jetzt auf Englisch ist NOW, und das findest du ebenfalls als Funktion in MySQL wieder.

                MfG ChrisB

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

                  also

                  mysql_query("DELETE FROM x WHERE Datum=DATE_ADD('',INTERVAL '-1' DAY)   WHERE ID='$id'");

                  müsste dann quasi so aussehen:

                  mysql_query("DELETE FROM x WHERE Datum=DATE_ADD(now(),INTERVAL '-1' DAY)   WHERE ID='$id'");

                  somit wird auf das jetzige datum und uhrzeit das interval von 24h zurückgerechnet und die einträge >24h sollten gelöscht werden. leider funktioniert dies noch nicht!

                  ich hatte den denkfehler, dass '' = () der now-funktion ist.

                  mysql_query("SELECT COUNT(*) FROM x WHERE ID='$id'");

                  --> aus der tabelle x wird gezählt wieviele identische id´s vorhanden sind

                  $result = mysql_result($result,3);

                  --> das ergebnis aus der mysql-datenbankzählung wird als string abgekürzt und soll drei sein

                  	if($result == 3)  
                  

                  --> wenn das ergebnis (der string $result gleich 3 ist
                  {
                  --> dann mache/schreibe nichts. kann man das so in leeren klammern formulieren?
                  }
                  else

                  -> ansonsten wenn die anzahl weniger als drei ist, trage den aktuellen zeitpunkt bei der entsprechenden id ein.
                  {
                  mysql_query("INSERT INTO x (Datum, ID) VALUES (now(),'$id') ");
                  mysql_query("UPDATE y SET punkte=punkte + 1 WHERE id='$id'");

                  und schreibe in der tabelle y das feld punkte +1

                  }

                  }

                  ich finde leider den fehler nicht.

                  besten dank.

                  1. Hi,

                    müsste dann quasi so aussehen:

                    mysql_query("DELETE FROM x WHERE Datum=DATE_ADD(now(),INTERVAL '-1' DAY)   WHERE ID='$id'");

                    Nein, auch das ist noch fehlerhaft, weil es zweifach das Schlüsselwort WHERE enthält, was aber nur ein mal vorkommen darf.

                    Wenn du mehrere Einzelbedingungen hast, musst du sie mit logischen Operatoren verknüpfen. http://dev.mysql.com/doc/refman/5.1/en/logical-operators.html

                    ich finde leider den fehler nicht.

                    Du kannst nicht immer davon ausgehen, dass eine Datenbankabfrage reibungslos geklappt hat. (Insb. dann nicht, wenn du noch derart große Lücken in der Kenntnis der Syntax hast.)

                    Der Rückgabewert von mysql_query gibt Aufschluss darüber, ob ein Fehler aufgetreten ist; und mit mysql_error kannst du dann genauere Informationen zum Fehler von der Datenbank erfragen.

                    Das sind allerdings alles Grundlagen, die du dir hier nach und nach erklären lässt.
                    Also sei doch bitte so nett, und schau erst mal in ein Tutorial, welches dir dieses Grundlagenwissen vermittelt.
                    Denn derzeit ist das mehr Rumgerate als Programmieren, was du betreibst.

                    MfG ChrisB

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

                      also zunächst mal hat es nichts mit "rumraten" zu tun, sondern ich versuche nachzuvollziehen, wieso sich etwas ändert, wenn ich eine zeile umschreibe.

                      es wird mir ja wohl als anfänger gestattet sein, mir wissen durch fragen anzueignen. es ist doch selbstverständlich, dass man als anfänger die sprache nicht beherrscht und sich grundlagenwissen nach und nach erst aufbauen muss, was ich auch tue. aber mir ist schon klar, dass viele hier seit ihrer geburt php-sprache fließend sprechen und deshalb dieses auch von anderen erwarten. ein bisschen mehr verständnis wäre durchaus kompetenter als einfach nur blöd zu quatschen und zu sagen "lies die grundlagen". denn das ist so als würde man einem säugling sagen: du lernst bis morgen verhandlungssicheres englisch! denn in manchen sachen braucht es einfach seine zeit, weil man auch anderen dingen nachzugehen hat und php-programmierung vielleicht nicht der beruf oder das zentrum seiner freizeit ist bzw. auch vielleicht nicht die zeit vorhanden ist, erstmal 3 tage in eine problematik sich einzulesen aber man trotzdem schnell einen hinweis oder eine lösung auf das problem haben möchte. wem das zu viel ist, der möge hier doch einfach nicht schreiben. ich spreche damit jetzt niemanden persönlich an.

                      so nachdem es gestern nun schon doch sehr spät wurde, ist natürlich klar, dass nicht zwei where in einer zeile verpackt sein dürfen und es selbstverständlich AND als bedingung heißen muss. daher nun:

                      mysql_query("DELETE FROM x WHERE (NOW() - INTERVAL 1 DAY) > Datum AND ID='$id'");

                      was die count()-funktion angeht, bin ich soweit gekommen, dass diese in ein array $count gepackt wird. um leere if-bedingungen zu umgehen kann man also die umkehrung benutzen.

                      mysql_query("SELECT COUNT(*) AS val FROM x WHERE ID='$id'");
                      $count = mysql_fetch_assoc();
                      var_dump($count);

                      if ($count [val] <3){
                      mysql_query("INSERT INTO x (Datum, ID) VALUES (now(),'$id') ");
                      mysql_query("UPDATE y SET punkte=punkte + 1 WHERE id='$id'");
                        }
                          }

                      jedoch werden mir immer noch mehr als 3 einträge in die tabelle geschrieben. wie kann ich denn überprüfen, was in var_dump($count) ausgegeben wird? da ich die vermutung habe, dass sich noch irgendwo ein fehler eingeschlichen hat und $count == NULL ist und damit < 3 ist.

                      danke.

                      1. Hi,

                        es wird mir ja wohl als anfänger gestattet sein, mir wissen durch fragen anzueignen.

                        Ja.
                        Es wird allerdings uns wohl gleichermaßen gestattet sein, zu sagen, wir haben keine Lust und sehen es nicht als unsere Aufgabe an, jedem Neuling erneut absolut triviale Dinge zu erklären, die er an zahlreichen anderen Stellen bereits nachlesen kann.

                        es ist doch selbstverständlich, dass man als anfänger die sprache nicht beherrscht und sich grundlagenwissen nach und nach erst aufbauen muss, was ich auch tue.

                        Ja, ist es. Aber das „wie“ ist auch entscheidend.

                        aber mir ist schon klar, dass viele hier seit ihrer geburt php-sprache fließend sprechen und deshalb dieses auch von anderen erwarten.

                        Blödsinn.

                        ein bisschen mehr verständnis wäre durchaus kompetenter als einfach nur blöd zu quatschen und zu sagen "lies die grundlagen".

                        Ja, „Verständnis“ wird in solchen Situationen immer gern gefordert.

                        Aber wenn ich und viele andere hier selber die Erfahrung gemacht haben, dass man sich vieles, vor allem Grundlagenwissen, selber beibringen kann, in dem man sich mit entsprechenden Quellen (Handbücher, Tutorials, ...) auseinandersetzt - dann kann man m.E. genauso Verständnis dafür erwarten, dass wir sagen, dazu solltest du genauso in der Lage sein.

                        denn das ist so als würde man einem säugling sagen: du lernst bis morgen verhandlungssicheres englisch!

                        Dieser Vergleich hinkt genau dann nicht, wenn du außer essen, kacken und schreien bisher noch nichts kannst.

                        denn in manchen sachen braucht es einfach seine zeit, weil man auch anderen dingen nachzugehen hat und php-programmierung vielleicht nicht der beruf oder das zentrum seiner freizeit ist bzw. auch vielleicht nicht die zeit vorhanden ist, erstmal 3 tage in eine problematik sich einzulesen aber man trotzdem schnell einen hinweis oder eine lösung auf das problem haben möchte. wem das zu viel ist, der möge hier doch einfach nicht schreiben.

                        Wem es zu viel ist, sich damit zu beschäftigen und sich dafür die Zeit zu nehmen, die das nun mal braucht - der möge doch bitte einfach ganz die Finger davon lassen.

                        jedoch werden mir immer noch mehr als 3 einträge in die tabelle geschrieben. wie kann ich denn überprüfen, was in var_dump($count) ausgegeben wird?

                        Eine explizite Testausgabe kannst du „überprüfen“, in dem du dir das, was ausgeben wird, *anschaust*.

                        da ich die vermutung habe, dass sich noch irgendwo ein fehler eingeschlichen hat und $count == NULL ist und damit < 3 ist.

                        Da gibt es nichts zu vermuten. Entweder bringt die Testausgabe das Ergebnis, dass der Wert NULL ist, oder etwas anderes.

                        MfG ChrisB

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

                          also ich lass das andere mal unkommentiert. es kann ja jeder seine meinung frei äußern und denken.

                          zurück zum thema:

                          Eine explizite Testausgabe kannst du „überprüfen“, in dem du dir das, was ausgeben wird, *anschaust*.

                          und genau das ist die frage. ich habe danach gesucht und bin nicht fündig geworden. diesen umstand sollte man übrigens bedenken, dass einige bevor sie hier etwas schreiben, bereits danach schon gesucht haben aber eben nicht fündig geworden sind. das hat also bei mir nichts mit faulheit zu tun, sondern einfach zeitmangel.

                          daher habe ich mich vielleicht nicht richtig ausgedrückt.

                          mir ist durchaus bewusst, was var_dump bewirkt aber mir wird nichts angezeigt.

                          aber ich würde gern wissen, wie ich mir das ausgeben lassen kann? da es sich um ein reines loginscript handelt, wird dort nirgendswo die möglichkeit gegeben ein

                          echo var_dump($count) ausgeben zu lassen.

                          ich kann es also nicht sehen, welchen wert $count annimmt.

                          1. Hi,

                            mir ist durchaus bewusst, was var_dump bewirkt aber mir wird nichts angezeigt.

                            Dann wurde es entweder gar nicht ausgeführt, weil es in einem bedingten Anweisungsblock stand, der gar nicht ausgeführt wurde - dann setze weiter oben an, und überprüfe durch weitere Testausgaben, welche Zweige jeweils durchlaufen werden.

                            Oder die Ausgabe ist erfolgt, aber du „siehst“ sie nicht - weil sie an irgendeiner Stelle steht, die du vom Browser nicht angezeigt bekommst, wenn du das ganze als HTML darstellen lässt.
                            Deshalb immer in den Quelltext schauen.

                            aber ich würde gern wissen, wie ich mir das ausgeben lassen kann? da es sich um ein reines loginscript handelt, wird dort nirgendswo die möglichkeit gegeben ein

                            echo var_dump($count) ausgeben zu lassen.

                            Warum wird die Möglichkeit nicht gegeben, und was soll die Tatsache, dass es sich um ein Loginscript handelt, damit zu tun haben?

                            MfG ChrisB

                            --
                            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                            1. so ich habe jetzt das loginscript einfach mal als eine weitere datei gespeichert und schnell zwei textfelder für email und passwort sowie einen absendebutton in einem html-bereich erstellt um es zu testen.
                              ich hab mir den var_dump-wert ausgeben lassen und dieser ist bereits vor dem absenden NULL.

                              1. Hi,

                                ich hab mir den var_dump-wert ausgeben lassen und dieser ist bereits vor dem absenden NULL.

                                Das mag sein, ist aber auch wieder nur so eine Bruchstückinformation, mit der wir wenig bis gar nichts anfangen können.

                                Was gibst du aus, und wo? Zeig uns bitte den Quelltext.

                                MfG ChrisB

                                --
                                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                                1. <?php
                                  if ($_POST['email'] != "") {

                                  include_once "connect_to_mysql.php";

                                  $email = $_POST['email'];
                                  $pass = $_POST['pass'];
                                  $email = strip_tags($email);
                                  $email = mysql_real_escape_string($email);
                                  $email = eregi_replace("`", "", $email);

                                  $pass = md5($pass);

                                  $sql = mysql_query("SELECT * FROM x 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 x SET last_log_date=now(), Logins=Logins + 1 WHERE id='$id'");

                                  mysql_query("DELETE FROM Logins WHERE (NOW() - INTERVAL 1 DAY) > Datum AND ID='$id'");
                                  mysql_query("SELECT COUNT(ID) FROM Logins WHERE ID='$id'");
                                  $count = mysql_fetch_assoc();
                                  var_dump($count);

                                  if ($count [val] <3){
                                  mysql_query("INSERT INTO y (Datum, ID) VALUES (now(),'$id') ");
                                  mysql_query("UPDATE x SET punkte=punkte + 1 WHERE id='$id'");
                                    }
                                      }

                                  exit();
                                   }
                                  }
                                  ?>
                                    <?php echo var_dump($count) ?>

                                  <body>
                                  <form id="email" name="email" method="post" action=""><input type="text" name="email" id="email" /></form>
                                  <form id="pass" name="pass" method="post" action=""><input type="password" name="pass" id="pass" /></form>
                                  <form id="submit" name="submit" method="post" action=""><input type="submit" name="submit" id="submit" value="Senden" /></form>
                                  </body>

                                  1. Hi,

                                    ich hab mir den var_dump-wert ausgeben lassen und dieser ist bereits vor dem absenden NULL.

                                    Natürlich ist er das.

                                    Wenn du kein Formular abgesendet hast, dann ist die folgende Bedingung nicht erfüllt:

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

                                    Der Block, den diese geschweifte Klammer öffnet, geht bis hier:

                                    exit();
                                    }
                                    }

                                    Wenn also das Formular nicht abgeschickt wurde, dann wurde auch nirgendwo Code ausgeführt, der $count überhaupt mit einem Wert hätte belegen können.

                                    ?>
                                      <?php echo var_dump($count) ?>

                                    Also ist es auch nur logisch, dass var_dump($count) direkt im Anschluss nur NULL liefert. (Dass das echo da fehl am Platze ist, hat dir dedlfix bereits geschrieben.)br />

                                    Und im anderen Fall, wenn du dein Formular abschickst, und die Bedingung ganz oben zutrifft - dann wird dein Script aber mit exit() abgebrochen, die Zeile, in der die Kontrollausgabe stattfinden soll, wird als gar nicht mehr ausgeführt. Dass du dann von dieser „nichts siehst“, sollte also auch einleuchten.
                                    (Das gilt für den Fall, dass dein Login-Check erfolgreich war. Wenn er das nicht war - dann wird auch wieder keine einzige Zeile Code ausgeführt, die $count mit irgendeinem Wert belegt hätte, also Ergebnis logischerweise wieder - NULL.)

                                    Langsam wird klar, dass hier wenig zu erreichen ist, wenn wir dich auf Tutorials verweisen, in denen spezielle Eigenarten der Syntax erklärt werden o.ä. - denn du hast ja noch Probleme mit der grundlegenden Logik, an denen du scheiterst, selbst wenn wir dir hier Tipps geben, wie man Fehler suchen kann.

                                    Wie wir dir da jetzt aber noch weiterhelfen können, sehe ich gerade nicht.
                                    Wer Programmieren will, muss m.E. schon ein gewisses logisches Denkvermögen mitbringen.
                                    Vielleicht haben andere da noch Tipps, wie du das erlernen kannst, mir fällt jedenfalls gerade nichts mehr ein.

                                    MfG ChrisB

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

                                      Wenn also das Formular nicht abgeschickt wurde, dann wurde auch nirgendwo Code ausgeführt, der $count überhaupt mit einem Wert hätte belegen können.

                                      Dazu noch ein Hinweis:

                                      Stelle bitte das error_reporting auf E_ALL und display_errors auf 1, während du entwickelst.

                                      Ich weiß, viele Anfänger scheuen das, weil PHP dann „so kleinlich“ ist, und ihre Scripte ja meistens „auch so funzen“ - mach' es bitte trotzdem!

                                      In diesem Fall, wo du versuchst, den Inhalt von $count zur Kontrolle auszugeben, obwohl $count vorher noch gar nicht angelegt wurde, hätte PHP dich dann nämlich schon mit einer entsprechenden Meldung darauf hingewiesen,

                                      “Notice:  Undefined variable: count in [Pfad des Scriptes] on line [Zeilenummer]”

                                      An Hand solcher Hinweise solltest du in vielen Fällen schon selbst erkennen können, dass an der Logik deines Scriptes diesbezuglich etwas nicht stimmt, und dass du es dir noch mal genauer anschauen musst - ohne, dass wir es übernehmen müssen, dich darauf hinzuweisen.

                                      MfG ChrisB

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

                                    <form id="email" name="email" method="post" action=""><input type="text" name="email" id="email" /></form>
                                    <form id="pass" name="pass" method="post" action=""><input type="password" name="pass" id="pass" /></form>
                                    <form id="submit" name="submit" method="post" action=""><input type="submit" name="submit" id="submit" value="Senden" /></form>

                                    Welches dieser drei Formular willst Du denn nun eigentlich abschicken und verarbeiten?

                                    Dir fehlen *wirklich* (echt, glaub's mir!) noch die grundlegendsten Grundlagen - nicht nur, was PHP und SQL angeht, sondern ganz offensichtlich auch im Bereich http://de.selfhtml.org/html/formulare/definieren.htm@title=HTML.

                                    Eigne sie Dir also bitte an - vorher ist es echt absolut sinnfrei, weiter Zeile für Zeile und Fehler für Fehler voranzustolpern.

                                    MfG,
                                    EKKi

                                    --
                                    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                                  3. Hi!

                                    Neben dem logischen Problem, das dir ChrisB schon erzählt hat, läuft auch noch eine Menge anderes schief.

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

                                    Wenn das Formular nicht abgesendet wurde, dann ist $_POST leer. $_POST['email'] existiert nicht und kann deswegen auch nicht gelesen werden. PHP beklagt sich darüber leise jammernd mit einer Notice-Meldung. Erst mit auf E_ALL gestelltem error_reporting (und display_error=on) bekommt man solche Notice-Meldungen zu Gesicht. Nicht vorhandene Variablen und Array-Elemente liefern beim Lesen den Spezialwert null, der sich bei Vergleichen wie ein Leerstring verhält. Besser wäre, sich zuerst mit isset() der Existenz der Variablen / des Arrayfeldes zu versichern und dann erst zuzugreifen. In dem Fall geht aber auch eine Frage mit empty(), was wie isset() ohne Notice-Meldung arbeitet.

                                    if (!empty($_POST['email'])) {

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

                                    Nicht auszurotten, diese Umkopiererei ohne wirklichen Sinn.

                                    $email = strip_tags($email);
                                    $email = mysql_real_escape_string($email);
                                    $email = eregi_replace("`", "", $email);

                                    Das einzige, was eine Email-Adresse an Behandlung braucht, ist die dem jeweiligen Kontext angemessene. strip_tags() und das Löschen von ` (noch dazu aufwendig mit regulärem Ausdruck statt der einfachen String-Funktion str_replace()) macht im Zweifel mehr reguläre Zeichen kaputt als dass es nützt, solange du dir nicht im Klaren bist, welche Auswirkungen - positive wie negative - du mit welchem Werkzeug erreichen kannst.

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

                                    Wenn du ein SQL-Statement zunächst in einer eigenen Variable zusammenbaust, hast du zu, Beispiel bei der Fehlersuche die Möglichkeit, es dir im Endzustand anzuzeigen. Auch lässt sich bei der Variablennamenvergabe noch etwas mehr Klarheit schaffen. mysql_query() liefert ein Resultset, das mit SQL nichts mehr zu tun hat. Ich nenne das Resultset mal der Einfachheit $result. Wenn du mit mehreren Resultsets zu tun hast, empfiehlt es sich aussagekräftigere/unterscheidbare Variablennamen zu überlegen.

                                    $sql = sprintf("SELECT * FROM x WHERE email='%s' AND Passwort='%s' AND email_activated='1'",
                                             mysql_real_escape_string($_POST['email'],
                                             md5($_POST['pass']);
                                    $result = mysql_query($sql);

                                    Zu sprintf() gehören die beiden Platzhalter %s, die durch die beiden angehängten Parameter ersetzt werden. So notiert hat man alles (die Query und die Behandlung der variablen Werte) schön beisammen und nicht über mehrere Zeilen verteilt.

                                    Normalerweise gehört es sich für ein robustes Programm auch, Fehlerbedingungen zu erkennen und abzufangen. Das ignoriere ich jetzt mal, weil das Posting sowieso schon lang genug wird. Du müsstest erst $result auf false testen, bevor du damit weiterarbeiten kannst.

                                    $login_check = mysql_num_rows($sql);
                                    if($login_check > 0){

                                    Brauchst du die Variable $login_check später noch einmal? Nein? Dann muss sie auch nicht erst angelegt werden. (Beachte auch, dass das Resultset was bei dir $sql hieß, bei mir nun $result heißt.)

                                    if (mysql_num_rows($result) > 0) {

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

                                    Kein Einwand, nur die Variable heißt bei mir anders.

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

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

                                    Diese Aktionen beinhaltet je zwei überflüssige Vorgänge. session_register() ist veraltet, nur $_SESSION wird noch benötigt. Und da kannst du den Wert aus $row auch direkt reinschreiben.

                                    $_SESSION['id'] = $row["id"];

                                    Das selbe Prinzip gilt bei Vorname und Email.

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

                                    $id gibt es nun nicht mehr. Vermutlich ist das auch ein Integer-Feld im DBMS, also kann da auch nichts anderes als ein Integerwert (oder NULL, aber vermutlich nicht in dem Fall) zurückkommen. Ein Einfassen in Hochkomma ist nicht notwendig.

                                    $sql = "UPDATE x SET last_log_date=now(), Logins=Logins + 1 WHERE id=" . $row["id"];
                                    mysql_query($sql);

                                    Auch hier gehört sich eigentlich eine Auswertung des Rückgabewertes von mysql_query().

                                    mysql_query("DELETE FROM Logins WHERE (NOW() - INTERVAL 1 DAY) > Datum AND ID='$id'");
                                    mysql_query("SELECT COUNT(ID) FROM Logins WHERE ID='$id'");

                                    Ebenso wie bei diesen beiden Querys. (auch beachten: $id -> $row["id"])

                                    $count = mysql_fetch_assoc();
                                    var_dump($count);

                                    Hier müsstest du eigentlich eine PHP-Warnung ausgegeben bekommen, denn mysql_fetch_assoc() lässt sich nicht ungestraft parameterlos aufrufen. Du musst angeben, welches Resultset du befragen willst. Dazu hättest du beim SELECT COUNT... den Rückgabewert in einer Variable aufheben müssen.

                                    $result_count = mysql_query("SELECT COUNT(ID) FROM Logins WHERE ID=" . $row["id"]);
                                      $count = mysql_fetch_assoc($result_count);

                                    Und nun ergibt die Kontrollausgabe auch ein schönes Ergebnis-Array.

                                    var_dump($count);

                                    mysql_fetch_assoc() ist für diese Query mit der Formel COUNT(ID) und ohne Alias umständlich zu bedienen, denn deine gesuchte Anzahl muss nun so abgefragt werden:

                                    $count['COUNT(ID)']

                                    Besser ist, SELECT COUNT(ID) anz FROM ... und dann über $count['anz'] zuzugreifen oder aber mysql_fetch_row($result_count) und dann $count[0] zu verwenden.

                                    Den Rest solltest du nun hoffentlich allein anpassen können.

                                    <form id="email" name="email" method="post" action=""><input type="text" name="email" id="email" /></form>
                                    <form id="pass" name="pass" method="post" action=""><input type="password" name="pass" id="pass" /></form>
                                    <form id="submit" name="submit" method="post" action=""><input type="submit" name="submit" id="submit" value="Senden" /></form>

                                    Aber was ist denn das? Was machst du denn hier mit drei unabhängigen Formularen? Die ersten beiden kannst du nur jeweils einzeln mit Enter absenden, das dritte hat zwar einen Submit-Button aber sonst keine Felder. Hier fehlen dir eindeutig einfachtes Grundlagenwissen zu <http://de.selfhtml.org/html/formulare/eingabe.htm@title=Formularen in HTML>.

                                    Lo!

                          2. 'ǝɯɐu$ ıɥ

                            aber ich würde gern wissen, wie ich mir das ausgeben lassen kann? da es sich um ein reines loginscript handelt, wird dort nirgendswo die möglichkeit gegeben ein

                            echo var_dump($count) ausgeben zu lassen.

                            ich kann es also nicht sehen, welchen wert $count annimmt.

                            Dann sorge dafür das es eine Möglichkeit gibt, was hindert dich daran im Testbetrieb ein var_dump(); anzuflanschen?

                            ssnɹƃ
                            ʍopɐɥs

                            --
                            I like children. If they're properly cooked.
                            - W.C. Fields
                          3. Hi!

                            und genau das ist die frage. ich habe danach gesucht und bin nicht fündig geworden. diesen umstand sollte man übrigens bedenken, dass einige bevor sie hier etwas schreiben, bereits danach schon gesucht haben aber eben nicht fündig geworden sind. das hat also bei mir nichts mit faulheit zu tun, sondern einfach zeitmangel.

                            Das Motto dieses Forums ist nicht, Zeitmangel auszugleichen, sondern beim Verstehen zu helfen. Unser Antrieb ist nicht anderen kostenlos ihre Werte zu schaffen sondern Wissen weiterzugeben und bei der Lösung von Problemen unser eigenes Wissen aufzubauen, zu erweitern, zu vertiefen. Wenn du eine Lösung statt Hilfe bei der Lösungsfindung erhalten möchtest, frag jemanden, der damit seinen Lebensunterhalt verdient.

                            echo var_dump($count) ausgeben zu lassen.

                            var_dump() hat keinen Rückgabewert, den man sich anzeigen lassen könnte. Stattdessen erzeugt es selbst eine Ausgabe, an der Stelle, an der es aufgerufen wurde. Außerdem erzeugt es *immer* eine Ausgabe. Die Ausgabe eines PHP-Scripts ist aber üblicherweise nicht eine gerenderte HTML-Seite sondern der Code den der Browser dazu benöötigt, weswegen es sehr sinnvoll ist, sich auch diesen anzusehen, wenn man eine PHP-Ausgabe sucht.

                            Lo!

                      2. Mahlzeit chris,

                        es wird mir ja wohl als anfänger gestattet sein, mir wissen durch fragen anzueignen.

                        Sicher. Allerdings steht in den Tipps für Fragende "Als Fragesteller solltest Du zuerst versuchen, Dein Problem mit Hilfe der SELFHTML-Dokumentation, der SELFHTML-Suche im reichhaltigen Forumsarchiv und natürlich mittels Suchen im Internet selbst zu lösen." Dies ist bei Deinen Fragen nicht erkennbar.

                        Schlussfolgerung: Du hast kein wirkliches Interesse daran, Dir die Grundlagen anzueignen, sondern willst nur schnell ohne viel Eigeninitiative Deinen Code zusammenfrickeln. Damit bist Du hier eher falsch.

                        es ist doch selbstverständlich, dass man als anfänger die sprache nicht beherrscht und sich grundlagenwissen nach und nach erst aufbauen muss,

                        Sicher - dafür gibt's Tutorials. Dieses Forum ist dafür weniger geeignet.

                        was ich auch tue.

                        Das kommt mir eher nicht so vor ... aber ich kann mich auch irren.

                        aber mir ist schon klar, dass viele hier seit ihrer geburt php-sprache fließend sprechen und deshalb dieses auch von anderen erwarten.

                        Nein, nicht wirklich. Einerseits geht's im konkreten Fall um SQL und nicht PHP und andererseits erwartet keiner, dass Du das von Geburrt an beherrscht. Es wird nur erwartet, dass Du Dir die Grundlagen, die Du Dir durch Nachschlagen sowie Lesen und Verstehen der für Deinen Fall relevanten Dokumentation oder alternativ mittels Durcharbeiten der zum Thema SQL haufenweise im Netz verfügbaren Tutorials aneignen kannst, selbst aneignest ... und nicht eine triviale Frage (die Du leicht selbst hättest beantworten können) nach der anderen stellst.

                        ein bisschen mehr verständnis wäre durchaus kompetenter als einfach nur blöd zu quatschen und zu sagen "lies die grundlagen".

                        Verständnis? Für was? Für das Ignorieren der Charta? Für die Faulheit, nicht selbst Nachschlagen und Lernen zu müssen?

                        Nö.

                        bzw. auch vielleicht nicht die zeit vorhanden ist, erstmal 3 tage in eine problematik sich einzulesen aber man trotzdem schnell einen hinweis oder eine lösung auf das problem haben möchte.

                        Ich weiß gar nicht, was Du willst: Du hast doch Hinweise bekommen.

                        Oder verstehst Du etwa unter "Hinweise" fertigen Code, den Du einfach nur Kopieren und Einfügen musst? Dann bist Du hier falsch.

                        wem das zu viel ist, der möge hier doch einfach nicht schreiben.

                        Wenn es Dir zu viel ist, Dich an die hier üblichen Gepflogenheiten zu halten, dann mögest Du hier doch bitte auch einfach nicht schreiben.

                        mysql_query("SELECT COUNT(*) AS val FROM x WHERE ID='$id'");
                        $count = mysql_fetch_assoc();
                        var_dump($count);

                        if ($count [val] <3){

                        Hier sollte dein PHP mindestens eine Notice ausspucken: es gibt (vermutlich) keine definierte Konstante namens "val".

                        wie kann ich denn überprüfen, was in var_dump($count) ausgegeben wird?

                        Ähm ... var_dump() erzeugt eine Ausgabe - diese kannst Du doch sehen, oder nicht?

                        MfG,
                        EKKi

                        --
                        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                  2. Mahlzeit chris,

                    ergänzend zu ChrisBs Hinweisen:

                    mysql_query("DELETE FROM x WHERE Datum=DATE_ADD(now(),INTERVAL '-1' DAY)   WHERE ID='$id'");

                    somit wird auf das jetzige datum und uhrzeit das interval von 24h zurückgerechnet und die einträge >24h sollten gelöscht werden. leider funktioniert dies noch nicht!

                    Natürlich nicht. Abgesehen vom bereits von ChrisB erwähnten Fehler schränkst Du auf die Datensätze ein, deren Spalte "Datum" einen Wert enthält, der ausgehend vom aktuellen Zeitpunkt *GENAU* ein Tag vorher liegt. Was Du vermutlich willst, ist nicht auf absolute Gleichheit, sondern auf "größer als" bzw. "kleiner als" prüfen. MySQL verwendet dafür genau die gleichen Zeichen, wie sie in der Schule gelehrt wird.

                    Ich kann mich ChrisB nur anschließen: eigne Dir die *absolut notwendigen* Grundkenntnisse der Technologien an, die Du verwenden willst. Damit erübrigen sich gefühlte 90% aller Rückfragen und Du kommst bedeutend schneller voran, als wenn Du immer nur herumrätst und hier ständig nachfragst - dann aber leider keine hilfreichen Problembeschreibungen nennen kannst (weil Dir das Wissen dazu fehlt).

                    MySQL-Tutorials gibt's im Netz wie Sand am Meer ...

                    MfG,
                    EKKi

                    --
                    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|