Autor Zpráva
kopi
Profil
Zdravím,
mám tabulku se dvěma sloupci - první je název skupiny uživatelů "skupina"(varchar) a druhý je jejich level "level" (int). Pomocí cyklu while načítám do formuláře inputy, ve kterých je hodnota sloupce "level", atribut input name = $skupina['id'] (id skupiny) - inputů je předem neurčený počet, protože v budoucnu se můžou skupiny přidávat nebo mazat. Input s hodnotou "level" jde editovat administrátorem. Potřeboval bych poradit, jak zpracovat formulář, když nevím, kolik bude odesláno inputů?
Předpokládám, že to bude pomocí cyklu foreach, ale moc nevím, jak získat hodnotu level i id skupiny kvůli update tabuly v db. Zpracování formuláře bude probíhat v jiném souboru.


// odeslání formuláře
If(isset($_POST["sent"]))    {

$pocet = count($_POST[".$skupina['id']."]);
 
// cyklus

$i = 0;
while ($i < $pocitani) {
// definice proměnných
$level= $_POST[".$skupina['id']."][$i];
$skupina = ?????

$update = mysql_query("UPDATE prava SET level = '".$level."' WHERE id_skupina = '?????' ");
++$i;
}
   
}

nevím, jak mám získat hodnotu id_skupiny. Nevím, jestli je to srozumitelný, ale každopádně děkuju za pomoc.
juriad
Profil
Je docela špatný název mít jako primární klíč název skupiny. Skupinu totiž můžeš chtít později přejmenovat a vše se ti rozsype.
Přidej si do té tabulky ještě jeden sloupec id:
CREATE TABLE prava (
  id INT PRIMARY KEY AUŤO_INCREMENT,
  skupina VARCHAR(50) NOT NULL,
  level INT NOT NULL DEFAULT 0
);
S číselnými odentifikátory se navíc mnohem lépe pracuje i vzhledem k takovým věcem jako, že název skupiny by mohl obsahovat písmena s diakritikou či mezery.

Výpis formuláře bude vypadat:
<form method="post">
  <table>
<?php
$prava = mysql_query("SELECT * FROM prava ORDER BY id ASC");

while ($row = mysql_fetch_assoc($prava)) {
  echo "<tr><td>" . htmlspecialchars($row['skupina']) . "</td><td><input name=\"level[$row[id]]\" value=\"$row[level]\"></td></tr>";
}
?>
  </table>
  <input type="submit" name="sent" value="Odeslat">
</form>

Důležité je, že name bude ve formě pole:
name="level[1]"
name="level[2]"
name="level[5]"

Zpracování v PHP pak bude jen jednoduchý foreach přes pole $_POST['level'], které PHP samo vytvoří.

if (isset($_POST['sent']) && isset($_POST['level']) && is_array($_POST['level'])) {
  foreach ($_POST['level'] as $id => $level) {
    mysql_query("UPDATE prava SET level = " . intval($level) . " WHERE id = " . intval($id));
  }
}

Šlo by dokonce do databáze odeslat jen jeden dotaz, ale to je náročnější a jak říkáš, jedná se jen o rozhraní pro admina, který změny nebude provádět stokrát za sekundu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: