27. november 2007 - 18:41Der er
18 kommentarer og 1 løsning
Show News
Hej :) Jeg er ved at lave en hjemmeside, meningen er så at man på forsiden skal kunne se en overskrift på alle nyheder listede op i rækkefølge efter tid.
Det jeg havde tænkt mig at man trykker på overskriften på forsiden og man kommer så ind på "index.php?side=show_news?id=5", for at se id 5..
Men hvordan fortæller man den at den så skal hente information fra nyheden med ID=5 i min databse?
Link eksempel : <a href="index.php?side=show_news&id=5">Nyhed</a> Jeg ved jo ikke hvordan din nyhedstabel ser ud, så jeg har gættet mig frem.. Eksempel på at hente nyhed : <? //skab forbindelse til din db her.. $get_id = $_GET['id'];//hent id´et (5 er id´et) $hent_nyhed = mysql_query("SELECT * FROM din nyhedstabel WHERE id = '$get_id'")or die('MYSQL QUERY ERROR : ' . mysql_error());//Hent nyheden fra databesen if(mysql_num_rows($hent_nyhed) == 0)){ //vi tjekker om nyheden findes :) echo"Kunne ikke finde nyheden!"; }else{//vi fandt nyheden lad os printe den ud ! $nyhed = mysql_fetch_array($hent_nyhed); echo"$nyhed[overskrift]<br>"; echo"$nyhed[tekst]"; } ?> Håber du kan bruge dette til noget.
Rettelse : <a href="index.php?side=show_news&id=5">Nyhed</a> Jeg ved jo ikke hvordan din nyhedstabel ser ud, så jeg har gættet mig frem.. Eksempel på at hente nyhed : <? //skab forbindelse til din db her.. $get_id = $_GET['id'];//hent id´et (5 er id´et) $hent_nyhed = mysql_query("SELECT * FROM din nyhedstabel WHERE id = '$get_id'")or die('MYSQL QUERY ERROR : ' . mysql_error());//Hent nyheden fra databesen if(mysql_num_rows($hent_nyhed) == 0)){ //vi tjekker om nyheden findes :) echo"Kunne ikke finde nyheden!"; }else{//vi fandt nyheden lad os printe den ud ! $nyhed = mysql_fetch_array($hent_nyhed); echo"$nyhed[overskrift]<br>"; echo"$nyhed[tekst]"; } ?>
Vi prøver lige engang til .. RETTELSE : <a href="index.php?side=show_news&id=5">Nyhed</a> Jeg ved jo ikke hvordan din nyhedstabel ser ud, så jeg har gættet mig frem.. Eksempel på at hente nyhed : <? //skab forbindelse til din db her.. $get_id = $_GET['id'];//hent id´et (5 er id´et) $hent_nyhed = mysql_query("SELECT * FROM din nyhedstabel WHERE id = '$get_id'")or die('MYSQL QUERY ERROR : ' . mysql_error());//Hent nyheden fra databesen if(mysql_num_rows($hent_nyhed) == 0){ //vi tjekker om nyheden findes :) echo"Kunne ikke finde nyheden!"; }else{//vi fandt nyheden lad os printe den ud ! $nyhed = mysql_fetch_array($hent_nyhed); echo"$nyhed[overskrift]<br>"; echo"$nyhed[tekst]"; } ?>
Der er vel ingen grund til, at der tjekkes om nyheden findes, idet vi formoder, at linkene er dannede udfra data i databasen. Derved vil der ikke komme links til noget der ikke findes...
Nå nu fik jeg kigget på det, og det var den ærligt talt ikke glad for.
Her er hvad jeg fik det til.
<---Kode starter--->
<?php include("mysqldata.php");
$db = mysql_connect($db_host, $db_user, $db_password); mysql_select_db($db_name, $db); $foresp = mysql_query("SELECT id, time, titel, godkendt FROM nyheder WHERE godkendt = 1 ORDER BY time DESC"); while($data = mysql_fetch_array($foresp)){ echo "<a href='index.php?side=Forside?news_id=$data[id]'>$data[titel]</a> - "; echo date("j/n Y", $data[time]); echo " kl. "; echo date("H:i", $data[time]); echo "<br>"; }
$get_id = $_GET['id'];//hent id´et (5 er id´et) $hent_nyhed = mysql_query("SELECT * FROM nyheder WHERE id = '$get_id'")or die('MYSQL QUERY ERROR : ' . mysql_error()); if(mysql_num_rows($hent_nyhed) == 0){ echo"Kunne ikke finde nyheden!"; } else{ $nyhed = mysql_fetch_array($hent_nyhed); echo"$nyhed[titel]<br>"; echo"$nyhed[text]"; } ?>
<---Kode slutter--->
Nyhedsoverskrifterne vises fint, og når jeg trykker på linket skriver den også det rigtige link i adressebaren, men jeg har en mistanke om at nedenstående(i min index.php) blokerer for det. En anden ting er at der nederst på listen af nyheder står "Kunne ikke finde nyheden!", hvilket der jo ikk skal.
Denne $side = $_GET[side]; skal ændres til $side = $_GET['side'];
Også kan jeg ikke gennemskue, hvad det er du gør i den lange if..elseif..else sætning. Du fortæller faktisk følgende: Hvis $side er "Forside" så sæt $side="Forside". Den er helt overflødig. Hvad er meningen med den?
Mht "Kan ikke finde nyheden" Det er fordi, du jo tjekker databasen hvergang index.php loader, også er get['id'] jo ikke sat, det bliver den først når du bruger et af linkene, du kan slippe af med den ved at sætte $hent_nyhed delen ind i en if(isset($_GET['id'])) { Så køres den del kun, hvis siden er tilgået vhja linket, se desuden min kommentar 27/11-2007 19:47:37. Slet følgende: if(mysql_num_rows($hent_nyhed) == 0){ echo"Kunne ikke finde nyheden!"; } else{ $nyhed = mysql_fetch_array($hent_nyhed); echo"$nyhed[titel]<br>"; echo"$nyhed[text]"; } Den er overflødig.
Jeg fandt ud af at det var meget smart at have den der: "Kunne ikke finde nyheden!", ellers vil brugeren jo kunne manipulere med det oppe i adresselinjen, og bede om at se en nyhed der ikke eksisterer..
Det er også derfor den lange if..else..elseif sætning er lavet, nu må du ikke hænge mig op på det, men en ven sagde at det var et sikkerhedsbrist at man kunne tilgå enhver side og sådan, så han lavede det der til mig..
Og hvor er det du vil sætte din if(isset) ind? Jeg kan umiddelbart ikke lige se det? :/
Hvis man søger en nyhed der ikke er der, kommer der bare ikke noget ud.
Det er rigtigt, du skal passe på med sql-intrusion, men det løser man med addslashes her, den tilføjer \ som forhindrer intrusion, hvis magic_quotes_gpc ikke er sat - hvad den er default, men det tjekker man - se senere: $get_id = $_GET['id']; ændres til: $get_id = addslashes($_GET['id']);
Så kan brugeren ikke succesfuldt fifle med adresselinken.
isset sætter du således: (isset($_GET['id'])) { <<----- $get_id = (get_magic_quotes_gpc()) ? $_GET['id'] : addslashes($_GET['id']);//hent id´et (5 er id´et) $hent_nyhed = mysql_query("SELECT * FROM nyheder WHERE id = '$get_id'")or die('MYSQL QUERY ERROR : ' . mysql_error()); if(mysql_num_rows($hent_nyhed) == 0){ echo"Kunne ikke finde nyheden!"; } else{ $nyhed = mysql_fetch_array($hent_nyhed); echo"$nyhed[titel]<br>"; echo"$nyhed[text]"; } }
Så søger den kun i databasen, hvis siden tilgåes med url-variablerne sat.
Jeg synes det lyder underligt, hvad din ven har sagt, idet det ikke giver nogen beskyttelse for det du siger. Hvis $_GET['side'] skal lave en hensvisning til en anden side, kan man jo skrive index.php?side="mumibjørn", men hvis der ikke er en side, der hedder mumibjørn.php, får man bare en error 404, og så er det problem løst. Det du gør, er at sætte $side lig med det den allerede er. 404 sker jo af sig selv...? (Jeg kan iøvrigt ikke se, hvor du redirecter til en nyhedsside!)
Men dig om det, det bare bøvlet, at skalere siden så, hvis du finder på flere sider, så skal du ind og rette i if..elseif..else hvergang du gør det!
Det jeg har ændrest, er isset, hvilket er ret væsentligt, den sørger for, at der kun søget i databasen, når $_GET['id'] er sat, desuden har jeg sikret dig mod sql-intrusion.
Jeg ved ikke hvad du mener med at tillade alle værdier i news_id. Forklar. Hvad bruger du den til?
Men, hvordan får jeg så siden "Vis nyhed.php" til at kun at vise nyheden med id'et "data['id']"?
Og hvordan tillader jeg ALLE id'er i min lange if..else..elseif sætning? Eller, nogle der kan komme på en anden løsning?(Din fungerede sikkert udemærket y, men så skriv lige nøjagtigt hvad jeg skal skrive hvor, for hvis ikk det skal se ud som det gør nu, så aner jeg virkeligt ikke hvordan :S)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.