Pieni pään vaiva löytyy tästä kun pitäisi hakea mysql tietokannasta ~70 erinlaista categoriaa, jokaiselle pitäisi luoda oma case josta ne tekee sitten mitä tekevätkin, mutta olen liian laiska kirjoittamaan nämä kaikki 70 erinlaista case kohtaa ite, joten ajattelin että jos laitan for silmukan sisälle case kohdan, tyyliin:
tai jotenkin vastaavasti, kellään ideaa?
Sitten ne oli siellä ja minä. Mitä yrität tehdä?
70 kategoriaa, jokaisessa kategoriassa on omia rivejä mitä pitää tulostaa kun valitsee tietyn kategorian, koitan saada tehtyä tätä switchin kanssa.
Laita ne rivitkin kantaan.
Jos ei ole mahdoliosta niin taulukkoon esim.
$taulukko[kategorian_id] = "rivit";
sitten vaan tulostat tyyliin
print $taulukko[$i]
EDIT: Ja miksi pitäis tehä switchin kanssa?
Rivit on kannassa, riveihin on merkattu mikä on sen kategoria.
esim.
Kategoria 1
- Rivi a1
- Rivi a2
- Rivi a3
Kategoria 2
- Rivi b1
- Rivi b2
- Rivi b3
jne.
Jaa-a, jotenkin tuli mieleen että sitä vois kokeilla, tietenkin voisin käyttää if rakennetta
Siis mitä sä tässä ajat takaa? Helpointa olisi tehdä tietokantaan taulukko kategoriat, jossa olisi 3 saraketta:
+-------+-------+-----------+ | id | rivi | kategoria | +-------+-------+-----------+ | 1 | rivi1 | 1 | +-------+-------+-----------+ | 2 | rivi2 | 2 + +-------+-------+-----------+
jne..
Kun haet tiedot tietokannasta:
$kategoria1 = array(); // taulukko kategoria 1. $katetoria2 = array(); // jne.. $haku = mysql_query("SELECT * from kategoriat", $yhteys); for ($i = 0; $i < mysql_num_rows($haku); $i++) { $rivi = mysql_result($haku, $i, "rivi"); $kategoria = mysql_result($haku, $i, "kategoria"); if ($kategoria == "1") $kategoria1[] = $rivi; // taulukkoon lisätään rivi else $kategoria2[] = $rivi; // jne.. }
HUOM Tiedot taulukosta saat funktiolla foreach, lisää tietoa php:n manuaalista: https://www.php.net/manual/fi/control-structures.foreach.php
Kategorioita on useita...
Tällä hetkellä "menu.php" näyttää tältä:
<?php require("conf.php"); $filter = $_GET['filter']; function skill_list() { global $server; global $login; global $passwd; global $database; global $table; global $filter; $con = mysql_connect($server, $login, $passwd) or die("Connection failed!"); mysql_select_db($database, $con) or die("Database not found!"); switch($filter) { case "public": $guest = "SELECT * FROM $table WHERE secrecy = 'public' ORDER BY name"; $search = mysql_query($guest, $con) or die("Failure in search!"); $rows = mysql_num_rows($search); for($i = 0; $i < $rows; $i++) { $name = mysql_result($search, $i, "name"); $new_name = str_replace("[and]", "&", $name); echo "<DIV CLASS=\"". color() ."\">$new_name</DIV>\n"; } break; case "private": $guest = "SELECT * FROM $table WHERE secrecy = 'private' ORDER BY name"; $search = mysql_query($guest, $con) or die("Failure in search!"); $rows = mysql_num_rows($search); for($i = 0; $i < $rows; $i++) { $name = mysql_result($search, $i, "name"); $new_name = str_replace("[and]", "&", $name); echo "<DIV CLASS=\"". color() ."\">$new_name</DIV>\n"; } break; case "secret": $guest = "SELECT * FROM $table WHERE secrecy = 'secret' ORDER BY name"; $search = mysql_query($guest, $con) or die("Failure in search!"); $rows = mysql_num_rows($search); for($i = 0; $i < $rows; $i++) { $name = mysql_result($search, $i, "name"); $new_name = str_replace("[and]", "&", $name); echo "<DIV CLASS=\"". color() ."\">$new_name</DIV>\n"; } break; case "underground": $guest = "SELECT * FROM $table WHERE secrecy = 'underground' ORDER BY name"; $search = mysql_query($guest, $con) or die("Failure in search!"); $rows = mysql_num_rows($search); for($i = 0; $i < $rows; $i++) { $name = mysql_result($search, $i, "name"); $new_name = str_replace("[and]", "&", $name); echo "<DIV CLASS=\"". color() ."\">$new_name</DIV>\n"; } break; default: $guest = "SELECT * FROM $table ORDER BY name"; $search = mysql_query($guest, $con) or die("Failure in search!"); $rows = mysql_num_rows($search); for($i = 0; $i < $rows; $i++) { $name = mysql_result($search, $i, "name"); $new_name = str_replace("[and]", "&", $name); echo "\t\t<TR>\n"; echo "\t\t\t<TD CLASS=\"". color() ."\">$new_name</TD>\n"; echo "\t\t</TR>\n"; } break; } } function menu() { echo "\n\t\t<TABLE CELLPADDING=\"0\" CELLSPACING=\"0\" WIDTH=\"100%\">\n"; echo "\t\t<TR>\n"; echo "\t\t\t<TD CLASS=\"menu_head\">Skills</TD>\n"; echo "\t\t</TR>\n"; skill_list(); echo "\t\t</TABLE>\n\n"; } ?>
Muokkaus vähän kesken, joten älkää välittäkö että muissa on DIV sen sijaan että olisi <td>
Siis tulisiko jokaisen kategorian suorittaa joku ihan oma tehtävä, vai vaan tulostaa teksti joka lukee tietokannassa?
Jokainen kategoria tekee oman tehtävän
Jos jokaisen tapauksen (case) jälkeen tulee tyystin erilaista koodia, niin silloin ei auta muu kuin kirjoittaa kaikki tapaukset erikseen. Mutta jos koodi on aina lähes sama ja tapaukset eroavat vain hivenen toisistaan, ne kannattaa tietysti yhdistää. Esimerkin koodissa tapaukset "public", "private", "secret" ja "underground" voisi yhdistää, koska niissä ainoa ero (huomasinko oikein?) on tietokantakyselyn ehdossa.
case "public": case "private": case "secret": case "underground": $guest = "SELECT * FROM $table WHERE secrecy = '$filter' ORDER BY name"; $search = mysql_query($guest, $con) or die("Failure in search!"); $rows = mysql_num_rows($search); for($i = 0; $i < $rows; $i++) { $name = mysql_result($search, $i, "name"); $new_name = str_replace("[and]", "&", $name); echo "<DIV CLASS=\"". color() ."\">$new_name</DIV>\n"; } break;
Alkuperäisen viestin for-rakenne ei ole mahdollinen, ja se ei oikeastaan lyhentäisi koodia juuri yhtään. On kyllä totta, että koko switch-rakenne on aika hankala PHP:ssä. Minä käytän sen asemesta aina if-lauseita, joissa ei ole samanlaisia rajoituksia. Lopputulos on tietysti sama toteutustavasta riippumatta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.