Alt 25.02.2010, 11:02:12   #1 (permalink)
Gsus
schwankend^^

ID: 215354
Lose senden
Reallife

Reg: 22.05.2006
Beiträge: 1.559
Standard Problem bei Reloadsperre

Hallo,
ich programmiere mir gerade ein kleines Ad-Management Sytem. Mein Problem ist jetzt, die Reloadsperre bei Bannerviews.

Ich habe zwei Tabellen:
global_ads
idlinkurlbannerurlviews_gebuchtviews_abgebautklicks_gebuchtklicks_abgebautreloaddatum

global_ads_reload

idipzeit

Mein Query dafür sieht momentan so aus:
Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
SELECT `global_ads`.`id`, `global_ads`.`bannerurl` FROM `global_ads` LEFT JOIN `global_ads_reload` ON (`global_ads`.`id` = `global_ads_reload`.`id`) WHERE ( `global_ads`.`views_gebucht` > `global_ads`.`views_abgebaut` OR `global_ads`.`klicks_gebucht` > `global_ads`.`klicks_abgebaut` ) AND ORDER BY RAND() LIMIT 1
Der AND-Teil des WHERE-Statements ist das, worauf ich absolut nicht komme. Und zwar sollen nur Banner ausgegeben werden, die für den aktuellen User (zu identifizieren über ip) in den letzten x-Sekunden (x entspricht dem feld reload) nicht in der Tabelle global_ads_reload steht.

Ich hoffe ihr versteht das Problem und könnt mir helfen.

mfg
Gsus
Gsus ist offline   Mit Zitat antworten
Alt 25.02.2010, 11:13:07   #2 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard

Guckst du FAQ: [PHP/MySQL] Suche Datensätze aus Table 1 mit einer ID, die in Table 2 (nicht)vorkommt
Das sollte dein Problem lösen, wenn ich die Frage richtig verstanden hab.
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline   Mit Zitat antworten
Alt 25.02.2010, 11:15:27   #3 (permalink)
Gsus
schwankend^^

ID: 215354
Lose senden
Reallife

Reg: 22.05.2006
Beiträge: 1.559
Standard

theoretisch löst es das ja. das problem ist aber, das ich die user nicht grundsätzlich ausschließen will, wenn sie einen banner bereits gesehen haben, wie es in dem beispiel der fall ist, sondern nur für die anzahl der sekunden die im feld reload steht
Gsus ist offline Threadstarter   Mit Zitat antworten
Alt 25.02.2010, 11:17:16   #4 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard

Dann gibst du diese Nebenbedingung beim JOIN mit an.
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline   Mit Zitat antworten
Alt 25.02.2010, 15:19:00   #5 (permalink)
transversalis
alias Echnaton
Benutzerbild von transversalis

ID: 309239
Lose senden

Reg: 18.01.2008
Beiträge: 4.172
Standard

Versuch mal so was:

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
SELECT `global_ads`.`id`, `global_ads`.`bannerurl
FROM `global_ads
LEFT JOIN `global_ads_reload
ON (`global_ads`.`id` = `global_ads_reload`.`id`
AND  `
global_ads_reload`.`ip` = ermittelte-IP-Adresse )

WHERE 
`
global_ads`.`views_gebucht` > `global_ads`.`views_abgebaut` OR 
`
global_ads`.`klicks_gebucht` > `global_ads`.`klicks_abgebaut` ) 
AND 
( `
global_ads_reload`.`idIS NULL OR
CURRENT_TIMESTAMP - `global_ads_reload`.`zeit` >  `global_ads`.`reload`
)

ORDER BY RAND() LIMIT 1 
"transversalis teleport" sprach der Magier und war fort
transversalis ist offline   Mit Zitat antworten
Alt 25.02.2010, 15:51:45   #6 (permalink)
Gsus
schwankend^^

ID: 215354
Lose senden
Reallife

Reg: 22.05.2006
Beiträge: 1.559
Standard

Zitat:
Zitat von transversalis Beitrag anzeigen
Versuch mal so was:

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
SELECT `global_ads`.`id`, `global_ads`.`bannerurl
FROM `global_ads
LEFT JOIN `global_ads_reload
ON (`global_ads`.`id` = `global_ads_reload`.`id`
AND  `
global_ads_reload`.`ip` = ermittelte-IP-Adresse )

WHERE 
`
global_ads`.`views_gebucht` > `global_ads`.`views_abgebaut` OR 
`
global_ads`.`klicks_gebucht` > `global_ads`.`klicks_abgebaut` ) 
AND 
( `
global_ads_reload`.`idIS NULL OR
CURRENT_TIMESTAMP - `global_ads_reload`.`zeit` >  `global_ads`.`reload`
)

