Autor Zpráva
peteo
Profil
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=\"&nbsp;&nbsp;Uložiť&nbsp;&nbsp;\">";
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=\"&nbsp;&nbsp;Uložiť&nbsp;&nbsp;\">";
  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
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 &quot; 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
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.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: