webForumDet fria alternativet

Loopa ut hela "sökvägen"

PHP

28 svar · 979 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#1

Kommer inte på hur jag ska göra för att få sökvägen utskriven enligt nedan.

Tabell:

ID  |  Tillhör  |  Namn 
------------------------
1   |   0       |  Test
2   |   1       |  Test2
3   |   2       |  Test3

Är aktuell sidas id = 1 ska följande skrivas ut:

Test

Är aktuell sidas id = 2 ska följande skrivas ut:

Test > Test2

Är aktuell sidas id = 3 ska följande skrivas ut:

Test > Test2 > Test3
Medlem sedan jan. 20051 130 inlägg
#2

Någon som har pejl på detta?

(PHP och MySQL)

Medlem sedan maj 2005562 inlägg
#3

testa..

<?php
$sql = "SELECT Namn FROM tabell WHERE id>='$pageId'";
$res = mysql_query($sql) or die(mysql_error());
$laggTill = "";
while ($svar = mysql_fetch_assoc($res)) {
  echo $laggTill . $svar['Namn'];
  $laggTill = " > ";
}

?>
Medlem sedan aug. 20002 975 inlägg
#4

Annars borde det gå att göra något i stil med:

// $id = aktuell sida

$result = "SELECT ID, Tillhör, Namn FROM tabell";

$list = array();
while ($row = mysql_fetch_assoc($result)) {
   $list[$row['id']] = array('parent'=>$row['Tillhör'], 'text'=>$row['Namn']);
}

$path = array();
$path_id = $id;

if (array_key_exists($path_id, $list)) {

   $path[] = $list[$path_id]['text'];
   
   while ($list[$path_id]['parent'] != 0) {
      $path_id = $list[$path_id]['parent'];
      $path[] = $list[$path_id]['text'];
   }

}

// Och så din utskrift
$path = implode(" > ", array_reverse($path));
Medlem sedan jan. 20051 130 inlägg
#5

Matte
Jag får det inte att funka... ska inte:

$result = "SELECT ID, Tillhör, Namn FROM tabell";

vara:

$result  = mysql_query("SELECT folderId, inFolderId, name FROM folder");

?

Visserligen funkar det ändå inte...

Medlem sedan maj 2005562 inlägg
#6

Felmeddelanden ? Vad händer ? ingenting ? får du nån utskrift överhuvudtaget ?

testa att använda

$result = mysql_query("SELECT folderId, inFolderId, name FROM folder") or die(mysql_error());
Medlem sedan aug. 20002 975 inlägg
#7

Jodå, det ska det vara :)

Ändra till:

$result = mysql_query("SELECT ID, Tillhör, Namn FROM tabell)"; 

$list = array(); 
while ($row = mysql_fetch_assoc($result)) { 
   $list[$row['ID']] = array('parent'=>$row['Tillhör'], 'text'=>$row['Namn']); 
}

Index ska ju vara 'ID' istället för 'id'.

Medlem sedan jan. 20051 130 inlägg
#8

Smooooth

Medlem sedan jan. 20051 130 inlägg
#9

Gjorde så här för att kunna "stega" omkring bland sidorna:

   
$list[$dir['ID']] = array('parent'=>$dir['Tillhör'], 'text'=> "<a href='?go=".$dir['ID']."'>".$dir['Namn']."</a>");

Kan jag kanske skriva det lite snyggare..? :)

Medlem sedan aug. 20002 975 inlägg
#10

Om det är så mycket snyggare vet jag inte :)
Men du kan alltid göra så här:

// $id = aktuell sida 

function make_link($id, $text)
{
   return "<a href='?go=$id'>$text</a>";
}

