portseven: Jede 10 Minuten etwas in die Datenbank schreiben

Hallo,

ich habe ein Profilaufruf-Skript geschrieben. Jetzt wollte ich es so machen, dass er alle 10 Minuten oder länger ein Eintrag macht.

Sprich: User 1 geht zur User2 Profil. Eintrag in die DB wird geschrieben.

Wenn ich jetzt die Seite aktualisiere wird noch ein Eintrag geschrieben, ich möchte es aber so machen das er unter 10 Minuten keinen weiteren Antrag schreiben soll.

Ich habe das hier getestet, leider ohne Erfolg:

			if($sl = $pdo->prepare("
			SELECT
			*
			FROM profil_aufrufe 

      WHERE user_id = :id AND aufrufer_id = :user_id

      AND date < DATE_SUB(NOW(), INTERVAL 10 MINUTES) ORDER BY DATE DESC LIMIT 1;")) {

			$sl->BindParam(':id', $uid);

			$sl->BindParam(':user_id', $_SESSION['id'])
  1. Tach!

    ich habe ein Profilaufruf-Skript geschrieben. Jetzt wollte ich es so machen, dass er alle 10 Minuten oder länger ein Eintrag macht.

    Worauf bezieht sich das "er"? Und sollte das "ein" im zweiten Satz eigentlich ein "keinen" sein?

    Wenn ich jetzt die Seite aktualisiere wird noch ein Eintrag geschrieben, ich möchte es aber so machen das er unter 10 Minuten keinen weiteren Antrag schreiben soll.

    Meinst du Eintrag statt Antrag?

    Ich habe das hier getestet, leider ohne Erfolg:

    Wie äußerte sich das "ohne Erfolg"? Gab es vielleicht einen Syntaxfehler, weil die Einheit bei DATE_SUB() nur MINUTE statt MINUTES heißt?

    Ansonsten ist Prepare und dazu ein oder mehrere Binds noch keine Aktion. Da fehlt noch ein Execute.

    Du müsstest schon etwas genauer beobachten und beschreiben, damit man als Außenstehender mehr entnehmen kann als offensichtliche Syntaxfehler. Das genauere Beobachten und Prüfen, wo das Problem sitzt, hilft letztlich auch dir, es zu finden und zu beseitigen. Alles was Parameter entgegennimmt und ein Ergebnis liefert, kann man mit Kontrollausgaben prüfen. Das gehört zum Debugging und das kannst auch nur du an deiner Maschine.

    dedlfix.

    1. Hi,

      ich bekomme keinen Syntax-Fehler, und es heißt MINTUE indem Fall.

      Er fügt ganz normal einen Datensatz in die DB wenn ich jedes mal die Seite neu lade (Ohne Limit 1). Wenn ich LIMIT 1 mache, fügt er nur einen Datensatz ein.(Auch wenn ich länger als 10Minuten warte, fügt er keinen danach mehr ein.

      1. Tach!

        ich bekomme keinen Syntax-Fehler, und es heißt MINTUE indem Fall.

        Wenn du bei MINTUE (mit dem vertauschten UT) keinen Syntaxfehler bekommst, machst du was anderes falsch.

        Syntaxfehler vom DBMS bekommt man nicht einfach so präsentiert. Lediglich der Funktionsaufruf gibt false zurück. Das muss man auswerten, um auf Probleme hingewiesen zu werden. Den eigentlichen Text muss man sich dann in einer Eigenschaft oder mit eienm Funktionsaufruf abholen.

        Er fügt ganz normal einen Datensatz in die DB wenn ich jedes mal die Seite neu lade (Ohne Limit 1). Wenn ich LIMIT 1 mache, fügt er nur einen Datensatz ein.(Auch wenn ich länger als 10Minuten warte, fügt er keinen danach mehr ein.

        Ich hab doch nun schon ein paar mal darauf hingewiesen, dass "er" keine gescheite Bezeichnung ist, wenn man Probleme beschreibt. Wofür steht das "er" denn? Prozessor, Code, Computer, Anwender, ...? Es hilft auch nicht, bei Problemen, einfach neu zu beschreiben, was man eigentlich möchte, wenn man dabei auslässt, das zu untersuchen, was tatsächlich abläuft. Wie gesagt, diese Arbeit kann man als Außenstehender nicht abnehmen.

        dedlfix.

        1. Sorry, mit "er" meine ich, meinen Code.

          Hier ist der in ganze Code:

          			if($_SESSION['id'] !== $uid) {
          			if($sl = $pdo->prepare("
          			SELECT
          			*
          			FROM profil_aufrufe WHERE user_id = :id AND aufrufer_id = :user_id AND date < DATE_SUB(CURDATE(), INTERVAL 1 MINUTE) ORDER BY DATE DESC LIMIT 1;")) {
          			$sl->BindParam(':id', $uid);
          			$sl->BindParam(':user_id', $_SESSION['id']);
          
          			
          			if(!$sl->execute()) {
          				print_r($sl->errorInfo());
          			}
          			
          			$count_exists = $sl->rowCount();
          			
          			$sluser = $sl->fetch();
          		}
          			       
          
          			if($count_exists > 0) {
            
          			
          				if($aufruf = $pdo->prepare("
          				INSERT INTO profil_aufrufe (user_id, aufrufer_id)
          				SELECT :user, :aufrufer
          				FROM user
          				WHERE EXISTS (
          				SELECT id FROM user
          				WHERE id = :user) LIMIT 1;")) {
          				
          				$aufruf->BindParam(':user', $uid);
          				$aufruf->BindParam(':aufrufer', $_SESSION['id']);
          				
          				if(!$aufruf->execute()) {
          					print_r($aufruf->errorInfo());
          				}
          			}
          		}
          	}
          
          1. Tach!

            Sorry, mit "er" meine ich, meinen Code.

            Ok, ist aber trotzdem noch zu ungenau. Das schöne an Code ist ja, dass man ihn Anweisung für Anweisung nachvollziehen kann. Das schlechte ist, dass man genau das beim Debugging tun muss.

            Du hast da also Code, und der verhält sich insgesamt nicht so, wie er soll. Als Programmierer musst du nun genauer hinsehen und statt "funktioniert nicht" eher sowas sagen wie "Da ist diese bestimmte Zeile Code, da erwarte ich eigentlich XYZ, bekomme aber ABC." Es ist nicht weiter tragisch, wenn du an der Stelle nicht weiterweißt, aber die Vorarbeit, wenigstens bis an diesen Punkt zu kommen, wirst du tun müssen.

            			SELECT
            			*
            			FROM profil_aufrufe WHERE user_id = :id AND aufrufer_id = :user_id AND date < DATE_SUB(CURDATE(), INTERVAL 1 MINUTE) ORDER BY DATE DESC LIMIT 1;
            

            Ist hier vielleicht deine Logik falsch? Zum einen liefert CURDATE() ein Datum ohne Zeitanteil, da willst du wohl eher NOW() haben. Und dann möchtest du doch wissen, ob in den vergangenen 10 Minuten (im Test auf eine reduziert) bereits etwas passiert ist, oder? Dann mach doch mal eine Prüfung mit diversen Werten. Es ist jetzt angenommenerweise 11:30 und DATE_SUB(NOW(), INTERVAL 1 MINUTE) liefert 11:29. Deine Bedingung wird dann wahr, wenn die Uhrzeit in der Tabelle älter/kleiner als 11:29 ist. Ist es das, was diese Abfrage ergeben soll? Zudem muss in "date" auch ein DATETIME enthalten sein.

            Die Problembeschreibung wäre also in dem Fall nicht, dass irgendein Insert nicht funktioniert, sondern dass du bei dieser Abfrage eine unerwartete Anzahl Ergebnisse bekommst.

            dedlfix.

            1. Danke das du dir soviele Mühe machst und mir Tipps gibst. Mir ist bewusst das es hieran liegt:

              date < DATE_SUB(CURDATE(), INTERVAL 1 MINUTE)
              

              Nur habe ich keinen anderen Weg gefunden, wie ich es sonst schreiben soll.

              hab es z.b auch so versucht

              date < DATE_ADD(NOW(), INTERVAL 1 MINUTE)
              

              Hab es ebenso auch bei anderen Sachen gemacht wie z.b zeige alle Beiträge vom letzer Woche, da funktioniert das DATE_SUB/DATE_ADD obwohl mein "date" in timestamp eingetragen ist.

              1. Tach!

                Danke das du dir soviele Mühe machst und mir Tipps gibst. Mir ist bewusst das es hieran liegt:

                date < DATE_SUB(CURDATE(), INTERVAL 1 MINUTE)
                

                Nur habe ich keinen anderen Weg gefunden, wie ich es sonst schreiben soll.

                Was genau soll denn das Statement für ein Ergebnis bringen? Möchtest du wissen, ob in den jüngsten x Minuten Einträge vorhanden sind? Dann muss der Zeitpunkt des Eintrags größer (also jünger) sein als jetzt minus x Minuten. Bei "kleiner als" findest du alle Einträge, die älter als x Minuten sind.

                hab es z.b auch so versucht

                date < DATE_ADD(NOW(), INTERVAL 1 MINUTE)
                

                Wenn deine Systemuhr genau geht, werden wohl Einträge nicht in der Zukunft liegen. Aber auch hier schaut das "kleiner als" ungebremst in die Vergangenheit.

                Hab es ebenso auch bei anderen Sachen gemacht wie z.b zeige alle Beiträge vom letzer Woche, da funktioniert das DATE_SUB/DATE_ADD obwohl mein "date" in timestamp eingetragen ist.

                Dann hast du vielleicht dort was anderes gerechnet. Wenn du zum Beispiel "jetzt" mit dem Datum eines Eintrags von vor 2 Minuten vergleichst, dem du aber 10 Minuten addiert hast, dann ist das "jetzt" kleiner. Bei einem Eintrag von vor 10 Minuten ist das "jetzt" größer. Aber das Delta auf den Datensatz zu rechnen, wäre recht unlogisch und außerdem datenbanktechnisch ungünstig, weil das beim Abfragen für jeden Datensatz geschehen muss, und dafür ein Full Table Scan benötigt wird.

                dedlfix.