Autor Zpráva
Martin V.
Profil *
Ahoj, potřebuji uložit do mysql více hodnot najednou ale ukládá se vždy jen poslední input.

zde přikládám kod:

<?php

if(isset($_POST['save'])){
mysql_query("UPDATE rubriky SET level = '".$_POST['level']."' WHERE id = '".$_POST['id']."' ");
}


echo '<form action="" method="POST">';

echo '<input type="text" name="level" size="2" value="0">';
echo '<input type="text" name="id" size="2" value="41">';
     
echo '<input type="text" name="level" size="2" value="0">';
echo '<input type="text" name="id" size="2" value="42">';
     
echo '<input type="text" name="level" size="2" value="0">';
echo '<input type="text" name="id" size="2" value="43">';
     
echo '<input type="text" name="level" size="2" value="0">';
echo '<input type="text" name="id" size="2" value="44">';

echo '<input name="save" type="submit" value="SAVE" />';

echo '</form>';
     
?>


Poradí někdo, kde mám chybu? Děkuji za pomoc
djlj
Profil
Máš je totiž všechny stejně pojmenované, takže ten poslední "přepíše" ty předchozí. Pojmenuj je všechny level[] a id[] a po odeslání to pole projdi třeba funkcí foreach.
Martin V.
Profil *
Jako takto?

echo '<input type="text" name="level[]" size="2" value="0">';
echo '<input type="text" name="id[]" size="2" value="41">';
     
echo '<input type="text" name="level[]" size="2" value="0">';
echo '<input type="text" name="id[]" size="2" value="42">';
     
echo '<input type="text" name="level[]" size="2" value="0">';
echo '<input type="text" name="id[]" size="2" value="43">';
     
echo '<input type="text" name="level[]" size="2" value="0">';
echo '<input type="text" name="id[]" size="2" value="44">';


Díky
djlj
Profil
Jojo, přesně tak. Po odeslání budeš mít pole $_POST['level'] a $_POST['id'] se všemi hodnotami ;).
Martin V.
Profil *
No ale co s tím dál?
djlj
Profil
Třeba:
if(isset($_POST['save'])){

for($i=0;$i<count($_POST['level']);$i++){

mysql_query("UPDATE rubriky SET level = '".$_POST['level'][$i]."' WHERE id = '".$_POST['id'][$i]."' ");

}

}
Martin V.
Profil *
Tak to pole vidím, ale nic se neuloží, už ani ten poslední input ;)
o_O
Profil
Martin V.:
Mohl by jste prosím ukázat Váš kód?
Martin V.
Profil *
Ano, teď to mám přesně takto

<?php

     if (isset($_POST['save'])){
          for($i=0; $i<count($_POST['level']); $i++){
               mysql_query("UPDATE rubriky SET level = '".$_POST['level'][$i]."' WHERE id = '".$_POST['id'][$i]."' ");
          }
     }


     echo '<form action="" method="POST">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="23">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="42">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo'<input type="text" name="id[]" size="2" value="43">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="48">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="23">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="2">';

     echo '<input name="save" type="submit" value="SAVE" />';

     echo '</form>';
     
?>


ale když se na to dívám očima začátečníka, tak nebude problém v tom, že v těch inputech to id není popořadě?
o_O
Profil
Martin V.:
nebude problém v tom, že v těch inputech to id není popořadě?
Ne, tím to nebude. Pokud jsou seřazeny záznamy popořadě tak, že první ID patří prvnímu LEVEL, má to fungovat nehledě na pozici v databázi.

Zkuste vypsat mysql_error(), s tím to půjde jednodušeji. V PHP problém nevidím.
mysql_query("UPDATE rubriky SET level = '".$_POST['level'][$i]."' WHERE id = '".$_POST['id'][$i]."' ") or die(mysql_error());
Martin V.
Profil *
o_O:
Ne, tím to nebude. Pokud jsou seřazeny záznamy popořadě tak, že první ID patří prvnímu LEVEL, má to fungovat nehledě na pozici v databázi.

No nejsou popořadě. Je to jen nějaká část dat z mysql...
o_O
Profil
Martin V.:
No nejsou popořadě. Je to jen nějaká část dat z mysql...
Podle toho, jak máte zapsány řádky s inputy tak jsou. Mluvím o tom, že na stránce (z pohledu zdrojových kódů) se musí level[] a id[] vypisovat tak, aby patřili k sobě. Tzn.:
     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="23">';
     // inputy nahoře patří k sobě, to samé inputy dole.
     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="2">';

