Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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....

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.

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 von Heikooo

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.

  • Autor
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

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.

  • Autor

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 von tschulian

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 ;)

  • Autor

<?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...

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)");

  • Autor

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.

post-86876-14430449845761_thumb.png

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)");

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.

  • Autor
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!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.