Autor Zpráva
Rodrigez
Profil *
Mám tabulku MySQL jménem clanky, která má sloupce clanky_id a clanky_stav (int).
Mám další relativní tabulku stav s hodnotami pro tabulku clanky, která obsahuje sloupce stav_id a stav_nazev.

Tabulku clanky zobrazím pomocí MYSQL FETCH ARRAY a WHILE do NAME atributu formuláře.
U každého řádku se zobrazí ve formuláři rozevírací SELECT, kde je na výběr seznam hodnot z tabulky stav

Takže můžu hromadně u všech řádků tabulky clanky změnit stav a pomocí tlačítka odeslat změnit hodnotu u clanky_stav.

Co nevím, je jak na to.
Martin02
Profil
Zdravím,
moc jsem tomu neporozuměl. Přes while vypíšeš do select hodnoty z tabulky stav. A co s nimi chceš dělat dál?
Tori
Profil
Rodrigez:
Pojmenovávejte selecty tak, abyste ve výsledku dostal jedno pole, kde klíče budou ID článků: <select name="pole[$id_clanku]"> Při zpracování formuláře tohle pole projdete cyklem foreach a poskládáte si SQL dotaz pro update jednotlivých článků.

Taky si můžete při generování formuláře uložit do session kopii dat z DB (jako pole, obsahující páry id_článku => stav), a při zpracování porovnávat hodnoty z formuláře s hodnotami v session (na základě id článku). Tak zjistíte, u kterých článků byla ve formuláři změněná hodnota id_stav, a můžete updatovat jen tyto řádky v DB. (Málokdy asi budete měnit stav u všech článků naráz, takže ve většině případů se tímhle postupem zpracování formuláře zrychlí).
Rodrigez
Profil *
Tori: Něco takového? Ještě pořád trochu tápu, jak by to mělo být, aby to fungovalo.
´// Samotná úprava (ve stejném souboru) 
If(isset($_POST["odeslat-uprava"]))
{
$pocitani = count($_POST['ec_id']);

// začít smyčku pro aktualizaci všech údajů
$i = 0;
while ($i < $pocitani) {
// definice proměnných
$ec_id= $_POST['ec_id'][$i];
$ec_stav = $_POST['ec_stav'][$i];
$upravit_stav_clanky = mysql_query("UPDATE clanky SET c_stav = '".$ec_stav."' WHERE c_id = '".$ec_id."' LIMIT 1");
++$i;
}
   
}

//===================================================================================================
$i = 0;

// ... SQL dotaz $vysledek_clanek vynechán ...

while ($radek_clanek = mysql_fetch_array($vysledek_clanek, MYSQL_ASSOC))
{
$c_id = $radek_clanek['c_id'];
// ...  atd. atd. ...
++$i; // počítání počtu proměnných pro smyčku pro nastavení c_stav
echo '<input type="hidden" name="ec_id[$i]" value="'.$c_id.'" >'; // získá id článku pomocí fetch array
echo '<select name="ec_stav[$i]">';
$vysledek_clanek_stav= mysql_query("SELECT cs_id, cs_nazev FROM clanky_stav ORDER by cs_id ASC");
while ($radek_clanek_stav = mysql_fetch_array($vysledek_clanek_stav, MYSQL_ASSOC))// získá relativní stavy článků
{
$cs_id = $radek_clanek_stav['cs_id'];
$cs_nazev = $radek_clanek_stav['cs_nazev'];
echo '<option value="'.$cs_id.'">'.$cs_nazev.'</option>';
}
// ...  atd. atd. ...
Tori
Profil
Formulář:
* ř.28+29 - máte apostrofy místo uvozovek, nezobrazí se hodnota $i
* ř.30-36 - Možné stavy jsou stejné pro kterýkoli článek, zbytečné číst je xkrát znova. <Option>s s možnými stavy si uložte do proměnné ještě před začátkem formuláře, pak stačí jen měnit jméno <select>u - možnosti budou pořád stejné.
* místo skrytého pole + číslování podle nějaké vygenerované řady od 0 do x můžete použít rovnou ID článku echo '<select name="ec_stav['.$radek_clanek['c_id'].']">';

Zpracování:
* ř.8 - použila bych raději foreach($_POST['ec_stav'] as $id_clanku=>$id_stavu) - souvisí s tou předchozí poznámkou o přejmenování selectů.
* escapujte data, která posíláte do databáze! (ř.10,11) - pro celá čísla se používá funkce intval
Rodrigez
Profil *
To snad není pravda, ono to funguje. Jsi dobrá! (dobrý). Děkuji. Já vím, že dělám hodně začátečnických chyb, ale snažím se pracovat systematicky. Chyby si někam zapíšu a až to bude hotové, tak to změním najednou, protože jinak pořád nacházím různé "verze" a pak je to o ničem celé to opravovat. Ještě jednou dík.
Tori
Profil
Rodrigez:
pořád nacházím různé "verze" a pak je to o ničem celé to opravovat.
Nevím, jestli to na vás není brzo, ale zkuste kouknout na verzování. Je to docela fajn, mít nástroj, který vám umožní vyzkoušet nějakou novou věc, a když to nebude fungovat, tak se zase vrátit ke kterékoli [uložené] starší podobě kódu. Anebo mít paralelně několik větví aplikace, ve kterých si něco zkoušíte a podle toho, jak se to osvědčí, to jednoduše přidat do hlavní větve nebo zahodit. Pokud by vás to dál zajímalo, najdete i tady na diskusi řadu témat ohledně výběru/doporučení verzovacího SW.

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: