php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 17-10-2009, 18:06
Flip7
 Registrierter Benutzer
Links : Onlinestatus : Flip7 ist offline
Registriert seit: May 2007
Ort: Munich
Beiträge: 126
Flip7 ist zur Zeit noch ein unbeschriebenes Blatt
Flip7 eine Nachricht über ICQ schicken
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 17-10-2009, 18:30
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #3 (permalink)  
Alt 17-10-2009, 18:44
Flip7
 Registrierter Benutzer
Links : Onlinestatus : Flip7 ist offline
Registriert seit: May 2007
Ort: Munich
Beiträge: 126
Flip7 ist zur Zeit noch ein unbeschriebenes Blatt
Flip7 eine Nachricht über ICQ schicken
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 17-10-2009, 19:42
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #5 (permalink)  
Alt 17-10-2009, 21:08
Flip7
 Registrierter Benutzer
Links : Onlinestatus : Flip7 ist offline
Registriert seit: May 2007
Ort: Munich
Beiträge: 126
Flip7 ist zur Zeit noch ein unbeschriebenes Blatt
Flip7 eine Nachricht über ICQ schicken
Standard

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
Mit Zitat antworten
  #6 (permalink)  
Alt 17-10-2009, 22:01
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt 18-10-2009, 00:28
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Stored Procedure / PHPmyadmin-Problem stulka SQL / Datenbanken 9 09-08-2007 16:28
stored procedure problem galaxy2 SQL / Datenbanken 2 03-01-2006 09:01
Oracle procedure galaxy2 SQL / Datenbanken 0 01-12-2005 10:16
Create Tabble Problem archie SQL / Datenbanken 1 01-09-2002 16:37
Problem mit Create View .. select Ralf SQL / Datenbanken 1 22-10-2001 14:02

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:13 Uhr.