$result = mysql_query("SELECT ID, Tillhör, Namn FROM tabell)"; 

$list = array(); 
while ($row = mysql_fetch_assoc($result)) { 
   $list[$row['ID']] = array('parent'=>$row['Tillhör'], 'text'=>$row['Namn']); 
}

$path = array(); 
$path_id = $id; 

if (array_key_exists($path_id, $list)) { 

   $path[] = make_link($path_id, $list[$path_id]['text']);
    
   while ($list[$path_id]['parent'] != 0) { 
      $path_id = $list[$path_id]['parent']; 
      $path[] = make_link($path_id, $list[$path_id]['text']); 
   } 

} 

// Och så din utskrift 
$path = implode(" > ", array_reverse($path));
Medlem sedan jan. 20051 130 inlägg
#11

Jo, lite snyggare var det ju.

Kan passa på att fråga:

Jag vill räkna ut en sidas totala bildstorlek. Bilderna finns sparade i databasen.

Bildtabellen:

ID  |  SidID  |  Namn |  Storlek
--------------------------------
1   |   0      |  Bild1  |  100
2   |   1      |  Bild2  |  150
3   |   2      |  Bild3  |  210

SidID är den sida bilden tillhör och Storlek är bilden storlek.

Hur gör jag för att räkna ut en given sidas totala storlek gällande bilder. Lite klurigt med tanke på att en sida kan ha fler "tillhörande" sidor osv. Hoppas du/ni förstår vad jag menar...

Tack :bire

Medlem sedan aug. 20002 975 inlägg
#12

Testa med

$sql = "SELECT SUM(Storlek) AS total FROM tabell WHERE SidID = $id";

där $id är lika med id för sidan.

Medlem sedan jan. 20051 130 inlägg
#13

Fast bilden behöver ju inte tillhöra sidan $id för att räknas med, utan istället en annan sida som i sin tur tillhör $id... :l

Den totala storleken skall beräknas på alla bilder som ligger på alla sidor som tillhör den givna sidan...

Medlem sedan aug. 20002 975 inlägg
#14

Testa då:

$result = mysql_query("SELECT ID, Tillhör FROM tabell)"; 

$list = array(); 
while ($row = mysql_fetch_assoc($result)) { 
   $list[$row['ID']] = $row['Tillhör']; 
} 

$path = array(0); 
$path_id = $id; 

if (array_key_exists($path_id, $list)) { 

   $path[] = $path_id;
     
   while ($list[$path_id]['parent'] != 0) { 
      $path_id = $list[$path_id]; 
      $path[] = $path_id; 
   } 

}

$path = implode(", ", $path);

$sql = "SELECT SUM(Storlek) FROM tabell WHERE SidID IN ($path)";
$result = mysql_query($sql);

$summa = mysql_result($result, 0);

Om jag förstod dig rätt :)

Medlem sedan jan. 20051 130 inlägg
#15

Matte skrev:

$result = mysql_query("SELECT ID, Tillhör FROM tabell)";

Ska vara:

$result = mysql_query("SELECT ID, Tillhör FROM tabell");

:)

Funkar inte riktigt, vart kommer "['parent']" in i bilden...?

Medlem sedan aug. 20002 975 inlägg
#16

learn skrev:

Funkar inte riktigt, vart kommer "['parent']" in i bilden...?

Lite klipp/klistra-skräp :)

Ändra till

   while ($list[$path_id] != 0) {
      $path_id = $list[$path_id];
      $path[] = $path_id;
   }
Medlem sedan jan. 20051 130 inlägg
#17

Kanon!

Om jag vill ha en funktion som tar borta alla bilder på en viss sida (och dess tillhörande sidor), hur ska jag göra?? Antar att det blir ngt liknande, men jag lyckas inte riktigt... :)

Medlem sedan aug. 20002 975 inlägg
#18

Inte för att jag förstår varför du skulle plocka bort alla bilder för en hel sökväg, men principen är densamma som för när du räknar ut summan av bildstorleken.

Ändra bara

$sql = "SELECT SUM(Storlek) FROM tabell WHERE SidID IN ($path)";

till

$sql = "DELETE FROM tabell WHERE SidID IN ($path)";
Medlem sedan jan. 20051 130 inlägg
#19

Detta borde ju isf funka, men det gör det inte. Här hämtas bara första tillhörande sidan... While-loopen körs inte alls. :q

// Börjar med att hämta alla sidor
$query = mysql_query("SELECT id, tillhör FROM sidor");
	
$list = array();

// Sparar sidorna i en array
while ($list = mysql_fetch_assoc($query)) {
    $sidor[$list['id']] = $list['tillhör'];
}
	
$path = array();
$path_to_delete_in = $id; // Aktuell sida som skall raderas ifrån

// Kontrollerar om det finns någon tillhörande sida
if (array_key_exists($path_to_delete, $sidor)) {

    $path[] = $path_to_delete;

    // Sålänge sidan inte tillhör sidan 0 
    while ($sidor[$path_to_delete] != 0) {
        $path_to_delete = $sidor[$path_to_delete];
        $path[] = $path_to_delete;
    }
} 
	
// Radera alla bilderna på de sidor som tagits fram
$query = mysql_query("DELETE FROM bilder WHERE sidID IN ($path)");
Medlem sedan aug. 20002 975 inlägg
#20

Till att börja med kan du ändra

$path_to_delete_in = $id; // Aktuell sida som skall raderas ifrån 

// Till
$path_to_delete = $id; // Aktuell sida som skall raderas ifrån
266 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)