ORDER BY RAND() LIMIT 1 
ja das sieht so aus als müsste es klappen tuts leider nicht xD ich habe in reload etwas stehen, trotzdem gibt er mir diesen banner immer aus -.- und auch in der reloadtabelle steht meine ip mit zeit und der bannerid -.-
hat noch jemand eine idee? muss das feld zeit ein bestimmtes format haben dafür? habe es mit datetime gemacht...
Gsus ist offline Threadstarter   Mit Zitat antworten
Alt 25.02.2010, 16:45:11   #7 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard

Zitat:
Zitat von Gsus Beitrag anzeigen
muss das feld zeit ein bestimmtes format haben dafür? habe es mit datetime gemacht...
Wenn du DATETIME-Typen hast, kannst du nicht einfach subtrahieren, sondern musst DATE_ADD()/DATE_SUB() verwenden.

Lass dir die relevanten Attribute einfach mit ausgeben und kontrolliere, ob du korrekt rechnest.
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline   Mit Zitat antworten
Alt 25.02.2010, 16:53:58   #8 (permalink)
Gsus
schwankend^^

ID: 215354
Lose senden
Reallife

Reg: 22.05.2006
Beiträge: 1.559
Standard

Zitat:
Zitat von theHacker Beitrag anzeigen
Wenn du DATETIME-Typen hast, kannst du nicht einfach subtrahieren, sondern musst DATE_ADD()/DATE_SUB() verwenden.
danke.. das funktioniert soweit.. allerdings nur 1x xD heißt: wenn die ip mit dem banner nicht in der db ist, wird der banner angezeigt. dann wird er so lange wie es in reload steht nicht mehr angezeigt, dann aber wieder die ganze zeit, ohne das die reloadzeit erneut 10 sekunden ist..

das gesamte script zum ausgeben der banner sieht so aus:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
 //Banner aus der Datenbank laden
 
$result $mysql->query("SELECT `global_ads`.`id`, `global_ads`.`bannerurl` FROM `global_ads` LEFT JOIN `global_ads_reload` ON (`global_ads`.`id` = `global_ads_reload`.`id` AND `global_ads_reload`.`ip` = INET_ATON('%s')) WHERE (`global_ads`.`views_gebucht` > `global_ads`.`views_abgebaut` OR `global_ads`.`klicks_gebucht` > `global_ads`.`klicks_abgebaut`) AND (`global_ads_reload`.`id` IS NULL OR (DATE_ADD(`global_ads_reload`.`zeit`, INTERVAL `global_ads`.`reload` SECOND))<NOW()) ORDER BY RAND() LIMIT 1"$_SERVER['REMOTE_ADDR']);
 
$banner mysql_fetch_assoc($result);
 
//Views hochzählen
 
$result $mysql->query("UPDATE `global_ads` SET `views_abgebaut` = `views_abgebaut`+1 WHERE `id`=%u LIMIT 1"$banner['id']);
 
//Reloadeintrag speichern 
 
$result $mysql->query("INSERT INTO `global_ads_reload` (`id`, `ip`, `zeit`) VALUES (%u, INET_ATON('%s'), NOW())"$banner['id'], $_SERVER['REMOTE_ADDR']); 
edit: habe gerade überlegt, dass das daran liegen könnte, dass dann ja 2 reload einträge vorhanden sind.. einer mit abgelaufener relaodsperre und einer mit neuer.. wenn er da dann die abgelaufene nimmt ist das verhalten logisch... also müsste man das eintragen der reloadsperre durch sowas ersetzen:
Code:
1:
$result = $mysql->query("INSERT INTO `global_ads_reload` (`id`, `ip`, `zeit`) VALUES (%u, INET_ATON('%s'), NOW()) ON DUPLICATE KEY UPDATE `zeit` = NOW()", $banner['id'], $_SERVER['REMOTE_ADDR']);
dabei ist jetzt das porblem, dass es ja praktisch dann eine kombination aus 2 schlüsseln wäre, nämlich ip und id.. geht das dann trotzdem? weil er soll das ja nur ändern, wenn die kombination aus ip und id bereits vorhanden ist..

