Autor | Zpráva | ||
---|---|---|---|
peteo Profil |
#1 · Zasláno: 26. 2. 2013, 06:31:40
Dobrý deň, večer, ráno,
tak som sa konečne rozhýbal a pokračujem v činnosti ohľadne databáz. V podstate všetko beží ako má, až na editovanie záznamov. Nastolím situáciu: pomocou vyhľadávacieho nástroja si nájdem záznam, ktorý chcem upravovať. Žiadaný záznam je potom vytiahnutý do formulára: <?php $idd = $_GET["idd"]; include ("conect.php"); $vyber=mysql_query("SELECT * FROM `meno` WHERE `id_meno` ='".$idd."'"); $row = mysql_fetch_array($vyber); echo "<form action='opravau.php' method='post'>"; echo "<input type='hidden' name='ok' value=0> "; echo "<input type='text' size=10 name='idd' value=".$idd.">"; echo "<textarea cols=60 rows=2 wrap='soft' name='meno'>".$row['meno']."</textarea>"; echo "<textarea cols=60 rows=20 wrap='soft' name='obsah'>".$row['obsah']."</textarea>"; echo "<br><br><input type='submit' value=\" Uložiť \">"; echo "</form>"; ?> ktorý po oprave (editovaní) odosielam na kontrolu a potvrdenie zápisu, kde je ďalší skript: <?php $idd = $_POST["idd"]; $meno = $_POST["meno"]; $obsah = $_POST["obsah"]; $ok = $_POST["ok"]; echo $idd."<br><br>"; echo $meno."<br><br>"; echo $obsah."<br><br>"; if ($ok==0){ echo "<form action=\"opravau.php\" method='post'>"; echo "<input type=\"hidden\" name=\"ok\" value=1> "; echo "<input type=\"hidden\" name=\"idd\" value=".$idd."> "; echo "<input type=\"hidden\" name=\"meno\" value='".$meno."'> "; echo "<input type=\"hidden\" name=\"obsah\" value='".$obsah."'> "; echo "<br><br><input type=\"submit\" value=\" Uložiť \">"; echo "</form>"; } if ($ok==1){ include ("conect.php"); mysql_query("UPDATE meno SET meno = '".$meno."',obsah = '".$obsah."' WHERE id_meno = '".$idd."'"); echo "<br><br>Záznam uložený, pozri <a href=edit.php?dotaz=".$meno.">edit.php?dotaz=".$meno."</a>"; } ?> Všetko (vizuálne) prebehne správne, teda do formulára je ponúknutý správny text, po jeho odoslaní sa objaví opravený text, ale nezapíše sa do databázy, teda po potvrdení zápisu sa nič nestane, Podobne mi to nefunguje i so zápisom nového záznamu do databáz, kde je odosielanie v skripte if ($ok==1){ include ("conect.php"); mysql_query("INSERT INTO meno (meno,obsah) VALUES ('".$meno."','".$obsah."')"); echo "<br><br>Záznam uložený, pozri <a href=edit.php?dotaz=".$meno.">edit.php?dotaz=".$meno."</a>"; } Je to proste pokazené. |
||
Tori Profil |
Neověřujete, jestli dotaz opravdu proběhl, nebo skončil chybou: FAQ
Neošetřujete vstupní data, první apostrof uvnitř $obsah vám to rozbije. (mysql_real_escape_string, přetypování ID na číslo). Pokud je ID číselné, v SQL okolo něj nepatří apostrofy/uvozovky. Jinak možná by to šlo udělat i v jednom skriptu. Tím byste si ušetřil opakování stejného kódu (formulář) a nutnost dělat případné změny na víc místech. ID = (isset(GET[id]) ? (int)GET[id] : null); pokud byl odeslaný formulář: zkontroluj údaje (např. max.povolenou délku) pokud ok, ulož (INSERT ... ON DUPLICATE KEY UPDATE, při insertu dáte NULL jako hodnotu ID) přesměruj (na tuto stránku bez parametrů anebo kam chcete) pokud nebyl odeslaný formulář, ale bylo zadané ID načti záznam z DB anebo pokud při kontrole údajů došlo k chybě použij data z formuláře zobraz formulář, a pokud máme nějaká data (z DB nebo z předchozího odeslání formuláře), vyplň je do formuláře |
||
peteo Profil |
#3 · Zasláno: 26. 2. 2013, 08:10:53 · Upravil/a: peteo
Tori:
ošetrovať ID pravdepodobne nemusím, je vždy číslo a existuje, na základe neho je do formulára generovaný záznam. Ale môžem. při insertu dáte NULL jako hodnotu ID pre id tam je int() a auto_increment (píšem to správne?) - takže predpokladám automatický nárast, keď ho nezadám v INSERT do zápisu (predpokladám správne?). S tými apostrofmi ma to nenapadlo, to je fakt. Ako ich teda ošetriť, tak aby mi potom do výsledného textu nepadalo niečo ako " ale " v zápise
mysql_query("INSERT INTO meno (meno,obsah) VALUES ('".$meno."','".$obsah."')"); ?
Stačí tam \" pre zápis do textu ako " ?
Potrebujem myslieť aj na to, že za čas záznam budem zasa upravovať a je nutné sa v ňom vyznať (aby bol teda čitateľný a nie plný entít). Neověřujete, jestli dotaz opravdu proběhl, nebo skončil chybou takto?: ... mysql_query("UPDATE meno SET meno = '".$meno."',obsah = '".$obsah."' WHERE id_meno = '".$idd."'") or die(mysql_error()); ... Jinak možná by to šlo udělat i v jednom skriptu. zatiaľ to mám rozhodené do 4 skriptov, počítam, že to po odladení dám do jedného. Takto sa mi ľahšie hľadajú chyby. Myslel som na to, preto sú všade rovnaké premenné, plánovaný selektor je $ok .
Ďakujem Doplním: Skutočne, problém je pravdepodobne v " a ' .
Záznamy, ktoré tieto znaky neobsahujú, upravovať idú. Nové záznamy zatiaľ nejdú, mám podozrenie, že tam práve chýba ten zápis ID. Hm. |
||
Tori Profil |
peteo:
„pre id tam je int() a auto_increment (píšem to správne?) - takže predpokladám automatický nárast, keď ho nezadám v INSERT do zápisu“ Ano. Nejbližší vyšší ID se automaticky doplní pokud v insertu sloupec ID vůbec není uvedený, anebo má hodnotu NULL. „S tými apostrofmi [...] Ako ich teda ošetriť“ odkázala jsem Převod na entity se obvykle dělá při výpisu z DB, ne při ukládání (jedině že byste třeba ukládal zároveň editovatelný zdroják článku s bbcodes i výsledné složené HTML, pak by to dávalo smysl) „takto? mysql_query(...) or die()“ A co chcete aby to při chybě udělalo? Má skript v polovině stránky umřít, anebo byste byl radši, kdyby se vám znova zobrazil ten vyplněný formulář + popis chyby (= máte možnost chybu opravit a formulář znovu odeslat)? |
||
peteo Profil |
#5 · Zasláno: 26. 2. 2013, 09:06:37
Tori:
Vďaka za tie " a ' , ošetrené, funguje.
Celá sranda je v tom, že to je práve uložený hotový článok včítane html tagov, .. ale to už je vyriešené. Mám si dať pozor (teda ošetriť) ešte nejak´znaky? ad or die(): vôbec netuším, čo po tom môžem chcieť (teraz už najmä pri pokuse o nový zápis) [nebite ma, učím sa za pochodu, jediné, čo som testoval, bolo pripojenie]: po spustení include ("cotoje_conect.php"); mysql_query("INSERT INTO meno (meno,obsah) VALUES ('".$meno."','".$obsah."')") or die("Je to pokazené".mysql_error()); echo "<br><br>Záznam uložený, pozri <a href=edit.php?dotaz=".$meno.">edit.php?dotaz=".$meno."</a>"; sa nevypíše, že je to pokazené, ale pritom zápis do databázy neprebehne. skúšal som i include ("cotoje_conect.php"); mysql_query("INSERT INTO meno (i_meno,meno,obsah) VALUES ('NULL','".$meno."','".$obsah."')") or die("Je to pokazené".mysql_error()); echo "<br><br>Záznam uložený, pozri <a href=edit.php?dotaz=".$meno.">edit.php?dotaz=".$meno."</a>"; takisto bez efektu. Premenné $meno ,$obsah sú v poriadku, majú žiadúci formát.
Jedná sa o dve vstupné polia (text) v html formáte. |
||
Časová prodleva: 12 let
|
0