tschulian Geschrieben 25. September 2014 Teilen Geschrieben 25. September 2014 Guten Abend liebe Leute, fast fertig mit meiner Page, stoße ich nun auf folgendes schwerwiegendes Problem. User können sich pro Tag(24h) 1x für ein Gewinnspiel "registrieren". Nachdem sie auf "Teilnehmen" gedrückt haben schreibt mein Script alles in die Datenbank. USER_ID, E-Mail, Datum, IP values ($ID, $Mail, getdate(), $SERVER[REMOTE_ADDR']) Funktioniert soweit alles Top. Im Datumsfeld findet sich nun folgender Wert aufgrund getdate() wieder: 2014-09-25 20:04:55.340 Ansich ja richtig, nun, wenn die 24 Stunden abgelaufen sind will ich mit folgender Function ausrechnen ob er für einen erneuten Vote berechtigt ist. $time = mssql_query(getdate()); define("VOTE_TIME", "24"); function clean_requests($time) { $query = mssql_query("select * from vote_log"); $i = 0; while($row = mssql_fetch_array($query)) { $i++; $lastvoted = $row['Datum']; if($time-$lastvoted > VOTE_TIME*3600) { if (!mssql_query( "delete from vote_log where vote_time='$lastvoted'")) { return false; } }[/PHP] Nur leider kann er mit meinem getdate() nicht rechnen. Habe schon x viele converts (in int, oder varchar, float whatever) probiert, aber es klappt einfach nicht -.- Der Code-Schnipsel ansich passt, der cleanrequest ist noch für weitere Parameter die funktionieren. Mein Problem ist eben die 24 Stunden auszurechnen.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
uenetz Geschrieben 25. September 2014 Teilen Geschrieben 25. September 2014 Servus! Wie es meist ist, führen viele Wege zum Ziel. Ein Weg wäre: Das /die Kriterien zum Löschen in der WHERE-Klausel zu setzen (Siehe YEAR, MONTH, DAY, ...) Beispiel: "WHERE YEAR(vote_time) <= " . date(Y) . " AND ..." ODER Die Datum - Zeitangabe aus der DB in Sekunden wandeln, 86400 addieren mit der akt. Zeit vergleichen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 25. September 2014 Autor Teilen Geschrieben 25. September 2014 Wie convertiere ich denn den Timestamp 2014-09-25 20:04:55.340 in Sekunden?! Sorry das ich immer mit solchen komischen Problemen ankomme ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_XspYroX_ Geschrieben 25. September 2014 Teilen Geschrieben 25. September 2014 ein wenig googeln darf es schon sein http://php.net/manual/de/datetime.diff.php damit kannst du 2 dates vergleichen bzw. dem zeitunterschied rausfinden. date1 ist das der letzten teilnahme, date2 ist das aktuelle edit: 2014-09-25 20:04:55.34 ist kein timestamp sondern ein date Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 25. September 2014 Autor Teilen Geschrieben 25. September 2014 Das Funktioniert trotzdem nicht wirklich... bzw. ich sitze mal wieder auf dem Schlauch Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 (bearbeitet) Man kann auch den Wert der aus der Datenbank kommt an die PHP-Funktion "strtotime()" geben und bekommt damit den Unix-Timestamp zurück. Da kannst du dann rechnen Wenn es einmal am Tag sein soll und nicht alle 24 Stunden würde ich noch mktime() empfehlen Einfach ein bisschen basteln dann kommt was hübsches raus^^ PS: Ich würde sowie nicht getdate in die Datenbank schreiben sondern hier schon "time()" verwenden um direkt einen Zeitstempel zu speichern. Integer sind für Datenbanken immer angenehmer und wenn du sowie damit rechnen willst und nicht nur für Ausgabezwecke gedacht ist ein Zeitstempel immer die bessere Wahl. Bearbeitet 26. September 2014 von Heikooo Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sas86ks Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Warum erledigst du das nicht komplett im SQL? Erst alle Daten aus der Datenbank holen und dann im PHP die Logik abzubilden halte ich für keine gute Idee. Kleiner Hinweis: SQL Server DATEDIFF() Function OT: Warum nutzt du in Verbindung mit PHP eigentlich MSSQL? Auch: Durch eine neue IP Adresse hätte ich wieder die Berechtigung zu voten. Setz am besten noch einen Cookie oder nutze Browserfingerprints. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 Warum erledigst du das nicht komplett im SQL? Erst alle Daten aus der Datenbank holen und dann im PHP die Logik abzubilden halte ich für keine gute Idee. Kleiner Hinweis: SQL Server DATEDIFF() Function OT: Warum nutzt du in Verbindung mit PHP eigentlich MSSQL? Auch: Durch eine neue IP Adresse hätte ich wieder die Berechtigung zu voten. Setz am besten noch einen Cookie oder nutze Browserfingerprints. Nein, da ein Counter dies verhindert, ist ja Benutzerabhaengig und dieser clean-request über die Zeit setzt den Counter für den Benutzer auf 0 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 Wenn ich anstatt getdate() time() verwende schreibt er nichtsmehr in die Datenbank.... SQL Diff bringt mir nichts? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
uenetz Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Was soll denn in die Tabelle geschrieben werden, oder war das nur eine falsche Formulierung? getdate(), time() sind PHP-Functions. Die Aufgabe die Du beschrieben hast lassen sich im SQL-Statement realisieren, ohne zuvor rechnen zu müssen. Das WIE solltest Du allerdings durch Recherchen einfach finden oder erroieren können. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 (bearbeitet) Naja er füllt alles aus wie er soll nur bei vote_time steht jetzt 0. Das gibt mir time() aus wenn ich es überprüfe. Notice: Array to string conversion in C:\Program Files (x86)\wamp\htdocs\test.php on line 7 Array1411728830 Bearbeitet 26. September 2014 von tschulian Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Achso dein Datentyp in MySQL muss ein INT(11) sein. Du hast da ja schätzungsweise ein Datetime-Typ hinterlegt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 Nein, das habe ich schon gecheckt. Vorher war es tatsächlich Datetime. Bei INT komm jetzt 0 und testweise bei varchar kommt ein leeres Datenbankfeld. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Kannst du mal die ganze Zeile Code zeigen? :s eigentlich kann das nicht sein Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Naja er füllt alles aus wie er soll nur bei vote_time steht jetzt 0. Das gibt mir time() aus wenn ich es überprüfe. Am besten wäre zu zeigst uns mal diese Zeile 7 die in deiner Notice erwähnt wird Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 <?php $time1 = getdate(); //$time2 = time(); $time3=time(); echo $time1; <-- Line 7 //echo $time2; echo $time3; ?> Okay das problem lag an echo $time1. Trotzdem hilft mir das nichts weiter, weil in die Datenbank kein Wert der von time() kommt geschrieben wird... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Ok das war wohl nur das TestScript Kannst du mal den Teil hier rein kopieren wo du das erstellen des Zeitstempels und das eintragen in die Datenbank machst? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 $time = mssql_query(time()); mssql_query("insert into vote_log (account, ip, vote_time, vote_count) VALUES ('$userID', '$ip', '$time', '1')"); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Dann haben wir ja das Problem. Wie eben schon von jemandem hier erwähnt ist time() eine PHP-Funktion. Das heisst das hier würde gehen: $time = time(); ohne dieses mssql_query drum herum. Und aus Interesse. Du hast Schätzungsweise für "Vote_count" den Typ Integer hinterlegt ja? Wieso versuchst du deine Datenbank noch zu ärgern indem du ihr dennoch einen String übergibst? Ich gehe davon aus das account, vote_time und vote_count jeweils Integer sind. Daher würde diese Zeile völlig ausreichen (auch die $time = time(); kannst du dir dann sparen): mssql_query("insert into vote_log (account, ip, vote_time, vote_count) VALUES (" . $userID . ", '" . $ip . "', " . time() . ", 1)"); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 Daher würde diese Zeile völlig ausreichen (auch die $time = time(); kannst du dir dann sparen): mssql_query("insert into vote_log (account, ip, vote_time, vote_count) VALUES (" . $userID . ", '" . $ip . "', " . time() . ", 1)"); Sobald ich diese Zeile von dir teste, wird wieder überhaupt nichts in die DB geschrieben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Ok dein account ist kein Integer daher hier die korrektur: mssql_query("insert into vote_log (account, ip, vote_time, vote_count) VALUES ('" . $userID . "', '" . $ip . "', " . time() . ", 1)"); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 Ähm ich weiß nicht was genau du verändert hast aber Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Soll das jetzt heissen es ist so wie du es haben wolltest oder nicht? Das da jetzt kein Datum mehr steht sondern eine Zahl mit der du rechnen kannst und die du mit date('d.m.Y', VALUE_AUS_DB); wieder zu einem Datum bekommst war hoffentlich klar. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tschulian Geschrieben 26. September 2014 Autor Teilen Geschrieben 26. September 2014 Soll das jetzt heissen es ist so wie du es haben wolltest oder nicht? Das da jetzt kein Datum mehr steht sondern eine Zahl mit der du rechnen kannst und die du mit date('d.m.Y', VALUE_AUS_DB); wieder zu einem Datum bekommst war hoffentlich klar. Nein, so ist es perfekt! Wollte mit dem Screenshot aufzeigen, dass es funktioniert und nun endlich werte in die DB schreibt. Damit kann ich dann auch eben rechnen, hab es schon getested und xx - (24*3600) genommen und dann wieder gevoted und das hat dann funktioniert. Also läuft perfekt! Vielen Dank! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Heikooo Geschrieben 26. September 2014 Teilen Geschrieben 26. September 2014 Gut dann hoffe ich das der Rest etwas flüssiger läuft Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.