[PHP] hur gör man så att CASE i switch förstår att vad som än kommer efter ett case måste accepteras och skrivas ut?

Permalänk
Inaktiv

[PHP] hur gör man så att CASE i switch förstår att vad som än kommer efter ett case måste accepteras och skrivas ut?

Jag har följande switch för min content på min hemsida. Detta är min INDEX.PHP

<?php $page = $_GET['page']; switch($page) { case "news": include "content/news.php"; echo '<script>document.title = "Hollywoodgust - News";</script>'; break; case "newsid": include "content/article.php"; echo '<script>document.title = "Hollywoodgust - Article";</script>'; break; case "cookiemessage": include "other/cookiemessage.php"; break; default: if ($page == "" or null) { echo '<script> window.location.assign("?page=news"); </script>'; } break; echo $page; } ?>

I min NEWS.PHP så skriver den ut länkarna korrekt, vilket är ?page=newsid=1,2 osv.

<?php echo "<div id='newsfeed'> <br><h1>News</h1><br> <div id='mainline'></div> <br>"; $sql = "SELECT id, link, titel, date FROM newsfeed"; $result = $mysqli->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo " <a href=" .'?page=newsid=' . $row['id']. "> <div id='newsbox'> <h3>" . $row["titel"]. "</h3> <img src='" . $row["link"]. "'> <br><br> <div id='line'></div><br>"; } } else { echo "0 results"; } $mysqli->close(); echo "</Div> </div></a>"; ?>

Problemet ligger i min article.php och i index.php koden ovanför. Jag har försökt skriva [0-9], intval med flera saker för att den ska förstå att det är helt okej att skriva ut nummer efter newsid och att det ska vara okej att använda ?page=newsid=NUMMER för att komma in på rätt artikel. Men det enda sättet jag kommer in på article nu är med ?page=newsid bara, då förstår det att den kan visa article. Jag vill få newsid= med nummer att funka så att artiklarna blir rätt, men det går inte just nu.

Skriver jag $_GET['newsid'] då funkar det inte, men skriver jag $_GET['page'] då hittar den "newsid" men inte numret om den står på länken i webbläsaren? Någon som har förslag hur man kan manipulera CASE så att den fattar att det är okej att skriva ut vad som än kommer efter där?

ARTICLE.PHP

<?php echo $_GET['page']; ?>

Permalänk
Medlem

Nu har jag lite svårt att tyda vad du egentligen är ute efter.

Men du kan ju ha t.ex.

/?page=article&id=13

Din case kommer ju försöka matcha texten 1:1 och då tar den ju inte med om den har något eftersläpande där.

Permalänk
Medlem
Skrivet av anon341792:

?page=newsid=NUMMER

Det är snudd på obegripligt vad du är ute efter men själva problemet är nog att det där inte är en giltig query string.

Visa signatur

Mostly Harmless

Permalänk
Inaktiv
Skrivet av JeanC:

Nu har jag lite svårt att tyda vad du egentligen är ute efter.

Men du kan ju ha t.ex.

/?page=article&id=13

Din case kommer ju försöka matcha texten 1:1 och då tar den ju inte med om den har något eftersläpande där.

Problemet: Det jag menar är att CASE i SWITCH med "newsid" verkar blockera så att man inte kan använda "?page=newsid=MED SIFFROR" för article.php kommer inte upp. Om man inte medvetet skriver in "?page=newsid=SIFFRA" i CASE förstås, då fattar den.

Jag kommer ha tusentals artiklar och kan inte sitta och skriva in över tusentals CASE i min switch, därför behöver jag förslag på hur jag kan manipulera min CASE i SWITCH så den förstår att den ska visa article.php via "?page=newsid=SIFFROR" och inte bara visa på "?page=newsid(SOM DÅ INNEHÅLLER INGA SIFFROR)"

För just nu är det enda sättet att komma åt article.php, det gör man genom att ENDAST skriva "?page=newsid" eftersom CASE i SWITCH verkar inte acceptera likamedstecknet = och siffrorna som kommer efter newsid=, fast det står "?page=newsid=1" i webbläsaren.

För skriver man siffror efter newsid så visar inget på sidan, men article.php visas dock med "?page=newsid" utan siffror osv. Det är därför jag undrar om man kan manipulera CASE i SWITCH med exempelvis intval, [0-9] eller något så att den accepterar eftersläpande text efter newsid som exempelvis =123 som är likamedstecknet och siffrorna.

Jag kan inte bli tydligare än så här.

Skrivet av Mayhem SWE:

Det är snudd på obegripligt vad du är ute efter men själva problemet är nog att det där inte är en giltig query string.

Jag svarade JeanC kolla där. Jag kan inte bli tydligare än så.

Permalänk
Medlem

Jag utvecklare inte i PHP, men käns konstigt att skriva en query string på det sättet du försöker, "?page=newsid=1" säger att parametern page är lika med "newsid=1".

Man brukar i regel skriva flera parametrar, t.ex. "?page=news&id=1" där får du två parametrar där "page=news" och "id=1"!

En Query String är en konvention mellan "key=value"

Läs mer här:
https://en.wikipedia.org/wiki/Query_string

Permalänk
Inaktiv
Skrivet av gonace:

