Problem mit CREATE PROCEDURE

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit CREATE PROCEDURE

    Hallo,
    ich will eine Click-Zähler mit MySQL realisieren.
    Jede IP wird danach für x Stunden gesperrt.

    In der Tabelle "clicklock" stehen die gesperrten IP Adressen.
    Mit CronJobs wird diese Tabelle minütlich, bei den entsprechenden Zeilen, geleert.

    Allerdings funktioniert bei mir die Click-Procedure nicht :-(
    Kann mir jemand helfen?

    Übergeben wird die IP Adresse (32bit) und die Party-ID.

    Code:
    CREATE PROCEDURE click( address INT, partyId INT )
    BEGIN
    
    IF EXISTS(SELECT 1 FROM clicklock WHERE ip = address) THEN -- wenn nicht gesperrt
    UPDATE party SET clicks = clicks + 1 WHERE id = partyId LIMIT 1; -- feld "clicks" in tabelle "party" inkrementieren
    INSERT INTO clicklock VALUES( address ); -- Ip sperren ( das zweite Feld hat automatisch CURRENT_TIMESTAMP )
    END IF;
    
    END;
    Fehlermeldung ist ganz toll und informativ:
    Code:
    #1064 - 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 '' at line 4
    Ich bedanke mich schon mal recht herzlich :-) !
    Ich weiß, dass es wieder irgendwas kleines ist...

    - Philipp
    Find Parties?
    Partysuche

  • #2
    Anderes Symptom, aber vielleicht der gleiche Bug: MySQL Bugs: #3157: Crash if stored procedure contains IF EXISTS
    Zieh das SELECT doch mal vor das IF, speichere den Wert in einer Variablen und benutze diese in der IF-Bedingung. Vielleicht klappts dann schon.

    Kommentar


    • #3
      Okay interessant, danke!
      Ich bin nun hier, jedoch funktioniert es trotzdem nicht :-( ...
      Gleicher Fehler

      Code:
      CREATE PROCEDURE click( address INT, partyId INT )
      BEGIN
      DECLARE c INT;
      
      SELECT count(*) FROM clicklock WHERE ip = address LIMIT 1 INTO c;
      IF c = 1 THEN -- wenn nicht gesperrt
      UPDATE party SET clicks = clicks + 1 WHERE id = partyId LIMIT 1; -- feld "clicks" in tabelle "party" inkrementieren
      INSERT INTO clicklock VALUES( address ); -- Ip sperren ( das zweite Feld hat automatisch CURRENT_TIMESTAMP )
      END IF;
      
      END;
      Find Parties?
      Partysuche

      Kommentar


      • #4
        Ah du musst den Delimiter ändern, z.B. in // un dann
        Code:
        CREATE PROCEDURE click( address INT, partyId INT )
        BEGIN
        
        IF EXISTS(SELECT 1 FROM clicklock WHERE ip = address) THEN 
            UPDATE party SET clicks = clicks + 1 WHERE id = partyId LIMIT 1; 
            INSERT INTO clicklock VALUES( address ); 
        END IF;
        
        END//
        PhpMyAdmin hat im Tab SQL unter der Textarea ein Feld für den Delimiter.

        Kommentar


        • #5
          großer Forschritt :-D
          es funktioniert schon mal, aber exists mag er immer noch nicht, bei der Ausführung mit "CALL". Er erzählt mir irgendwas von "count field nix exists" oder ähnlich.
          Die nachfolgende Prozedur wird geparst und ausgeführt, allerdings funktioniert der insert in die tabelle nicht. Wenn ich einen Eintrag in "clicklock" mache meckert der Server allerdings, wenn ich mit der Prozedur den Insert erzwinge. "Primärschlüssel existiert schon", also funktioniert der insert schon, aber gibt es einen insert mit delay oder ähnlich?

          Code:
          CREATE PROCEDURE click( address INT, partyId INT )
          BEGIN
          DECLARE c INT;
          
          SELECT count(*) FROM clicklock WHERE ip = address LIMIT 1 INTO c;
          IF c = 1 THEN
          BEGIN
          INSERT INTO clicklock VALUES( address, NOW( ) );
          UPDATE party SET clicks = clicks + 1 WHERE id = partyId LIMIT 1;
          END;
          END IF;
          
          END //
          Find Parties?
          Partysuche

          Kommentar


          • #6
            Dein Problem ist wohl, dass mehrere Clicks von der selben IP in einer Sekunde stattfinden können. Entweder verhinderst du das oder änderst deine Schlüsseldefinition oder benutzt Timestamps mit Mikrosekunden.

            Kommentar


            • #7
              Hallo,

              also wenn ich nicht total falsch liege, stimmt einfach deine Bedingung nicht. Ich hab es so verstanden:

              In der Tabelle clicklock stehen die gesperrten IP-Adressen als Primärschlüssel drin. Wenn du also die Prozedur click mit einer IP-Adresse aufrufst, die in der Tabelle enthalten ist, soll gar nichts passieren. Wenn die aktuelle IP-Adresse nicht enthalten ist, dann soll sie eingetragen werden und in der party-Tabelle das Feld clicks inkrementiert werden. Ist das soweit richtig?

              Wenn ja, musst du die Bedingung auf IF c = 0 umschreiben, denn c = 1 ist ja erfüllt, wenn die IP-Adresse bereits gesperrt ist. Ein weiteres INSERT führt dann natürlich zu einer Fehlermeldung, weil die Adresse ja schon drin steht.

              Gruß,

              Amica
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar

              Lädt...
              X