Volledige versie bekijken : 1 keer per minuut
bkersten
%Europe/Berlin %798 %2006, 19:10
Weet iemand hoe ik het voor elkaar kan krijgen dat een gebruiker maar 1 keer per minuut een pagina (PHP) kan zien?
Dus dat er in die minuut bijvoorbeeld word afgeteld van 60 tot 0 en dat daarna de pagina weer zichtbaar word.
TheDutch
%Europe/Berlin %805 %2006, 19:19
Dat moet je dan in een database bijhouden op IP, User-Agent en datum/tijd. Die vergelijk je dan elke keer dat een pagina aangeroepen wordt :).
w00
%Europe/Berlin %830 %2006, 19:55
zou ik geen datum/tijd voor gebruiken maar de time() functie.
TheZwier
%Europe/Berlin %841 %2006, 20:11
zou ik geen datum/tijd voor gebruiken maar de time() functie.
Dat komt toch op hetzelfde neer? tijd=time() :)
TheDutch
%Europe/Berlin %848 %2006, 20:22
Precies, jij snapt het TheZwier. Wanneer ik timestamp zou zeggen zou het misschien onduidelijk zijn :).
w00
%Europe/Berlin %853 %2006, 20:28
ow ik dacht dat je bedoelde een date/time kolom maken in de database.
TheDutch
%Europe/Berlin %862 %2006, 20:42
Wel wanneer je wilt vergelijken met gegevens in een database. Je slaat een timestamp op in de database en die vergelijk je met de timestamp van het moment dat een pagina wordt opgevraagd.
w00
%Europe/Berlin %913 %2006, 21:54
Ja als het echt om dagen gaat, maar in dit geval zou ik de waarde van time() opslaan in de database als type INT en niet in een date/time veld zoals jij kennelijk bedoeld.
TheDutch
%Europe/Berlin %920 %2006, 22:05
Ik zou het op een timestamp houden die het aantal seconden vanaf 01-01-1970 teruggeeft. Dit omdat je dan het meest flexibel bezig bent en je geen fouten kunt krijgen. Er is mijns inziens geen goede rede waarom je in dit geval eerder time() zou moeten gebruiken :).
w00
%Europe/Berlin %921 %2006, 22:06
Ja dat geeft time() nou juist weer :)
TheDutch
%Europe/Berlin %229 %2006, 05:30
Dan hebben we het over hetzelfde ;).
bkersten
%Europe/Berlin %649 %2006, 15:35
@The_Dutch: En hoe kan ik dit doen?
josko
%Europe/Berlin %661 %2006, 15:53
ip: $_SERVER['REMOTE_ADDR']
user-agent: $_SERVER['HTTP_USER_AGENT']
tijd: time();
Schrijf deze weg in een table in MySQL.
Vervolgens kijk je bij de huidige ip en user_agent of er een tijd kleiner dan of gelijk aan de huidige tijd staat.
time()-60 is dus een minuut geleden :)
Voetsjoeba
%Europe/Berlin %982 %2006, 23:34
Waarom geen sessions ? Lijkt me vrij overkill om daarvoor een database te gaan gebruiken, we spreken hier tenslotte over tijden van 1 minuut. Gewoon laatste page visit in session opslaan en vergelijken met huidige tijd. Als hij erover is, laatste page visit refreshen, anders pagina niet laten zien.
josko
%Europe/Berlin %989 %2006, 23:45
Waarom geen sessions ? Lijkt me vrij overkill om daarvoor een database te gaan gebruiken, we spreken hier tenslotte over tijden van 1 minuut. Gewoon laatste page visit in session opslaan en vergelijken met huidige tijd. Als hij erover is, laatste page visit refreshen, anders pagina niet laten zien.
En als de gebruiker écht maar 1 per minuut mag zien?
Onafhankelijk van user agents en dergelijke?
Dan zou je dus wél met db's moeten werken.
En mij lijkt niet dat wij dit type dingen in gaan bouwen met zo'n makkelijke omweg.
Voetsjoeba
%Europe/Berlin %997 %2006, 23:57
En als de gebruiker écht maar 1 per minuut mag zien?
Onafhankelijk van user agents en dergelijke?
Dan zou je dus wél met db's moeten werken.
En mij lijkt niet dat wij dit type dingen in gaan bouwen met zo'n makkelijke omweg.
* nvm, vraag verkeerd begrepen
bkersten
%Europe/Berlin %577 %2006, 13:51
@Voetsjoeba: Dit is volgens mij wel wat ik wil.
Maar hoe kan ik dit doen met sessions?
WernerL
%Europe/Berlin %590 %2006, 14:10
ipv het in een db te zetten zet je het in een sessie.
$_SESSION['bla'] = waarde; :+
bkersten
%Europe/Berlin %601 %2006, 14:26
Ik heb nu onderstaand scriptje, maar hier moet volgens mij nog iets aan veranderd worden.
Zouden jullie er even naar willen kijken?
<?
$seconden = date("S");
$tekst1 = "Je kunt deze pagina maar 1 keer per minuut bekijken. Je moet wachten tot de 1 minuut voorbij is.";
$testk2 = "Nu kun je de pagina weer bekijken (1 minuut).";
$tekst3 = "Foutje.";
if ($seconden <= 60) {
echo "$tekst1";
}
elseif ($seconden > 60) {
echo "$tekst2";
}
else {
echo "$tekst3";
}
?>
WernerL
%Europe/Berlin %616 %2006, 14:48
session_start();
if($_SESSION['visittime'] <= time()-60){
$_SESSION['visittime'] = time();
//jeuj mag
}else{
mag niet
}
Zoiets mss ?
//edit
waarom verwijder je je bericht? Nu lijkt het alsof ik dubbelposte... :)
bkersten
%Europe/Berlin %626 %2006, 15:02
Ja, hij doet het nu wel, maar wanneer word nu gezegd dat je geen toegang hebt?
Want als ik 'm ga testen (zie onderstaand script) dan blijft hij altijd weergeven dat je 'mag', dus dat je acties kan uitvoeren.
<?
session_start();
if($_SESSION['visittime'] <= time()-10){
$_SESSION['visittime'] = time();
echo "Je mag nu.";
}else{
echo "Je mag niet.";
}
?>
Ps. Ik heb voor het testen de 60 seconden, even veranderd in 10 seconden.
WernerL
%Europe/Berlin %635 %2006, 15:15
Correctie, je moet het in milliseconden meegeven. Als ik de pagina oproep en heel snel refresh krijg ik wel de melding "je mag niet" :-)
Dus even paar nulletjes achter 10 zetten.
60000 is dus 1 minuut als het goed is.
bkersten
%Europe/Berlin %644 %2006, 15:28
Inderdaad!
Maar het is voor een credits script.
Ik heb dus een script, en als de pagina met dat script word geopend, dan word er bij de ingelogde gebruiker, 1 credit bijgeschreven.
En nu wou ik dus dit script gebruiken, zodat de gebruiker niet de hele tijd op vernieuwen kan klikken.
Maar volgens mij is dit script daar niet goed voor.
Maar ik ga dit script denk ik ergens anders voor gebruiken.
Maar weet iemand dus een script, waardoor de gebruiker maar 1 keer per minuut kan refreshen? Of eigenlijk dat er maar 1 keer per minuut een credit bijgeschreven kan worden.
Onderstaand script is het credits script.
<?
require("".$script_url."admin/ip/block.php");
require("".$script_url."config.php");
$query = mysql_query("UPDATE news_users SET credits = credits + 1 WHERE userid = '$userid'") or die;
?>
WernerL
%Europe/Berlin %645 %2006, 15:29
Mijn script voldoet toch prima? time() gebruikt servertijd dus cheaten is toch echt niet mogelijk meer dan :)
bkersten
%Europe/Berlin %662 %2006, 15:53
Maar als ik jou script gebruik, dan staat er dat je binnen bent (en je dus een credit krijgt) en als ik dan op vernieuwen klik, dan staat er ook dat je binnen bent en krijg je dus weer een credit bijgeschreven. Maar dit laatste wil ik dus voorkomen. Dus dat je maar 1 keer per minuut een credit krijgt als je dan op vernieuwen klikt.
mrijsdijk
%Europe/Berlin %662 %2006, 15:54
pagina sluiten en weer openen, nieuwe sessie
WernerL
%Europe/Berlin %666 %2006, 15:59
pagina sluiten en weer openen, nieuwe sessie
You've got a point :)
@bkersten: ik heb het script getest, en het werkte bij mij :)
if($_SESSION['visittime'] <= time()-10){
dat vetgedrukte moeten milliseconden zijn. Dus 1000 is 1 seconde.
bkersten
%Europe/Berlin %669 %2006, 16:03
Maar ik include de pagina op 1 van mijn pagina's op mijn site.
En als ik dan naar die pagina ga, dan word er dus 1 credit bijgeschreven.
Dan ga ik naar een andere pagina (klik ik dus op een link).
Na 1 minuut ga ik weer terug naar de eerste pagina en dus zou er eigenlijk een credit bijgeschreven moeten worden.
Maar er staat dan nog steeds: Je mag niet.
bkersten
%Europe/Berlin %679 %2006, 16:17
Onderstaand script is eigenlijk het juiste (ik heb ff gezocht).
Maar er is 1 probleem.
Als er staat: Je kunt deze pagina maar 1 keer bezoeken, dan moet alles wat onder het PHP gedeelte staat, wel weergegeven woden.
De HTML moet dus altijd worden weergegeven.
Weet iemand hoe ik dit in onderstaand script kan veranderen?
<?php
function PageViewLimit(){
$PvlViews=1; // Number of pageviews.
$error="Je kunt deze pagina maar 1 keer per minuut bezoeken."; // Change in the error in something you want.
session_start();
if(!isset($_SESSION['Pvl'])){
$_SESSION['Pvl']['Time']=time();
$_SESSION['Pvl']['Views']=1;
}
else{
// delete if excists longer than 60 seconds, and make a new one
if((time()-$_SESSION['Pvl']['Time']) >= 60){
session_unset();
session_destroy();
session_start();
$_SESSION['Pvl']['Time']=time();
$_SESSION['Pvl']['Views']=1;
}
else{
$_SESSION['Pvl']['Views']++;
if($_SESSION['Pvl']['Views']>=$PvlViews){
exit($error);
mysql_query("UPDATE news_users SET credits = credits + 1 WHERE userid = '$userid'");
$result = mysql_num_rows($query);
}
}
}
}
PageViewLimit();
?>
<body>
Dit is de pagina, en dit gedeelte moet dus altijd zichtbaar zijn.
</body>
josko
%Europe/Berlin %769 %2006, 18:27
if($_SESSION['Pvl']['Views']>=$PvlViews){
exit($error);
mysql_query("UPDATE news_users SET credits = credits + 1 WHERE userid = '$userid'");
$result = mysql_num_rows($query);
}
}
dat zet het script stop. daar zou je dus iets mee moeten doen :)
bkersten
%Europe/Berlin %778 %2006, 18:40
Ja, maar de vraag is: wat? :P
Ik heb al veel geprobeerd, maar het werkt allemaal niet :P
TheDutch
%Europe/Berlin %779 %2006, 18:42
Ik zou het gebruik van sessies voor dit doel afraden. Dit zijn 5 redenen die ik me zo even snel kon bedenken:
1. Sessies zijn browser specifiek. Dit betekend dat wanneer je alleen naar het IP kijkt (want user-agent is niet altijd nodig) iemand gewoon een andere browser kan starten en gewoon de pagina(s) weer kan zien.
2. Veelal worden sessies als object ge-cleared wanneer er wordt uitgelogt. Hiermee zullen dan ook de restrictie gegevens voor de pagina(s) verdwijnen en is er weer open toegang. Tuurlijk kan je er dan voor zorgen dat niet het hele sessie object ge-cleared wordt maar dat is niet voor iedereen mogelijk en niet flexibel.
3. Van sessies kunnen geen statistieken bijgehouden worden. Ik kan me voorstellen dat het belangrijk kan zijn dat er statistieken van dit soort processen zijn.
4. Jij als bouwer van de site hebt geen toegang tot de sessie van de bezoeker. Mocht er een situatie voorkomen dat dit nodig is zit je met een probleem. In een database is het heel makkelijk aan te passen waarna de bezoeker gewoon verder kan op de site.
5. Sessies kunnen niet met elkaar vergeleken worden terwijl dit wel kan met database records. Dit kan wellicht handig zijn in bepaalde situaties om de restrictie beter tot stand te houden.
TheZwier
%Europe/Berlin %781 %2006, 18:44
Ik zou het gebruik van sessies voor dit doel afraden. Dit zijn 5 redenen die ik me zo even snel kon bedenken:
1. Sessies zijn browser specifiek. Dit betekend dat wanneer je alleen naar het IP kijkt (want user-agent is niet altijd nodig) iemand gewoon een andere browser kan starten en gewoon de pagina(s) weer kan zien.
2. Veelal worden sessies als object ge-cleared wanneer er wordt uitgelogt. Hiermee zullen dan ook de restrictie gegevens voor de pagina(s) verdwijnen en is er weer open toegang. Tuurlijk kan je er dan voor zorgen dat niet het hele sessie object ge-cleared wordt maar dat is niet voor iedereen mogelijk en niet flexibel.
3. Van sessies kunnen geen statistieken bijgehouden worden. Ik kan me voorstellen dat het belangrijk kan zijn dat er statistieken van dit soort processen zijn.
4. Jij als bouwer van de site hebt geen toegang tot de sessie van de bezoeker. Mocht er een situatie voorkomen dat dit nodig is zit je met een probleem. In een database is het heel makkelijk aan te passen waarna de bezoeker gewoon verder kan op de site.
5. Sessies kunnen niet met elkaar vergeleken worden terwijl dit wel kan met database records. Dit kan wellicht handig zijn in bepaalde situaties om de restrictie beter tot stand te houden.
Sterker nog, met de FF developer add on kan je zelfs client-side een sessie clearen!
josko
%Europe/Berlin %783 %2006, 18:48
Gaat dat niet gewoon via het deleten van de PHPSESSID in de formulieren, linkjes en cookies? :)
---
Voor de rest:
mySQL dus bkersten, zoals hierboven door theZwier en theDutch word duidelijk gemaakt.
En dat kan je zelf denk ik wel?
iptje en tijd wegschrijven?
bkersten
%Europe/Berlin %902 %2006, 21:39
Tijd heb ik nog nooit echt mee gewerkt, dus ik weet niet of dit gaat lukken.
Maar het verdere MySQL werk en IP (enz.) dat lukt wel!
TheDutch
%Europe/Berlin %918 %2006, 22:02
Tijd kan je gewoon hetzelfde opslaan als in de sessie. Gewoon de waarde die time() retourneert opslaan in de database :).
bkersten
%Europe/Berlin %491 %2006, 11:48
Oke, ik zal het gaan proberen.
Toch vind ik het wel jammer dat ik dit in de database moet doen.
Want het is eigenlijk een klein ding en om daar dan de database voor te gebruiken...
Maarja als er geen andere goede oplossing is, dan moet 't wel!
Ik ga het proberen!
Bedankt!!!
superdelux
%Europe/Berlin %525 %2006, 12:37
je werkt toch al met een database omdat je met gebruikers werkt als ik het zo lees.
time is gewoon een variabele die je opslaat en vergelijkt dus dat zou geen probleem hoeven zijn.
als je een aparte tabel maakt zou ik de overbodige rijen laten verwijderen,
wat je ook zou kunnen doen is bij de gebruikers tabel een veld tijd kunen toevoegen,
of zit ik nu helemaal fout te denken...
bkersten
%Europe/Berlin %599 %2006, 14:23
@superdelux: Aan dat laatste was ik ook aan het denken. Als het goed is, zou dat moeten werken. Maar het probleem is, dat ik dit systeem op meerdere pagina's wil toepassen, dus dan weet ik ook niet echt hoe het kan, maarja ik kijk wel even!
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.