Autor | Zpráva | ||
---|---|---|---|
Smekac Profil |
Zdravím, mám následující problém,
mám v databázi seznam produktů se sloupci název_prod, id, pocet. Pomocí cyklu while si vypíšu všechny záznamy v db a ke každému záznamu se vypíše i řádek s polem kde se vkládá počet kusů skladem. Do tohoto pole se i načte hodnota z databáze. Problém nastane tehdy když potřebuju uložit. Script mám takto: $dotaz = 'SELECT * FROM LokomotivyTT WHERE kategorie=753 ORDER BY id asc'; $vysledek=mysql_query($dotaz); while($zaznam=mysql_fetch_array($vysledek)) { echo $zaznam['nazev_prod']; echo "<input type=\"text\" value=\""; echo $zaznam['pocet']; echo "\" name=\""; echo $zaznam['id']; echo "\"><br>"; if($_POST['odeslat']) { $zaznam['pocet'] = $_POST['pocet']; $dotaz_upd='UPDATE LokomotivyTT SET pocet = '.$zaznam['pocet'].' WHERE nazev = '.$zaznam['id'].' '; } } |
||
jenikkozak Profil |
#2 · Zasláno: 1. 3. 2013, 17:56:07
V části, ve které testujete existenci odeslání prvku „odeslat“ pouze přiřazujete řetězec do proměnné, chybí ale dotaz na databázi, který by využil tuto proměnnou.
|
||
Smekac Profil |
#3 · Zasláno: 1. 3. 2013, 18:28:31
Mužete hodit nějaký příklad jak na to ? Já totiž to pořád nemůžu rozchodit... resp. nevím jak přesně udělat ten dotaz jak píšete.
|
||
mzk Profil * |
#4 · Zasláno: 1. 3. 2013, 18:36:16
Smekac:
„Mužete hodit nějaký příklad jak na to ? Já totiž to pořád nemůžu rozchodit... resp. nevím jak přesně udělat ten dotaz jak píšete.“ if($_POST['odeslat']) { $zaznam['pocet'] = $_POST['pocet']; // toto je zbytečný - to už rovnou můžeš použít v dotazu když tam nemáš ochranu $dotaz_upd='UPDATE LokomotivyTT SET pocet = "'.$zaznam['pocet'].'" WHERE nazev = "'.$zaznam['id'].'"'; mysql_query($dotaz_upd); } |
||
Micruss Profil |
#5 · Zasláno: 1. 3. 2013, 18:36:19
<? if(isset($_POST['odeslat'])) { // kod } |
||
Smekac Profil |
Tedka se opět děje to samé. Když přepíšu hodnotu a dám odeslat tak se neuloží do databáze a načte se stará hodnota. Asi mam někde překlep. Pro uplnost ted vypadá kod takto:
$dotaz = 'SELECT * FROM LokomotivyTT WHERE kategorie=753 ORDER BY id asc'; $vysledek=mysql_query($dotaz); while($zaznam=mysql_fetch_array($vysledek)) { echo $zaznam['nazev_prod']; echo "<input type=\"text\" value=\""; echo $zaznam['pocet']; echo "\" name=\""; echo $zaznam['nazev']; echo "\"><br>"; if($_POST['odeslat']) { $dotaz_upd='UPDATE LokomotivyTT SET pocet = "'.$zaznam['pocet'].'" WHERE nazev = "'.$zaznam['nazev'].'"'; mysql_query($dotaz_upd); } } |
||
Tori Profil |
Smekac:
1. Ukládání dat musí být mimo cyklus, kterým je vypisujete. Každé přeci proběhne jindy - při jednom spuštění skriptu vypíšete data do formuláře, při dalším (= odeslání formuláře) data ukládáte (a jestli je pak zase vypisujete, anebo přesměrujete na jinou stránku, to už s tím nesouvisí). Takže: if (isset($_POST['odeslat'])) { // update } // a tady bude SELECT * from LokomitivyTT a výpis dat 3. Údaje, které vkládáte do SQL dotazu, musíte escapovat. Tj. čísla (ID) přetypovat na čísla $idZaznamu = (int)$_POST['id'] a řetězce prohnat funkcí mysql_real_escape_string, jinak vám první uvozovka nebo apostrof v některé hodnotě rozbije SQL a změněný záznam se neuloží.
4. Při updatu kontrolujte, co vrací fce mysql_query. Pokud false, tak došlo k nějaké chybě a update se neprovedl. Chybu zjistíte funkcí mysql_error. (nicméně používejte ji jen teď, když ten web ladíte u sebe na localhostu. Na veřejném webu se chyby spíš logují do souboru a návštěvníkovi se zobrazí nějaká obecná chybová hláška.) |
||
Smekac Profil |
#8 · Zasláno: 2. 3. 2013, 13:07:27
No tomu nějak nerozumím.
Tedy vložím celou podmínku v příspěvku 1 mimo while (), doplním načtení hodnoty ID, dál mám do načtení hodnoty vložit (int) a dál si nejsem jist resp. jsem asi nepochopil funkci mysql_real_escape_string. |
||
Tori Profil |
#9 · Zasláno: 2. 3. 2013, 13:24:26
Smekac:
$bezpecny_retezec_ktery_muzete_vlozit_do_SQL_dotazu = mysql_real_escape_string($_POST['nebezpecny']['retezec']['z']['formulare']); |
||
Smekac Profil |
#10 · Zasláno: 2. 3. 2013, 14:33:23
Takže celé by to mělo ve výsledku vypadat nějak takto ?
if($_POST['odeslat']) { $zaznam['pocet'] = mysql_real_escape_string($_POST['pocet']); $zaznam['id'] = mysql_real_escape_string($_POST['id']); $dotaz_upd='UPDATE LokomotivyTT SET pocet = '.$zaznam['pocet'].' WHERE id = '.$zaznam['id'].' '; $vysledek_upd=mysql_query($dotaz_upd); } |
||
Tori Profil |
Smekac:
if($_POST['odeslat']) { $pocet = mysql_real_escape_string($_POST['pocet']); // pokud je to řetězec. V SQL se píše do uvozovek nebo apostrofů $id = (int) $_POST['id']; // pokud je to číslo. V SQL bez uvozovek. $dotaz_upd = 'UPDATE LokomotivyTT SET pocet = "'.$pocet.'" WHERE id = '.$id; $vysledek_upd = mysql_query($dotaz_upd); } |
||
Smekac Profil |
#12 · Zasláno: 2. 3. 2013, 15:50:39
No dobře, v obou případech mám čísla takže mysql_real_escape_string nepoužiji. Takže to by mělo být už dobře. Ale stejně se mi nezdá že by to upravilo u všech záznamů v tabulce sloupec pocet tak, jak je to zadáno v polích formuláře.
|
||
Tori Profil |
#13 · Zasláno: 4. 3. 2013, 07:42:49
Smekac:
Asi to upraví jen u posledního zobrazeného záznamu (protože z formuláře přijde několik políček $_POST['nazev'] a pozdější přepíše hodnotu předchozího). Chtělo by to ukládat jako pole - tj. do formuláře generovat tak, aby vám vzniklo ID 1: <input type="text" name="pocet[1]" value="123"> ID 2: <input type="text" name="pocet[2]" value="123"> ... $_POST['pocet'] a postupně poukládáte.
|
||
Časová prodleva: 11 let
|
0