For lige at være lidt konstruktiv i stedet for bare at sige at det er skodkode (hvilket det er!)...
Den sikre version af din oprindelige kode ser sådan ud:
$id = $_GET["id"];
$id = mysql_real_escape_string($id);
$result = mysql_query("SELECT * FROM oversigt WHERE id=$id") or die(mysql_error());
Denne kan evt. udvides med et par linjer som verifisere om $id faktisk er et heltal, eller om den er noget andet.
Når koden lægges op på webhotellet bør det iøvrigt overvejes om PHP skal have lov til at udskrive fejlbeskeder direkte til skærmen. Dette vil nemlig give oplysninger som en hacker potentielt ville kunne bruge.
Det der gør din oprindelige kode så risikabel er, at du kritikløst tager imod data som kommer fra klienterne og smider den ind i din SQL kode. Ikke alle dine besøgende er rigtige brugere - nogen af dem er hacker-typer som har interesse i at kunne overtage din side eller at kunne udtrække data om dine brugere (f.eks. emailadresser til spam).
Joe-the-Hacker kan gøres alle mulige ting som aldrig burde forekomme ved almindelig brug af din side. I dette tilfælde er det $_GET["id"] som er det mulige angrebspunkt. Der er ingen garanti for at Joe faktisk levere et korrekt id eller noget andet som f.eks.:
id: 666;DROP TABLE oversigt;--
Indsat ukritisk i din SQL-streng bliver dette til:
"SELECT * FROM oversigt WHERE id=666;DROP TABLE oversigt;--"
Resultat: din tabel bliver slettet...
Angrebstypen kaldes for SQL injection og det er noget enhver programmør som bevæger sig ud på Internettet bør kende til:
http://en.wikipedia.org/wiki/SQL_injectionFunktionen mysql_real_escape_string() er en mulig måde at beskytte sig imod den slags:
http://dk2.php.net/mysql_real_escape_stringForresten kan din kode også fejle ved helt legitim brug, hvis du ikke bruger disse teknikker. Prøv f.eks. at oprette en bruger med navnet "Scarlett O'Hara" og se hvad der så sker.
BTW ';'-tegnet i den oprindelige er ikke nogen fejl som sådan - det er dog totalt overflødigt i dette tilfælde.