Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: for-silmukan sisälle case

Sivun loppuun

Grimmi [04.08.2006 15:15:46]

#

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:

for($i = 0; $i < $case; $i++)
{
	case $i:
	echo "case numero $i\n";
	break;
}

tai jotenkin vastaavasti, kellään ideaa?

HellCome [04.08.2006 15:54:02]

#

Sitten ne oli siellä ja minä. Mitä yrität tehdä?

Grimmi [04.08.2006 15:56:33]

#

70 kategoriaa, jokaisessa kategoriassa on omia rivejä mitä pitää tulostaa kun valitsee tietyn kategorian, koitan saada tehtyä tätä switchin kanssa.

Akseli F [04.08.2006 16:05:05]

#

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?

Grimmi [04.08.2006 16:09:39]

#

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

Tontsa-san [04.08.2006 16:57:32]

#

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

Grimmi [04.08.2006 17:10:07]

#

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>

sane [04.08.2006 17:20:45]

#

Siis tulisiko jokaisen kategorian suorittaa joku ihan oma tehtävä, vai vaan tulostaa teksti joka lukee tietokannassa?

Grimmi [04.08.2006 17:31:52]

#

Jokainen kategoria tekee oman tehtävän

Antti Laaksonen [06.08.2006 11:33:19]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta