Autor Zpráva
Matess
Profil *
Dobrý den,
můžete mi prosím někdo pomoc s hromadným updatem v databázi?

Takto vypisuji data z DB do formuláře:
<?php
$Sql = MySQL_Query("SELECT * FROM akreditace");        // tady bude WHERE id podle oddílu, který vyhledám.   
while ($data = MySQL_Fetch_Array($Sql)) {
    
    
    echo '<tr>
        <td><input type="checkbox" name="akreditace" '. ($data["akreditace"] == "no" ? "" : "checked") .'></td>
        <td><input type="text" name="prijmeni" value="'.$data["prijmeni"].'"></td>
        <td><input type="text" name="jmeno" value="'.$data["jmeno"].'"></td>
        <td><input type="text" name="narozen" value="'.$data["narozen"].'&nbsp;&nbsp;&nbsp;('.a($data["narozen"]).' let)"></td>
        <td>
            <select name="pohlavi" size="1"> 
                '. ($data["pohlavi"] == "male" ? "<option value=\"male\" selected>Male <option value=\"female\">Female" : "") .'
                '. ($data["pohlavi"] == "female" ? "<option value=\"male\">Male <option value=\"female\" selected>Female" : "") .'
            </select>
        </td>
        <td><input type="text" name="vek" value="'.Vek($data["narozen"]).'" size="5"></td>
        <td><input type="text" name="ts" value="'.$data["ts"].'" size="1"></td>
        <td><input type="checkbox" name="kata" '. ($data["kata"] == "no" ? "" : "checked") .'></td>
        <td><input type="text" name="kumite" value="'.$data["kumite"].'" size="3"></td>
        <td><input type="checkbox" name="open" '. ($data["open"] == "no" ? "" : "checked") .'></td>
        
        </tr>';    
        
} 
?>


Tam ty data upravím podle potřeby (změním jména, věk, checkboxy, atp.) a kliknu na uložit.
Jak mám vytvořit mysql dotaz aby mi to upravilo data v DB podle nových hodnot?
Musí ten dotaz být ve while (ať se opakuje podle počtu řádků) nebo to lze vyřešit i jinak?

Děkuji za odpovědi.
Alphard
Profil
Existují konstrukce jako Dvojné pole..?, ale jestli je váš kód z nějaké ne extrémně vytížené adminstrace, dal bych to jednoduše do cyklu.

name si pojmenujte jako pole, jinak budete mít jen poslední hodnotu.
Matess
Profil *
Alphard:
Pojmenovat name jako pole myslíte nějak takto?
<td><input type="checkbox" '.$name[akreditace]="akreditace".' '. ($data["akreditace"] == "no" ? "" : "checked") .'></td>
<td><input type="text" '.$name[prijmeni]="prijmeni".' value="'.$data["prijmeni"].'"></td>

V případě, že to tak udělám, tak mi to rozhodí formulář. A když to dám vypsat:
reset($name);
while(list($index, $stav) = each($name)){
echo ($index." - ".$stav."<br>");
}

Tak to vypisuje toto:
prijmeni - prijmeni value="tset">
akreditace - akreditace checked>

Omlouvám se, jsem v PHP začátečník. Nešlo by mi to podrobněji vysvětlit nebo přímo napsat?
A to dvoujné pole nechápu už vůbec. :-(
Tori
Profil
Matess:
To name se imho vztahovalo k názvu formulářového pole: echo '<td><input type="text" name="prijmeni['.$data['id'].']" value="'.$data["prijmeni"].'"></td>';, tedy aby výsledkem bylo třeba name="prijmeni[123]". Podle toho klíče (= ID záznamu) pak můžete aktualizovat data.

Pokud byste chtěl updatovat všechny jedním dotazem, je také možné využít unikátního klíče v DB, typicky tedy ID záznamu. Místo několika příkazů typu
UPDATE tabulka SET col = 'foo' WHERE id = 1;
UPDATE tabulka SET col = 'bar' WHERE id = 2;
by byl tento:

INSERT INTO tabulka (id, col) 
VALUES (1, 'foo'), (2, 'bar')
ON DUPLICATE KEY UPDATE col = VALUES(col)
viz MySQL manuál
Matess
Profil *
Tori:
Děkuji, podívám se na to a zkusím si s tím pohrát.


Teď data ukládám takto:
    reset($_POST["prijmeni"]); // seřadí prvky pole od 1? Ale nejsem si jistý.
    while(list($index, $stav) = each($_POST["prijmeni"])){
        MySQL_Query("INSERT INTO akreditace (id, prijmeni) 
        VALUES ('$index', '$stav')
        ON DUPLICATE KEY UPDATE prijmeni = VALUES(prijmeni)");
    }

Funguje to asi správně (podle toho co jsem testoval), ale jak teď uložit další políčka ve formuláři (jméno, narozen, pohlavi, atp.).
To musím pro každé políčko napsat znova kód, který mi funguje u toho příjmení? S tím, že bych změnil prijmeni->jméno, pohlaví, atp.
Nebo to jde ještě nějak zkombinovat?
Tori
Profil
Matess:
Můžete upravit vstupní pole tak, abyste všechny související položky měl pod jedním klíčem, tedy takováhle struktura:
data = [
  ID1 : [ jméno1, příjmení1, něcojiného1 ],
  ID2 : [ jméno2, příjmení2, něcojiného2 ],
]
Ve formuláři: name="data[123][jmeno]"
zpracování: foreach ($_POST['data'] as $id => $osoba) { $osoba['jmeno']; .. atd. }

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: