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'].' ';
}
}
První část mi vytáhne hodnotu z databáze, vypíše formulář, jméno řádku a vloží hodnotu "pocet" do formuláře. Takto se to opakuje dokud nevypíše všechny záznamy z databáze. Druhá část by měla po kliknutí na tlačítko name="odeslat". Ale to mi bohužel nefunguje. Nevíte někdo co s tím ? Díky za rady.
jenikkozak
Profil
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
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 *
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
<? 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
2. Tam, kde ukládáte data z formuláře, musíte změněné údaje číst z pole $_POST (v [#1] jste tohle měl dobře, akorát vám chybělo načtení ID z $_POST a celý update byl jinde než měl být. Ale čtení z $_POST bylo správně.)

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
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
Smekac:
$bezpecny_retezec_ktery_muzete_vlozit_do_SQL_dotazu = mysql_real_escape_string($_POST['nebezpecny']['retezec']['z']['formulare']);
Smekac
Profil
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
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
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"> ...
Po odeslání formuláře projdete pole $_POST['pocet'] a postupně poukládáte.

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: