webForumDet fria alternativet

Sessions, Förhindra Flood

PHP

9 svar · 713 visningar · startad av Simpa

Medlem sedan aug. 20002 992 inlägg
Frågan#1

Hejsan,
Håller på att lära mig sessions, men får inte detta att fungera som jag vill!
Det jag vill uppnå är att om man postat ett inlägg, så ska man inte kunna posta ett nytt inom 2 minuter, men sessionen verkar inte vilja dö ut, och värdet på "timer" förblir 2 efter ett postat inlägg!

skicka.php

session_cache_expire(1);
session_start();
if (isset($_SESSION['timer'])){ 
}
else {
$_SESSION['timer'] = 1;
}

Ta_Emot_Och_Bearbeta.php

session_cache_expire(2);
session_start();

if (isset($_SESSION['timer'])){ 
}
else {
$_SESSION['timer'] = 1;
}

if ($_SESSION["timer"] == "2")
{
echo "Du måste vänta 2 minuter";
}
elseif ( - kod -)
{
echo "Du har inte fyllt i alla fält ordentligt, försök igen";
$_SESSION["timer"] = "1";
}
else 
{
$_SESSION["timer"] = "2";
echo "Ditt meddelande sparat";
- Kod -
}

Sidan: http://www.trailerpark.nu/p/text/tyck.php
För att döda sessionen: http://www.trailerpark.nu/p/text/doda.php

Går det inte att använda sessions så här? Eller måste jag använda mig av cookies?

/ Simon

Medlem sedan nov. 20041 740 inlägg
#2

Jag skulle nog valt att spara tidpunkten för det senaste inlägget istället för de siffror du använder nu. Då kan du alltid jämföra med aktuell tid och se om två minuter har passerat.

Medlem sedan aug. 20002 992 inlägg
#3

Ibland fungerar inte huvudet, självklart är det en bättre ide! Tack.

Medlem sedan aug. 20002 992 inlägg
#4

Vad är fel på följande if sats?

if ( !empty($_SESSION['timer']) and $_SESSION['timer'] + 120 < time()){
$tid = 1;
}
elseif ( empty($_SESSION['timer']))
{
$tid = 1;
}
else 
{
$tid = 0;
}

if ($tid == 1) 
{
echo "Du måste vänta 2 minuter för att kunna posta igen.";
}
else
{
$_SESSION['timer'] = time();
echo "Ditt meddelande har nu blivit skickat!";
}

Som det är nu så blir alltid $tid == 1?

Medlem sedan mars 20034 471 inlägg
#5

Har du session_start(); högst upp i filen?

Jag tror ett problem är att du inte kollar om sessionsvärdet är satt. Om du alltid sätter värdet när man postar något, så måste värdet finnas för att man ska kunna ha postat alldeles nyligen. Utnyttja det!

Och varför krångla till det?

session_start(); //<---- Måste stå på första raden

if ( isSet(($_SESSION['timer']) && $_SESSION['timer'] + 120 < time()) {
   //Postat för mindre än 2 min sedan
   echo "Du måste vänta 2 minuter för att kunna posta igen.";
}
else {
   //Klart att posta
   // < kod för att posta >
   $_SESSION['timer'] = time();
   echo "Ditt meddelande har nu blivit skickat!";
}
Medlem sedan aug. 20002 992 inlägg
#6

Snart flintis här, fungerar det verkligen att göra en sådan här if sats?

if ($_SESSION['timer'] + 120 < time()) {

Har försökt på massor av olika sätt att få detta att fungera, men antagligen släpper ifsatsen inte igenom någon, eller så släpper den igenom allt lite beroende på hur jag gör..!

Kan ju visa koden just nu, som säkert ser väldigt överarbetad och onödig ut, men inga lättare sätt verkar fungera heller.. tycker detta borde fungera i teorin..!

<?php
session_start();
$tid = time();
if (isset( $_SESSION['timer'] ) ){
$tstamp = "55";
$tajm = $_SESSION['timer'];
} else {
$tstamp = "100";
$_SESSION['timer'] = "55";
$tajm = "123";
}

if ( $tstamp == "55" && $tajm + 120 < $tid )
{
echo "Du måste vänta 2 minuter innan du postar igen";
else 
{
// Kod för spara..
$_SESSION['timer'] = $tid;
}
?>

Har även testat att göra det lite enklare som exemplet ovan, men det ville sig inte heller..!
}

Medlem sedan mars 20034 471 inlägg
#7

Simpa skrev:

Snart flintis här, fungerar det verkligen att göra en sådan här if sats?

if ($_SESSION['timer'] + 120 < time()) {

Ja. 120 = 60*2 (sekunder) = 2 min så det villkoret säger i ord "det är mer än 2 min sedan du senast postade".

Resten av din kod ser däremot mera skum ut! Du kan inte blanda diverse heltalssiffror med time. time() innehåller uppgift om hur många sekunder som gått sedan något fixt, gammalt datum.

Ett fel i ditt skript är att du sätter $tid till time() men jämför mot sessions-variabeln. Som alltså redan från början får ett gammalt time-värde eftersom det mellanlagrats i en variabel.

När någon postar sätter du $_SESSION['timer'] = time(); se mitt exempel ovan. För övrigt: ta mitt exempel ovan rakt av och testa med. Blanda inte in dina heltalsvariabler.

Medlem sedan aug. 20002 992 inlägg
#8

Kör ungefär precis som det du sagt ovan aasah, men den släpper inte igenom något, är du säker på att det går att köra isset på en icke satt $_SESSION? Valde att skriva ut värdet på $_SESSION och det är 1, även om den inte är satt någonstans innan..

Valde då att skriva if satsen så här,

if ( isSet($_SESSION['timer']) && $_SESSION['timer'] != 1 && $_SESSION['timer'] + 120 < time()) 
{ 
echo "Du kan inte posta ännu";
}
else 
{
$_SESSION['timer'] = time(); 
echo "Postat";

Men då släppte den igenom allt igen.. Allt eller inget hmm :)

Tack för hjälpen förresten!

Medlem sedan aug. 20002 992 inlägg
#9

Fått igång det nu!

Så här ska det självklart se ut, en felvänd > :)

if ( isSet($_SESSION['timer']) && $_SESSION['timer'] != 1 && $_SESSION['timer'] + 120 > time()) 
{

Undrar dock lite fortfarande om isSet fungerar, eller om värdet på en osatt $_SESSION alltid är 1?

Tack,

Medlem sedan mars 20034 471 inlägg
#10

Simpa skrev:

Undrar dock lite fortfarande om isSet fungerar, eller om värdet på en osatt $_SESSION alltid är 1?

PHP är ett förlåtande språk som så långt det kan försöker tolka ut hur programmeraren egentligen menade - inte alltid med bra resultat. Exvis kommer du inte att få rapporterade fel om du blandar in en osatt variabel i en jämförelse, däremot riskerar du att variabeln får det värde det var meningen att den skulle jämföras mot!!! :o Det är det du råkar ut för när du tror att den har värdet 1 med automatik. För att komma ifrån dessa oönskade effekter ska man som regel alltid kolla att variabeln är satt (med isSet() ) innan man använder den till något. Gäller variabler som du inte själv alltid tilldelar värden, tex GET, POST, COOKIE, SESSION.

255 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)