webForumDet fria alternativet
Logga in / Bli medlem

Dela in i kategorier

PHP

6 svar · 171 visningar · startad av LilleSkutt

Medlem sedan feb. 2001265 inlägg
Frågan#1

Hey, jag har en liten fråga om visning av db-information och hoppas någon har ett klyftigt svar :)

Det är så att jag har ett antal poster, indelade i olika kategorier. Det finns flera produkter i dessa kategorier, men jag vill endast visa upp varje kategori en gång, med antalet produkter i kategorin. Jag har för tillfället följande kod, men den funkar inte

<?php
$res = mysql_query("SELECT kat FROM ks ORDER BY kat ASC");
$kategorier = "";

while($Row = mysql_fetch_array($res)) {
	if(!strstr($Row[kat], $kategorier)) {
		$antal = mysql_query("SELECT COUNT(id) AS antal_prod FROM ks WHERE kat = '$Row[kat]'");
		$printer = mysql_fetch_array($antal);
			
		echo "<a href=\"ks_show.php?show=$Row[kat]\">$Row[kat]</a>, $printer[antal_prod] produkter<br>\n";
		if($kategorier == "")
			$kategorier = $Row[kat];
		else
			$kategorier .= ", " . $Row[kat];
	}
}
?>

Jag har för mig att koden har funkat på tidigare sidor jag har gjort... *hmm*

[redigerat]
Hehe, kanske ska tala om vad som är fel också... Felet är att alla kateogier visas, även om de har visats en gång innan!
[/redigerat]

Medlem sedan dec. 200012 464 inlägg
#2

Du kan få hela resultatet med en SQL-sats i stället.

<?php
$res = mysql_query("SELECT kat,count(id) as antal FROM ks group by kat ORDER BY kat ASC");
while($Row = mysql_fetch_array($res)) {	
    echo "<a href=\"ks_show.php?show=$Row[kat]\">$Row[kat]</a>, $row[antal] produkter<br>\n";	
}
?>

Ditt förra exempel borde fungera om man ersätter

if($kategorier == "")		$kategorier = $Row[kat];
else			$kategorier .= ", " . $Row[kat];

med

$kategorier = $Row[kat];
Medlem sedan feb. 2001265 inlägg
#3

Schysst med en enda SQL-sats :)
Funkar det bara mot MySQL, eller t.ex. mot MS SQL också?

Medlem sedan dec. 200012 464 inlägg
#4

Den SQL-satsen är helt standard och ska fungera med i stort sett alla DBMS.

Medlem sedan feb. 2001265 inlägg
#5

Okey, sooft :)
Eftersom du verkar ha kolla på SQL-satser kanske du kan svara på om följande två är giltiga? Jag har problem med dem... Jag vet att man kan köra mysql_error(); men jag får inte ut nåt av den.

SELECT publishers.id, statistics.subscribers, statistics.subscriptions
FROM publishers, statistics
WHERE publishers.pb_name = '$name'
	
UPDATE statistics
SET subscribers = '" . $Row[statistics.subscribers] + 1 . "',
subscriptions = '" . $Row[statistics.subscriptions] + sizeof($listname) . "'
WHERE usr_id = '" . $Row[publishers.id] . "'
Medlem sedan dec. 200012 464 inlägg
#6

Det är svårt att säga när det är lösryckt ur koden och man inte vet något om datatyperna. (När jag gjorde cut och paste på koden såg det som om det inte fanns blanka mellan kolumnerna och FROM t.ex. men det kanske bara är WF som formaterar om det.)

I den första selecten så bör det väl finnas med ett join-villkor mellan tabellerna


"SELECT publishers.id, statistics.subscribers, statistics.subscriptions 
FROM publishers, statistics
WHERE publishers.pb_name = '$name' 
and publishers.id = statistics.usr_id"

Jag förmodar att subscribers och subscriptions är tal och i så fall skall man inte ha '' omrking värdena


"UPDATE statistics
   SET subscribers = " . $Row[statistics.subscribers] . " + 1, subscriptions = " . $Row[statistics.subscriptions] . "+" . sizeof($listname) . " WHERE usr_id = " . $Row[publishers.id]

I och för sig så behöver du inte hämta upp värdena utan du kan skriva dessa direkt i update-satsen

"SELECT id FROM publishers WHERE pb_name = '$name'"

"UPDATE statistics
SET subscribers = subscribers + 1 ,subscriptions = subscriptions + " . sizeof($listname) . " WHERE usr_id = " . $Row[publishers.id]

Om du hade haft en annan dbms än MYSQL så hade du kunna göra det som en updatesats

  "update statistics set subscribers = subscribers + 1, subscriptions = subscriptions + " . sizeof($listname) . " where usr_id in (select id from publishers where pb_name = '$name')"

Det är en väldigt användbar konstruktion som finns i SQL-standarden men som MySQL inte stöder.

Medlem sedan feb. 2001265 inlägg
#7

okey, toppen!
Det var mest dom sista kodbitarna jag var ute efter, om det fanns något enklare sätt att göra på, än vad jag gjorde :)

Trist att MySQL inte stödjer den sista kodbiten... Verkade smart. Kanske kommer i senare versioner? Hoppas :)

Tack ivf LarsG!

266 ms totalt · 4 externa anrop · v20260731065814-full.5386d3bf
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)