Přebírání dat z formulářů II

Minule jsme si ukázali proměnné $_GET a $_POST, které představují pole, obsahující celou odezvu formuláře. Říkali jsme si, že pokud pojmenujeme vstupní políčko například "alfa":

<input name="alfa" type="text" size="20">

... pak při použití metody GET získáme zadanou hodnotu jako  $_GET["alfa"]   (například ji můžeme někam přiřadit, nebo dokonce použít ve výpočtech, pokud buňka obsahuje číslo). Pole, které neadreujeme obecně indexy, ale názvy položek, se nazývá asociativní. Podotýkám, že přesto můžeme místo textu použít k indexaci i celé číslo (zpravidla má první položka formuláře index =0, další jedna atd.). Php má ovšem obrat, který nám umožní zjistit názvy jednotlivých položek, pokud je neznáme. K tomu nám slouží speciální tvar příkazu cyklu Foreach (pro každý prvek z výběru). Ve zjednodušené formě tento příkaz slouží k procházení všech prvků pole, položek objektu atp. Názorně si to zkusíme na výpisu zadaných hodnot z formuláře. Vytvořte si jakýkoli formulář s několika pojmenovanými poli a zkuste jej nasměrovat na php soubor, obsahující následující úsek programu:

<?
foreach($_GET as $value)
{
    echo $value."<br>";
  }
?>

Jednoduché a rychlé.

Složitější formát má tvar:

foreach(<<zdrojové pole>> as <<klíč>> => <<hodnota>>) {tělo cyklu};

Zdrojové pole je jakékoli asociativně adresované pole. To se prochází položka po položce, a v pro každou položku nabyde klíč hodnoty názvu položky a hodnota její hodnoty. Pro každou takovou dvojici se pak provede tělo cyklu.

Pro výpis názvů proměnných by se nám ale hodila tabulka. Úsek html pak bude nejprve obsahovat záhlaví tabulky, pak cyklus v php, generující tělo tabulky, a pak se -opět v html- tabulka uzavře:

<table border><tr><td>key</td><td>value</td></tr>
<?
 foreach($_GET as $key => $value){
   echo "<tr><td>".$key."</td><td>".$value."</td></tr>";
}
?>
</table>

Univerzální výpis je spíš vhodný pro ladění, ale cyklus foreach oceníme při práci s databázemi, kde opravdu nevíme, kolik nám náš dotaz vrátí řádek (nejvýše můžeme nastavit horní limit). Pokud ovšem má být výpis opravdu univerzální, pak by měl vracet nejen GET, ale i POST. To, zda nám formulář vrátil pole $_GET, můžeme zjistit výrazem:

if($_GET == true)

Je-li totiž pole bez prvků, nabývá logické hodnoty false. Celý obrat pak provedeme jak pro GET, tak znovu pro POST (Ctrl+C, Ctrl+V). Do podmínky ale musíme zahrnout i výpisy hlaviček tabulky, aby se jedna z nich nevypsala prázdná. Celý html text programu by mohl vypadat například následovně:

<html>

<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1250">
<title>Odezva formuláře</title>
</head>

<body bgcolor="#FFFFFF">

<p><font size="4"><strong>Odezva formuláře:</strong></font></p>

<p><strong>Post:</strong> <br>
<?php
if($_POST == true)
{
  echo "<table border><tr><td>key</td><td>value</td></tr>";
  foreach($_POST as $key => $value){
    echo "<tr><td>".$key."</td><td>".$value."</td></tr>";
  }
  echo "</table>";
}



?></p>
<p><strong>Get:</strong> <br>
<?php
if($_GET == true)
{
  echo "<table border><tr><td>key</td><td>value</td></tr>";
  foreach($_GET as $key => $value){
    echo "<tr><td>".$key."</td><td>".$value."</td></tr>";
  }
  echo "</table>";
}


?></p>

</body>
</html>

Zkuste.