Archief - PHP : id switch

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

tikketim

Legacy Member
Een probleem waar ik al uren met zit. Ik ben dus een nieuws systeem aan het maken met comments. Ik heb alle page met zo een zwitch ge include in de index pagina maar nu weet ik niet hoe ik daarmee moet rekeing houden met het id van de pagina die moet geinclude worden. Anders uitgelegd : als ik op comments klik zou ik graag eerst de nieuws post hebben bovenaan waar het om gaat en die andere nieuws post mogen zich dus niet tonen.

code van news page :

PHP:
<?php

// uit database halen
$result = mysql_query("SELECT * FROM news ORDER BY id DESC");
while($r=mysql_fetch_array($result)){

// in variablen zetten
$message = $r['message'];
$admin = $r['admin'];
$date = $r['date'];

echo "

<h3 class=\"headernews\">Posted on $date</h3>
<div class=\"inhoud\">
<p>$message</p>
</div>
<div class=\"inhoudfooter\">
<h4>Posted by $admin
<a href=\"?page=news_comments?id=$r[id]\">Comments: 8</a></h4>

</div>
";
}

?>

code van comments page :
PHP:
<?php

// uit database halen

$result = mysql_query("SELECT * FROM news WHERE id='$id'");
while($r=mysql_fetch_array($result)){

// in variablen zetten
$message = $r['message'];
$admin = $r['admin'];
$date = $r['date'];

echo "

<h3 class=\"headernews\">Posted on $date</h3>
<div class=\"inhoud\">
<p>$message</p>
</div>
<div class=\"inhoudfooter\">
<h4>Posted by $admin</h4>
</div>
";

}

?>

code van switch :

PHP:
switch (strtolower($_GET['page'])) 
{ 
case "news_comments?id=$r[id]":
  $page="news/news_comments.php?id=$r[id]";
  break;
case "change_war":
  $page="wars/change_war.php";
  break;
...................(alle andere switches)
default:
  $page="news/news.php";
  break;
}
include ($page);
?>

ik hoop dat jullie snappen wat ik bedoel

grtz Tim

dJeez

Legacy Member
Vervang
PHP:
case "news_comments?id=$r[id]":
$page="news/news_comments.php?id=$r[id]";
alvast maar eens door
PHP:
case "news_comments":
$page="news/news_comments.php";

En als je de link die genereert :
PHP:
<a href=\"?page=news_comments?id=$r[id]\">
vervangen door
PHP:
<a href=\"?page=news_comments&id=$r[id]\">
(mag ook &amp; zijn ipv & voor W3C compliancy, maar dat zie je wel als je dat zou testen).

De ID geef je dus door als extra parameter, je zal die dus ook moeten uitlezen en toevoegen aan de url van de link die je genereert. Bij het includen geef je de ID niet door, maar je gebruikt daar gewoon een globale variabele voor (wellicht ipv die $r[id], maar die keuze laat 'k aan u).

tikketim

Legacy Member
Dankjewel dJeez het werkt nu maar ik vind het toch raar omdat ik bij een andere site dat wel heb kunnen doen met dat vraagteken :)

WHiSPy

Legacy Member
Waar is m'n speech weer over het niet meer selecteren dan je effectief nodig hebt? :p

Cyberkef

Legacy Member
tikketim zei:
wat bedoel je ? :s
PHP:
$result = mysql_query("SELECT * FROM news WHERE id='$id'");
while($r=mysql_fetch_array($result)){

// in variablen zetten
$message = $r['message'];
$admin = $r['admin'];
$date = $r['date'];

Je selecteert een ganse rij (*) terwijl je maar 3 dingen echt gebruikt (nl message, admin & date) :)

tikketim

Legacy Member
Dat zijn dan ook de enige 3 dingen die er in staan op id na dan dus veel maakt da dan toch ni uit he ? :p

WHiSPy

Legacy Member
tikketim zei:
Dat zijn dan ook de enige 3 dingen die er in staan op id na dan dus veel maakt da dan toch ni uit he ? :p

Ff uitleggen hoe 'n rdbms (buiten oracle naar 't schijnt) een select * interpreteert:

- Hij gaat in de master tabel kijken of de database bestaat
- Hij gaat in de database kijken of de tabel bestaat
- Hij gaat alle metadata van die tabel ophalen
- Hij gaat dan elke kolom selecteren en die resultaten fetchen

Indien je de namen gaat opgeven, dan gaat ge tenminste toch al 1 stap overslaan. Nog performanter zou zijn om tabel.kolom te doen, maar da's enkel maar 'n coding trucje dat je jezelf eigen maakt zodat je dat bij joins ook gaat doen.

SQL tuning is 'n onderwerp dat hier toch te weinig wordt vermeld.

dJeez

Legacy Member
WHiSPy zei:
SQL tuning is 'n onderwerp dat hier toch te weinig wordt vermeld.
Sjah, ik verspil er hier geen moeite meer aan, de meesten lezen er toch constant over. Diegenen die verder gaan dan puur hobbyisme zullen ooit zullen zelf misschien wel inzien dat het nodig is om hun SQL statements ook eens grondig onder de loupe te nemen :p.

Hetzelfde geldt voor sanity checks bij het doorgeven van vars aan scripts trouwens.

Lashknife

Legacy Member
heeft die table.column een meerwaarde als ge maar vanuit 1 table selecteert?

select naam, voornaam from personen where postcode = 'XXXX';
of
select personen.naam, personen.voornaam from personen where personen.postcode = 'XXXX';

Bedoel, bij joins gebruik je zowiezo iets als het onderstaande, maar als er slechts 1 table is waaruit je selecteert, heeft het dan invloed (onderstaande is ook geen directe verwijzing maar een alias natuurlijk)
select p.naam, p.voornaam, a.abotype from personen p, abonnementen a where p.persnr = a.lidnr;
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan