Gå til innhold

Fungerer dette som det skal? (sleep)


Anbefalte innlegg

	if(isset($_GET['u'])) {

	$id = mysql_real_escape_string($_GET['u']);

	$sql2 = mysql_query("SELECT * FROM nummerspill WHERE id = $id");

	$r_and = rand(10, 99);
	$r_and2 = rand(0, 1);
	$rr_and = $r_and2.".".$r_and;

	sleep($rr_and);

	if(mysql_num_rows($sql2)) {

	}

}

 

Jeg lurer på om vis f.eks to personer går inn på samme linken likt - da vil dette hjelpe? Slik at koden kun utføres på han ene, og ikke begge.

 

Finnes det andre, sikrere metoder?

Lenke til kommentar
Videoannonse
Annonse

Det vil aldeles ikke hjelpe. Er sjansen stor nok til at to personer behandles samtidig i systemet, er den også det for ethvert annet tidspunkt. Mao. du utsetter bare problemet og ikke minst innfører krasj også. Hva om person A behandles ved tidspunkt 0 må vente 1.99 mens person B behandles ved tidspunkt 1 og må vente 0.99?

 

Det man bør gjøre i en slik situasjon varierer avhengig av hva man skal beskytte mot og hvor. Er man f.eks. avhengig av å kjøre flere SQL-spørringer sammen bruker man gjerne transaksjoner. Ellers kan man jo alltids låse av en fil med flock og sjekke at man faktisk får låst den før man kjører den sensitive koden og etterpå låser opp filen igjen.

Lenke til kommentar

Å randomisere et delay ved request gjør ingen ting i forhold til problemstillingen din. Sannsynligheten for at koden kjøres samtidig er fortsatt akkurat like stor.

 

Edit: Ernie var først.

 

Edit: Selvom du escaper input, så kan man fortsatt fremprovosere en feil ved SQL-spørringen. Du bør sjekke om variabelen er numerisk eller inneholder andre tegn som må innkapsles i fnutter.

Endret av Jonas
Lenke til kommentar
Det vil aldeles ikke hjelpe. Er sjansen stor nok til at to personer behandles samtidig i systemet, er den også det for ethvert annet tidspunkt. Mao. du utsetter bare problemet og ikke minst innfører krasj også. Hva om person A behandles ved tidspunkt 0 må vente 1.99 mens person B behandles ved tidspunkt 1 og må vente 0.99?

 

Det man bør gjøre i en slik situasjon varierer avhengig av hva man skal beskytte mot og hvor. Er man f.eks. avhengig av å kjøre flere SQL-spørringer sammen bruker man gjerne transaksjoner. Ellers kan man jo alltids låse av en fil med flock og sjekke at man faktisk får låst den før man kjører den sensitive koden og etterpå låser opp filen igjen.

 

Så, da vil dette fungere?

 

 

	if(isset($_GET['u'])) {

	$id = mysql_real_escape_string($_GET['u']);

	$sql2 = mysql_query("SELECT * FROM nummerspill WHERE id = $id");

	if(mysql_num_rows($sql2)) {

	$fp = fopen("fil.php");

	if (flock($fp, LOCK_EX)) {
	   KODE HER
	}

	}

}

Lenke til kommentar
Hvis du slenger på en flock($fp, LOCK_UN) tilslutt i if-blokken så skal det fungerer. Når det er sagt så skal det litt til før man opplever «concurrency» problemer, og det skjer ikke uten at man har skriving/endring inni bildet.

 

Vel, det har seg slik at serveren ikke støtter flock. Så finnes det andre muligheter?

Lenke til kommentar
Vel, da tror jeg vi må vite litt mer hva det er som ev. kan krasje i hverandre. Jeg kan iallfall ikke umiddelbart komme på noe generelt som kan fungere.

 

Vel, det er en "bug" på nettsiden min. Når to stykker trykker likt på submit-knappen så kjøres spørringen 2 ganger, men i utgangspunktet har jeg kodet det for å kjøre gjennom koden en gang, for å så slette fra databasen hvor id er $_GET['u'] (når kun 1 person trykker på knappen). Men spørringen skal ikke kjøres mer enn en gang uansett hvor mange som trykker på knappen.

 

hmm, muligens litt dårlig forklart :roll:

Endret av Thomas.
Lenke til kommentar

Da kan det nok være en fordel å finne ut hvorfor det ikke fungerer når noen forsøker å slette noe som allerede er slettet. SQL-spørringen i seg selv vil nemlig ikke gi noen feilmelding, men bare vise at ingen rader har blitt påvirket. Utover det har man lock/unlock table og transaksjoner, men det spørs forsåvidt for mye det hjelper.

Lenke til kommentar

du kan løse denne enten via transactions, der du kjører select og delte i en og samme transasction or rollbacker om den ikke klarer å delete, eller å kjøre en update spørring.

Om du bruker updatespørringen må du ha et ekstra felt i tabellen din

 

alter table nummerspill add field (used varchar(1) default '0');

 

mysql_query("UPDATE nummerspill set used=1 where used=0 and nummer=...")
if (mysql_affected_rows() > 0)
{
echo "you win"; 
// din kode inn her som du pasta i starten.. (select og hele hopprennet)
}
else
{
 // ignore.
}

Endret av [kami]
Lenke til kommentar

du vil sikkert skrive spørringen slik

(bytte om rekkefølgen slik at nummer sjekkes før used, da du sikkert har indexert eller har pk på nummer. om used ligger først kan det hende mysql tar en full tablescan for å sjekke used som ikke er indexa først)

 

"UPDATE nummerspill set used=1 where nummer=$id and used=0"

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...