Ne, že by se vypisoval level[] a pod ním id[] k úplně jinému level[]-u. Snad je to srozumitelné. Prohlížeč odesílá všechny formulářové prvky tak, jak jsou napsány ve zdrojovém kódu, tzn.
$_POST['id'][0] bude mít hodnotu 23, 1 pak 42 atd.


Mimochodem když se dívám na Váš formulář, máte tam id[] 23 2×, takže přepisujete něco, co už jste přepsal.


Vypisuje něco ten mysql_error, popř. co přesně?
Martin V.
Profil *
Tak problém je v tomto

for($i=0; $i<count($_POST['level']); $i++){

Když to budu mít takto, tak se uloží všechno

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="1">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="2">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo'<input type="text" name="id[]" size="2" value="3">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="4">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="5">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="6">';



Když to budu mít ale takto, tak se uloží všechno kromě toho posledního inputu, jelikož count jobsahuje počet hodnot v tom poli což je 6 a poslední input má id 20 a tak se už neuloží

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="1">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="2">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo'<input type="text" name="id[]" size="2" value="3">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="4">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="5">';

     echo '<input type="text" name="level[]" size="2" value="0">';
     echo '<input type="text" name="id[]" size="2" value="20">';



když ale přidám do toho count třeba +20
for($i=0; $i<count($_POST['level'])+20; $i++){

tak se uloží všechno :(

tak nevím jak tu podmínku správně zapsat v tom for
Martin V.
Profil *
o_O:
Vypisuje něco ten mysql_error, popř. co přesně?
Vypisuje to

Notice: Undefined offset
o_O
Profil
Martin V.:
Count vrací počet, tzn. v tomto případě 6, což je správně. Správně je i ten for(), který projede všechny odeslané hodnoty (0-5 =6).

Aby jste to správně pochopil. Value ve formulářovém prvku není klíč pole (tedy číslo, které je zapsáno v $_POST['level'][X]), ale jeho hodnota, tzn. $_POST['level'][X]=hodnota.

> Vypisuje to
> Notice: Undefined offset
To číslo za touto chybou je taktéž důležité, znamená, že neexistuje $_POST['level'][číslo]. Ovšem nemá to nic společného s databází, ale s PHP (počítám, že jste tam nechal to +20).

Mě spíše zajímá, co vypisuje mysql_error(), jelikož zpracování toho formuláře je správně.
Martin V.
Profil *
o_O:
Mě spíše zajímá, co vypisuje mysql_error(), jelikož zpracování toho formuláře je správně.

Když dám uložit tento formulář, tak mi to píše
Notice: Undefined offset: 0
Notice: Undefined offset: 0
Notice: Undefined offset: 21
Notice: Undefined offset: 21
Notice: Undefined offset: 22
Notice: Undefined offset: 22
Notice: Undefined offset: 23
Notice: Undefined offset: 23
Notice: Undefined offset: 24
Notice: Undefined offset: 24
Notice: Undefined offset: 25
Notice: Undefined offset: 25
Notice: Undefined offset: 26
Notice: Undefined offset: 26
Notice: Undefined offset: 27
Notice: Undefined offset: 27
Notice: Undefined offset: 28
Notice: Undefined offset: 28
Notice: Undefined offset: 29
Notice: Undefined offset: 29
Notice: Undefined offset: 30
Notice: Undefined offset: 30
Notice: Undefined offset: 31
Notice: Undefined offset: 31


a ve formuláři se označené inputy neuloží (od id 111)

<input type="text" name="level[1]" value="338">
<input type="text" name="id[1]" value="1">

<input type="text" name="level[2]" value="33">
<input type="text" name="id[2]" value="2">

<input type="text" name="level[3]" value="0">
<input type="text" name="id[3]" value="3">

<input type="text" name="level[4]" value="0">
<input type="text" name="id[4]" value="4">

<input type="text" name="level[5]" value="0">
<input type="text" name="id[5]" value="5">

<input type="text" name="level[6]" value="0">
<input type="text" name="id[6]" value="6">

<input type="text" name="level[7]" value="0">
<input type="text" name="id[7]" value="7">

<input type="text" name="level[8]" value="0">
<input type="text" name="id[8]" value="8">

<input type="text" name="level[9]" value="0">
<input type="text" name="id[9]" value="9">

<input type="text" name="level[10]" value="0">
<input type="text" name="id[10]" value="10">

<input type="text" name="level[11]" value="12">
<input type="text" name="id[11]" value="11">

<input type="text" name="level[12]" value="1">
<input type="text" name="id[12]" value="12">

<input type="text" name="level[13]" value="1">
<input type="text" name="id[13]" value="13">

<input type="text" name="level[14]" value="1">
<input type="text" name="id[14]" value="14">

<input type="text" name="level[15]" value="1">
<input type="text" name="id[15]" value="15">

<input type="text" name="level[16]" value="1">
<input type="text" name="id[16]" value="16">

<input type="text" name="level[17]" value="1">
<input type="text" name="id[17]" value="17">

<input type="text" name="level[18]" value="1">
<input type="text" name="id[18]" value="18">

<input type="text" name="level[19]" value="18">
<input type="text" name="id[19]" value="19">

<input type="text" name="level[20]" value="18">
<input type="text" name="id[20]" value="20">

<input type="text" name="level[111]" value="2">
<input type="text" name="id[111]" value="111">

<input type="text" name="level[112]" value="2">
<input type="text" name="id[112]" value="112">

<input type="text" name="level[113]" value="2">
<input type="text" name="id[113]" value="113">

<input type="text" name="level[114]" value="2">
<input type="text" name="id[114]" value="114">

<input type="text" name="level[115]" value="2">
<input type="text" name="id[115]" value="115">

<input type="text" name="level[116]" value="2">
<input type="text" name="id[116]" value="116">

<input type="text" name="level[117]" value="2">
<input type="text" name="id[117]" value="117">

<input type="text" name="level[118]" value="2">
<input type="text" name="id[118]" value="118">

<input type="text" name="level[119]" value="2">
<input type="text" name="id[119]" value="119">

<input type="text" name="level[120]" value="2">
<input type="text" name="id[120]" value="120">

<input type="text" name="level[1111]" value="3">
<input type="text" name="id[1111]" value="1111">

<input type="text" name="level[1112]" value="0">
<input type="text" name="id[1112]" value="1112">


tak fakt už nevím :( navíc potřebuji uložit jen value level[], value id[] mě nezajíma... Děkuji
o_O
Profil
Martin V.:
<input type="text" name="level[1112]" value="0">
Do těch závorek se čísla nepíší, pokud používáte for().

Abych Vám vysvětlil, proč se vypisuje tato chyba. for() do určitého čísla (Vámi definovaného) opakuje příkazy uvnitř, takže v případě, že mu dáte opakování na počet odeslaných inputů, pojede prostě od nuly do count($_POST['level']). Ve Vašem formuláři ovšem jako klíče (to je to uvnitř závorek, např. 1112) vybíráte vlastní čísla, což for() nemůže vědět a proto při neexistující proměnné $_POST['level'][číslo] vyhodí chybu.

Pokud potřebujete / chcete mít strukturu formuláře takto, doporučoval bych foreach, např:
foreach($_POST['level'] AS $key=>$value){
      mysql_query("UPDATE rubriky SET level = '{$value}' WHERE id = '{$key}' ") or die(mysql_error());
}
/**
* V případě <input type="text" name="level[1112]" value="0">
* Bude obsah proměnných $key=1112 a $value=0
**/


Tady pak projíždí každý poslaný level[] a je jedno, jaký klíč má přidělen, jestli 0-100, nebo 1000-1100, či jakékoliv náhodné čisla.

Pro pochopení for() si například můžete vypsat:
for($i=0;$i<=100;$i++)
  echo $i.'<br>';

A přesně toto hledá i v $_POST['level'], a to i když neexistuje.
Tori
Profil
Martin V.:
Když píšete, že ty hodnoty čtete z DB a můžete teda použít level[ID] = hodnota, tak tohle je už na správné cestě:
<input type="text" name="level[1]" value="338">
Teď jen místo cyklu for použijte foreach - tím získáte i ta IDčka.
Martin V.
Profil *
o_O:
Tak to je teď jiná ;) Strašně moc děkuji... hlavně za perfektní objasnění. Je vidět, že tomu opravdu rozumíte...

BTW: živíte se programováním v PHP? Pokud ano, můžete mi prosím na vás poslat nějaký kontakt na www-data[@]centrum.cz
samozřejmě by se jednalo o takové drobné úpravy za fin. odměnu

Ještě jednou moc děkuji.

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:

0