Geändert von Gsus (25.02.2010 um 17:10:34 Uhr)
Gsus ist offline Threadstarter   Mit Zitat antworten
Alt 25.02.2010, 17:14:07   #9 (permalink)
flaschenkind
Erfahrener Benutzer

ID: 118459
Lose senden

Reg: 20.04.2006
Beiträge: 4.530
Standard

Zitat:
Zitat von Gsus Beitrag anzeigen
dabei ist jetzt das porblem, dass es ja praktisch dann eine kombination aus 2 schlüsseln wäre, nämlich ip und id.. geht das dann trotzdem? weil er soll das ja nur ändern, wenn die kombination aus ip und id bereits vorhanden ist..
Jo das geht, leg den Primär-Index (oder Unique) über beide Felder.
flaschenkind ist offline   Mit Zitat antworten
Alt 25.02.2010, 17:23:45   #10 (permalink)
Gsus
schwankend^^

ID: 215354
Lose senden
Reallife

Reg: 22.05.2006
Beiträge: 1.559
Standard

Das geht tatsächlich
dann ist das problem jetzt gelöst

danke an alle
Gsus ist offline Threadstarter   Mit Zitat antworten
Alt 25.02.2010, 19:45:21   #11 (permalink)
transversalis
alias Echnaton
Benutzerbild von transversalis

ID: 309239
Lose senden

Reg: 18.01.2008
Beiträge: 4.172
Standard

Zitat:
Zitat von theHacker Beitrag anzeigen
Wenn du DATETIME-Typen hast, kannst du nicht einfach subtrahieren, sondern musst DATE_ADD()/DATE_SUB() verwenden.

Selbstverständlich kannst Du zwei TIMESTAMP-Felder subtrahieren. Das Ergebnis ist eine TIME-Duration.

z.B:

PHP-Code:
1:
2:
3:
4:
5:
SELECT  a-b
FROM
SELECT 
timestamp
('2010-02-25 19:32:43'
timestamp('2009-01-17 18:30:43'tabl 

ergibt:
PHP-Code:
1:
10108010200.000000 
wobei jedesmal zwei Stellen für Jahr , Monat, Tag, Stunde, Minute und Sekunde steht.
Die Differenz ist hier also 1 Jahr, 1 Monat, 8 Tage, 1 Stunden, 2 Minuten und 0 Sekunden

Eine derartige Time-Duration kannst Du übrigens auch wieder zu einem Timestamp dazuaddieren.
"transversalis teleport" sprach der Magier und war fort
transversalis ist offline   Mit Zitat antworten
Alt 25.02.2010, 19:58:28   #12 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard

Es geht zwar um DATETIME, nicht um TIMESTAMP, aber Tatsache, es funktioniert auch da:
Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.0.51a-community-nt MySQL Community Edition (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use test; Database changed mysql> create table foodate (a datetime, b datetime) engine=myisam; Query OK, 0 rows affected (0.05 sec) mysql> insert into foodate (a, b) values ('2010-02-25 13:00', '2010-02-25'); Query OK, 1 row affected (0.01 sec) mysql> select a, b, a-b from foodate; +---------------------+---------------------+---------------+ | a | b | a-b | +---------------------+---------------------+---------------+ | 2010-02-25 13:00:00 | 2010-02-25 00:00:00 | 130000.000000 | +---------------------+---------------------+---------------+ 1 row in set (0.06 sec) mysql> drop table foodate; Query OK, 0 rows affected (0.00 sec) mysql>
Das wusste ich nicht. Danke für die Aufklärung
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline   Mit Zitat antworten
Antwort

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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 sind an
Pingbacks sind an
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Neue Reloadsperre klamm klamm talk 718 03.10.2010 20:51:00
WMS Reloadsperre Slemens Bug-Report 4 29.08.2008 13:24:29
[s] Linkcounter mit IP Reloadsperre Cosmo Scripts & Software 4 07.06.2007 12:07:57
Reloadsperre der Startseite Code-Haufen Bug-Report 5 08.03.2007 23:08:37
z.B - Gittam.de - Reloadsperre Charly-3 Ich bin neu hier und habe eine Frage! 19 13.12.2006 15:38:05


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:12:58 Uhr.