Probleme bei SQL-Abfrage...

  • Probleme bei SQL-Abfrage...

    Hallöchen...

    Und zwar hab ich folgendes Problem...

    dieses Script

    Quellcode

    1. <?PHP
    2. $ten = time()-600;
    3. $data = "INSERT INTO icc_profilzaehler (wen, idvon, timestamp) VALUES ('$von','$usid','$zeit') WHERE wen = '$user->id' and idvon = '$usid' and timestamp < '$ten'";
    4. mysql_query($data)or die(mysql_error());
    5. ?>


    überprüfen ob die "wen" = "user->id" (hier 41")
    und die "idvon" = "$usid" (hier 32)...

    wenn die beiden werte gleich sind in der DB soll er 10Min warten bis er den neuen eintrag machen darf (hier $ten = time()-600;)
    er mir aber nur ein fehler auspuckt "you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE wen = '41' and idvon = '41' and timestamp < '1215799671'' at line 1" obwohl ich mir sicher bin das es mit dem and Funktionieren müsste...

    vielleicht wisst ihr ein tip, in der zeit suche ich weiter nach möglichkeiten...

    gruß
    Toxic
  • Ein Insert mit einer Where-Bedingung ist doch an sich ein Logikfehler:
    "Füge in die Tabelle eine neue Zeile ein, und zwar dort, wo bereits was anderes steht...?"

    Drum schau Dir doch mal den Update-Befehl an.
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Jeder glaubt, er hätte genug davon.
    --------------------------------------------------(Rene Descartes)
  • hallo...

    soll ja kein update werden... eher das insert sein... und da Where-Bedingung ja ein logig fehler ist bleibt nur noch die If-Else variante um zu schauen ob die Variabeln vorhanden sind und dann ob die zeit abgelaufen ist... und dann ja erst eintragn darf...

    sprich

    wenn

    INSERT INTO `icc_profilzaehler` VALUES (1, 46, 41, '1215799268');

    drin ist und die id mit dem user gleich sind mit der id wo es eingetragen sind, schaut er nach dem Timestamp und wenn 10 min um sind darf er erst das

    INSERT INTO `icc_profilzaehler` VALUES (2, 46, 41, '12157998999');

    eintragen.

    so gewisserweise darf er nich bei jeden Profilaufruf was eintreagen, nur in 10min schritten.

    greets
    toxic
  • Das hört und ließt sich wie ein Update an, was aber nicht gemacht werden soll... mehr, er soll nach 10 min wieder ein neuen eintrag machen... aber nur von dem user"41"... wenn user 34 drauf geht soll er dies direkt machen und dann auch erst wieder nach 10min bei user"34"...

    ich hab hier mal was gebaut... was auch soweit funktioniert... aber das Problem ist... wenn der user noch nicht in der DB steht führt er den befehl nicht aus trotz (empty)...

    Quellcode

    1. $abfrag = "SELECT * FROM icc_profilzaehler WHERE wen = '$user->id'";
    2. $abfrage = mysql_query($abfrag);
    3. while ($row = mysql_fetch_object($abfrage)) {
    4. $von = $row->wen;
    5. IF(empty($von)) {
    6. $zeit = time();
    7. $eintrag = "INSERT INTO icc_profilzaehler (wen, idvon, timestamp) VALUES ('$user->id','$usid','$zeit')";
    8. mysql_query($eintrag)or die(mysql_error());
    9. }ELSE{
    10. $abfrag = "SELECT * FROM icc_profilzaehler WHERE wen = '$user->id'";
    11. $abfrage = mysql_query($abfrag);
    12. while ($row = mysql_fetch_object($abfrage)) {
    13. IF($row->timestamp > time()-600) {
    14. $zeit = time();
    15. $eintrag = "INSERT INTO icc_profilzaehler (wen, idvon, timestamp) VALUES ('$user->id','$usid','$zeit')";
    16. mysql_query($eintrag)or die(mysql_error());
    17. }ELSE{
    18. echo 6;
    19. }}
    20. }}
    Alles anzeigen


    weiß im moment nicht wirklich weiter wie ich es machen soll... "empty geht nur wenn was in der DB steht über der "id" und wenn ich es weglasse setzt er bei jeden Klick was in der DB... denn wenn das "echo nichts" kommt, kann ich ihm die Zeitspanne von 10 min für den eintag geben... und wenn die Zeitspanne noch nicht rum ist gibt er halt das "echo 6;" aus...

    greets
    Toxic
  • hm, sieht ja leicht konfus aus...

    also:
    wenn in der DB nicht steht, daß Person A die Profilseite von Person B je besucht hat -> eintragen
    wenn in der DB entsprechende Einträge sind, diese aber älter als 10min sind -> eintragen
    wenn in der DB ein solcher Eintrag ist, dieser aber jünger ist als 10min -> nicht eintragen

    Hab ich's so richtig verstanden? Dann überprüf das doch so:

    Quellcode

    1. SELECT IF(COUNT(*)>0,0,1)
    2. FROM icc_profilzaehler
    3. WHERE wen = '$user->id'
    4. AND idvon='$usid'
    5. AND (NOW()-timestamp)<600

    Wenn die Abfrage ne "1" ergibt, mach Dein Insert und das war's.

    Nebenbei: Laß doch die DB den Timestamp setzen, statt php zu bemühen.
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Jeder glaubt, er hätte genug davon.
    --------------------------------------------------(Rene Descartes)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von McSush ()

  • Hallo....

    Ist richtig wie du es Verstanden hast @mcsush...

    mmmhhhmmmm Anfrage eine "1"...

    also ich hab das Script dann mal so zusammengebaut...

    Quellcode

    1. $abfrag ="
    2. SELECT IF(COUNT(*)>0,0,1)
    3. AS PRO
    4. FROM icc_profilzaehler
    5. WHERE wen = '$user->id'
    6. AND idvon='$usid'
    7. AND (NOW()-timestamp)<600";
    8. $ja2 = mysql_fetch_array($abfrag);
    9. echo $ja2 ['pro'];


    nur gibt er mir geine 1 zurück...

    greets
    toxic
  • hm, ja, hast versucht ein mysql_fetch_array auf nen string, statt nem mysql_query zu setzen
    .... najut, also zurücklehnen und genießen:

    Quellcode

    1. $query=mysql_query("
    2. SELECT IF(COUNT(*)>0,0,1)
    3. FROM icc_profilzaehler
    4. WHERE wen = '$user->id'
    5. AND idvon='$usid'
    6. AND (now()-timestamp)<600
    7. ");
    8. if(mysql_result($query,0)){
    9. $check=mysql_query("
    10. INSERT INTO icc_profilzaehler (wen,idvon)
    11. VALUES ('$user->id','$usid')
    12. "); //wenn timestamp autom. von der DB gesetzt wird.
    13. echo $check ? "eingetragen" : "fehler!";
    14. }else{
    15. echo "nö, zu früh";
    16. }
    Alles anzeigen

    fettich.
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Jeder glaubt, er hätte genug davon.
    --------------------------------------------------(Rene Descartes)
  • hallo

    Dank dir, das war wohl das Problem was ich mit beim testen gemacht hatte und noch weitere...

    Ich hatte mich vorher immer gewundert das wenn ich über Sql-Timestamp gegangen bin er mir dies auspuckt:

    INSERT INTO `icc_profilzaehler` VALUES (5, 23, 41, '2008-07-12 12:13:58');

    Sprich '2008-07-12 12:13:58' wo ich doch die wirren Zahlen gewohnt bin "93472138476" und ich dachte das er das garnicht übersetzen kann, aber nun bin ich ein besseren belehrt worden und habe mal wieder viel dazugelernt...

    Dank dir für die schnelle hilfe...

    greets
    Toxic
  • argh! und ich auch vielleicht mal ... hast recht:
    das timestamp-feld hat ja schon seit mysql 4.1 ne neue Formatierung.
    Irgendwann merk ich's mir auch. *seufz*

    das hier sieht zwar hübscher aus, ist aber schon seit langem falsch,
    auch wenn's beim testen nicht auf dem ersten Blick auffällt. (100 wird als 1 Minute verstanden...)

    SQL-Abfrage

    1. AND (now()-timestamp)<600


    richtig müßte es heißen:

    SQL-Abfrage

    1. AND (DATE_ADD(timestamp, INTERVAL 10 MINUTE)>NOW())


    Sorry für die Falschinfo

    [EDIT]
    Hab ihm eben noch ne Email deswegen geschrieben. sicher ist sicher ... :whistling:
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Jeder glaubt, er hätte genug davon.
    --------------------------------------------------(Rene Descartes)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von McSush ()