Jag utvecklare inte i PHP, men käns konstigt att skriva en query string på det sättet du försöker, "?page=newsid=1" säger att parametern page är lika med "newsid=1".

Man brukar i regel skriva flera parametrar, t.ex. "?page=news&id=1" där får du två parametrar där "page=news" och "id=1"!

Läs mer här:
https://en.wikipedia.org/wiki/Query_string

Jag ska kolla om det funkar sen. Tack! Detta är ju dock i webbläsaren då antar jag att det inte blir att page är lika med osv..

Permalänk
Medlem
Skrivet av anon341792:

Jag ska kolla om det funkar sen. Tack! Detta är ju dock i webbläsaren då antar jag att det inte blir att page är lika med osv..

Jag är osäker på vad PHP har för implementation för parsing av Query Strings, men med tanke på att det är en "key=value" konvention och du förmodligen använder någon inbyggd Query String praser så kommer det inte riktigt bli rätt som du strukturerar din URL.

Man kan ju alltid skriva en egen parser, men det känns skapligt onödigt.

Webbläsaren har inte så mycket med saken att göra, utan hur PHP tolkar Query Strings, jag antar att PHP implementation via

$_GET['key']

kräver att du följer mönstret "key=value" ("key1=value1&key2=value2").

Glöm inte att du måste köra sanitation på värdena du plockar ut så du inte råkar ut för sql injections.

Permalänk
Medlem

Ett orelaterat problem du har är att if ($page == "" or null) troligtvis inte gör vad du tror.

== har högre prioritet än or, så detta är ekvivalent med if (($page == "") or null) vilket är ekvivalent med if ($page == "") eftersom null räknas som false när det används som ett sanningsvärde.

Permalänk
Medlem
Skrivet av anon341792:

Problemet: Det jag menar är att CASE i SWITCH med "newsid" verkar blockera så att man inte kan använda "?page=newsid=MED SIFFROR" för article.php kommer inte upp. Om man inte medvetet skriver in "?page=newsid=SIFFRA" i CASE förstås, då fattar den.

Jag kommer ha tusentals artiklar och kan inte sitta och skriva in över tusentals CASE i min switch, därför behöver jag förslag på hur jag kan manipulera min CASE i SWITCH så den förstår att den ska visa article.php via "?page=newsid=SIFFROR" och inte bara visa på "?page=newsid(SOM DÅ INNEHÅLLER INGA SIFFROR)"

För just nu är det enda sättet att komma åt article.php, det gör man genom att ENDAST skriva "?page=newsid" eftersom CASE i SWITCH verkar inte acceptera likamedstecknet = och siffrorna som kommer efter newsid=, fast det står "?page=newsid=1" i webbläsaren.

För skriver man siffror efter newsid så visar inget på sidan, men article.php visas dock med "?page=newsid" utan siffror osv. Det är därför jag undrar om man kan manipulera CASE i SWITCH med exempelvis intval, [0-9] eller något så att den accepterar eftersläpande text efter newsid som exempelvis =123 som är likamedstecknet och siffrorna.

Jag kan inte bli tydligare än så här.

Jag svarade JeanC kolla där. Jag kan inte bli tydligare än så.

Svaret är att du kan inte göra som du vill. CASE jämför endast med konstanta uttryck, inte regexpar eller liknande.
Dvs du kan ha en case-sats som jämför med "newsid" eller med "newsid=1" eller med "newsid=42", men du kan inte jämföra med '"newsid" eventuellt följt av ett likhetstecken och några siffror'

Du behöver nog ändra på hur din querystring ser ut. Som andra har påpekat använder du ett ganska okonventionellt format på den.
Bättre variant vore något i stil med "?page=newsid&id=2" och sen använda GET för att ta ut 'newsid' och 'id' som separata variabler

Permalänk
Inaktiv
Skrivet av gonace:

Jag är osäker på vad PHP har för implementation för parsing av Query Strings, men med tanke på att det är en "key=value" konvention och du förmodligen använder någon inbyggd Query String praser så kommer det inte riktigt bli rätt som du strukturerar din URL.

Man kan ju alltid skriva en egen parser, men det känns skapligt onödigt.

Webbläsaren har inte så mycket med saken att göra, utan hur PHP tolkar Query Strings, jag antar att PHP implementation via

$_GET['key']

kräver att du följer mönstret "key=value" ("key1=value1&key2=value2").

Glöm inte att du måste köra sanitation på värdena du plockar ut så du inte råkar ut för sql injections.

Det verkar funka nu. Jag ändrade till detta

case "news": include "content/article.php"; echo '<script>document.title = "Hollywoodgust - News";</script>'; break; case "mainnews": include "content/news.php"; echo '<script>document.title = "Hollywoodgust - Article";</script>'; break;

Jag ville haft case: id och case: news men det funkade inte då den inte gick vidare till article. Så article fick case news och nya news fick heta mainnews.

Jag får också ut rätt ID nu i article när jag trycker från mainnews länkarna, vilket gör att jag kan trycka in den i en variabel och sätta in i MYSQL så den vet vilket ID den ska hämta från. Tack för all hjälp jag ska kolla över PDO osv.

EDIT: ?page=news&id=123 används nu istället för ?page=newsid=123...