Autor Zpráva
peteo
Profil
ako ošetriť požiadavok hlásenia chyby or die(mysql_error()) aby oznámil, aká chyba nastala?
Vo všetkých príkladoch vidím iba zápis or die(mysql_error()) prípadne or die("Nejaký text".mysql_error()), žiadne kódy ani nič.
Ako teda zistím, kde a aká chyba nastala?


Potreboval by som vedieť nielen že chyba nastala, ale aká chyba nastala.
Alphard
Profil
Na ošetření stylem or die jsem alergický, snad nejhorší možnost, co šlo vymyslet. Já bych využil Laděnku z Nette a dibi pro přístup k databázi.
Joker
Profil
peteo:
Ako teda zistím, kde a aká chyba nastala?
Z toho výpisu. Funkce mysql_error() právě vypíše, jaká chyba nastala.

Připomínám, že tohle je vhodné leda do vývojového prostředí, v ostrém provozu se nemají chyby co vypisovat do stránky.
(Obsah stránky prohlíží návštěvník, kterého nebudeme otravovat chybovými hláškami, navíc občas použitelnými pro hacknutí webu. Návštěvníkovi máme vypsat něco jako „Omlouváme se, došlo k chybě, na odstranění se pracuje“. Informaci o chybě je třeba předat správci webu, tj. zapsat do nějakého logu.)
juriad
Profil
Konstrukci or die() nepoužívej. Výsledkem je zobrazení citlivé informace o serveru uživateli. Tuto konstrukci píší do ukázek vrazi malých štěnátek, ale nikdy potom nezmíní její nevhodnot v reálném použití.

Operátor X or Y se vyhodnocuje jako poslední. V kombinaci s mysql_query, které vrací při chybě FALSE se tedy část Y (z důvodu zkráceného vyhodnocování) provede jen v případě chyby.

Můžeš třeba psát:
function log_sql_error($dotaz) {
  fopen(...)
  fwrite(time()." ".$dotaz." ".mysql_error());
  fclose(...)
  header("Location: error.html");
  exit();
}

$sql="SELECT * FROM neexistujici-tabulka";
$vysledek = mysql_query($sql) or log_sql_error($sql);
peteo
Profil
používam to vo formulári pre editovanie záznamov (editáciu robím ich ja, viď chyba v skripte pre UPDATE a INSERT?)

ide mi o to, že zaboha neviem prečo mi insert nezapisuje do databázy, pričom chybovku or die("Je to pokazené".mysql_error()) nehlási.

juriad:
nerozumiem tomu (ja neviem čo mám nes za deň)

header("Location: error.html");

to mám vytvoriť ešte error.html?
Joker
Profil
peteo:
Ano, to přesměruje na error.html.
Může se tam prostě dát adresa stránky s chybovým hlášením (pokud není, je samozřejmě potřeba ji vytvořit, ale je dobré ji na webu mít už kvůli řešení jiných chyb).
peteo
Profil
Joker:
No dobre, ale to sa zasa dozviem, že nastala chyba.
Ale aká, nie.
Potrebujem, nech mi to hodí hlášku napr.

Zápis sa nepodaril, chýba koncové " (i anglicky, to je jedno)

to pre chybu pripojenia napáchať error_conect.html, v upate error_update.html atď? Podľa čoho potom v headri selektovať?

Ale v tomto sa mi zdá or die() jasné, ale nechápem, prečo chybu nehádže, keď dotaz má výsledok NULL (aha!, si myslím, keď nehádže chybu a nevytvorí nový záznam) (teda zápis sa nevypísal, predpokladám že má výsledok NULL - hm, ale to asi ni je chyba).
Tak neviem.
Joker
Profil
peteo:
Ta chybová stránka je pro návštěvníka, ten nepotřebuje vědět technické informace o chybě (průměrný návštěvník by netušil, o co jde).
Pro správce je ten záznam v logu.
A ještě jednou: Jaká chyba nastala vrátí to mysql_error.
peteo
Profil
Joker:
Rozumiem, ale toto je administrácia pre mňa, v postate dolaďujem skript na vkladanie nových údajov a opravy (UPDATE), pričom UPDATE je v pohode, ale INSERT nejde.
Preto hľadám niečo, čo vyhodí nejaký kód chyby ale niečo podobné, aby som vedel, kde a aká chyba je (podobne ako to robí PHP, vypíše číslo riadku kódu a problém a stránku).


Takže:

dopyt ktorý mám zo skriptu

  mysql_query("INSERT INTO meno (meno,obsah,book) VALUES ('".$meno."','".$obsah."','".$book."')") or die("Je to pokazené".mysql_error());

pričom $meno."','".$obsah."','".$book je hodnotovo v poriadku (nevyhodí chybu).

po vložení v mysqlamin
INSERT INTO meno( meno, obsah, book )
VALUES (
'bbbb', 'bbbb', 'b'
)

prebehol v poriadku.

len z toho skriptu mi to nejde ukladať.
Nemôže byť chyba v nejakých právach alebo čo ja viem?
Skript samotný

<?php
$idd   =      $_POST["idd"];
$meno  =      $_POST["meno"];
$obsah =      $_POST["obsah"];
$ok    =      $_POST["ok"];
$book    =    $_POST["book"];

  echo $idd." ".$book."<br><br>";
  echo $meno."<br><br>";
  $text=$obsah;include ("pict.php");
  echo $text."<br><br>";

if ($book=="") {echo "Nie je vyplnené pole kniha!";$ok=3;}
if ($meno=="") {echo "Nie je vyplnené pole meno!";$ok=3;}
if ($obsah=="") {echo "Nie je vyplnené pole obsah!";$ok=3;}

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=\"book\" value=".$book."> ";
  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");
  $obsah=str_replace('"','\"',$obsah);
  $obsah=str_replace("'","\'",$obsah);
  mysql_query("INSERT INTO meno (meno,obsah,book) VALUES ('".$meno."','".$obsah."','".$book."')") or die("Je to pokazené".mysql_error());
  $menoa=str_replace(" ","%20",$meno);
  echo "<br><br>Záznam uložený, pozri <a href=edit.php?dotaz=".$menoa.">edit.php?dotaz=".$meno."</a>";
}
if ($ok==3){
  echo "<br>";
  echo "<form action='novyu.php' method='post'>";
  echo "  <input type='hidden' name='ok' value=0> ";
  echo "  <input type='text' size=10 name='idd' value='NULL' disabled> ";
  echo "  <input type='text' size=2 name='book'>".$book."</textarea> ";
  echo "  <textarea cols=60 rows=2 wrap='soft' name='meno'>".$meno."</textarea> ";
  echo "  <textarea cols=60 rows=20 wrap='soft' name='obsah'>".$obsah."</textarea> ";
  echo "  <br><br><input type='submit' value='&nbsp;&nbsp;Uložiť&nbsp;&nbsp;'>";
  echo "</form>";
}
?>

chybu nehádže.
Pritom podobný skript na UPDATE funguje:

<?php
$von=array("<",">"," ",'"',"=","img","src");
$idd   =      $_POST["idd"];
$meno  =      $_POST["meno"];
$obsah =      $_POST["obsah"];
$ok    =      $_POST["ok"];

echo $idd."<br><br>";
echo $meno."<br><br>";
$text=$obsah;include ("pict.php");
echo $text."<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 "<br><br><input type=\"submit\" value=\"&nbsp;&nbsp;Opraviť&nbsp;&nbsp;\" onclick=\"this.form.action = 'oprava.php'\">";
  echo "</form>";
}
if ($ok==1){ 
include ("cotoje_conect.php");
$obsah=str_replace('"','\"',$obsah);
$obsah=str_replace("'","\'",$obsah);
mysql_query("UPDATE meno SET meno = '".$meno."',obsah = '".$obsah."' WHERE id_meno = '".$idd."'") or die(mysql_error());
  $menoa=str_replace(" ","%20",$meno);
echo "<br><br>Záznam uložený, pozri <a href=edit.php?dotaz=".$menoa.">edit.php?dotaz=".$meno."</a>";
}
?>



Niečo ako vyhodí mysqladmin

po zadaní
INSERT INTO meno (meno,obsah,book) VALUES ('ggggg"','ggggg','gg'

vyhodí
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
juriad
Profil
řádky 29 a 30 prvního skriptu a 25, 26 druhého nahraď voláním funkce mysql_real_escape_string, ta jako jediná korektně oescapuje vstup do databáze.
Joker
Profil
peteo:
Preto hľadám niečo, čo vyhodí nejaký kód chyby ale niečo podobné, aby som vedel, kde a aká chyba je (podobne ako to robí PHP, vypíše číslo riadku kódu a problém a stránku).
Potřetí: Tohle dělá to mysql_error(). Resp. mysql_error() vrací text chybové hlášky a mysql_error_nomysql_errno() vrací samotný kód chyby.

Co vypíše ta aktuální verze skriptu?
juriad
Profil
ukázka výpisu chyby (jejího čísla i textový popis) je v příkladu mysql_errno
Davex
Profil
peteo:
Já tedy nevím, který skript je který a jak se volají, protože je to celé hrozně nepřehledné, ale podle mě není problém s databází. Pokud se ten první skript jmenuje novyu.php, tak problém bude pravděpodobně v podmínce if ($ok==1){, která způsobí, že ta ukládací větev vůbec neproběhne, protože se z formuláře asi posílá $ok = 0.

Přepiš si to do nějaké srozumitelnější podoby, protože tohle zkoumat je peklo.
peteo
Profil
juriad:
jj, díky, spravené.

ešte som uvažoval:
ak miesto

mysql_query("INSERT INTO meno (meno,obsah,book) VALUES ('".$meno."','".$obsah."','".$book."')"); (čo nefunguje)

použijem

mysql_query("UPDATE meno SET meno = '".$meno."',obsah = '".$obsah."' WHERE id_meno = NULL); (čo by možno fungovať mohlo)

čo sa stane? Vytvorí to nový riadok s unikátnym id_meno?
len sa to bojím vyskúšať nech to polhodinu neprepisuje 130.000 záznamov.
juriad
Profil
udělá to přesně to co jsi zapsal:
upraví jméno a obsah u všech řádků, které mají id_meno rovné NULL, takový řádek není ani jeden, tedy dotaz se provede, ale nic nezmění; k žádné chybě nedojde.
Joker
Profil
peteo:
Dostaneme i nějaký bližší popis chyby, než nefunguje?
peteo
Profil
Joker:
no to je ten problém, nehádže to chybu.
a zápis neprebehne.


Davex:
vyzerá to, že to je ono:

novyu.php:
<?php
$idd   =      $_POST["idd"];
$meno  =      $_POST["meno"];
$obsah =      $_POST["obsah"];
$ok    =      $_POST["ok"];
$book  =      $_POST["book"];

  echo "test:".$ok."<br><br>";  
  echo $idd." ".$book."<br><br>";
  echo $meno."<br><br>";
  $text=$obsah;include ("pict.php");
  echo $text."<br><br>";

if ($book=="") {echo "Nie je vyplnené pole kniha!";$ok=3;}
if ($meno=="") {echo "Nie je vyplnené pole meno!";$ok=3;}
if ($obsah=="") {echo "Nie je vyplnené pole obsah!";$ok=3;}


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=\"book\" value=".$book."> ";
  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 "<br><br><input type=\"submit\" value=\"&nbsp;&nbsp;Opraviť&nbsp;&nbsp;\" onclick=\"this.form.action = 'novy.php'\">";
  echo "</form>";
}
if ($ok==1){ 
  include ("cotoje_conect.php");
  $obsah=mysql_real_escape_string($obsah);
  mysql_query("INSERT INTO meno (meno,obsah,book) VALUES ('".$meno."','".$obsah."','".$book."')") or die("Je to pokazené".mysql_error());
  $menoa=str_replace(" ","%20",$meno);
  echo "<br><br>Záznam uložený, pozri <a href=edit.php?dotaz=".$menoa.">edit.php?dotaz=".$meno."</a>";
}
if ($ok==3){
  echo "<br>";
  echo "<form action='novyu.php' method='post'>";
  echo "  <input type='hidden' name='ok' value=0> ";
  echo "  <input type='text' size=10 name='idd' value='NULL' disabled> ";
  echo "  <input type='text' size=2 name='book'value='".$book."'>";
  echo "  <textarea cols=60 rows=2 wrap='soft' name='meno'>".$meno."</textarea> ";
  echo "  <textarea cols=60 rows=20 wrap='soft' name='obsah'>".$obsah."</textarea> ";
  echo "  <br><br><input type='submit' value='&nbsp;&nbsp;Uložiť&nbsp;&nbsp;'>";
  echo "</form>";
}
?>

stránka je volaná z novy.php pre overenie uloženia (ok=0)

uložiť - stránka je volaná z novyu.php (ok=1) (a tam je asi chyba, pretože echo "test:".$ok."<br><br>"; sa vôbec nevypíše, ale hlásenie echo "<br><br>Záznam uložený, pozri <a href=edit.php?dotaz=".$menoa.">edit.php?dotaz=".$meno."</a>"; sa vypíše. Tak neviem)

ok=3 je oprava a nový dotaz na uloženie.
Teraz už len dumem, prečo po odoslaní z podmienky ok==0 sa nevypisuje test:1.


SLÁVA, vyriešené.

chyba medzi hlavou a klávesnicou.
v [#17] v riadku 20 má byť echo "<form action=\"novyu.php\" method='post'>";

Ďakujem všetkým za božskú tpezlivosť, najmä Davexovi, ktorý ma nakopol správnym smerom.


a to nad tým sedím druhý deň.
Davex
Profil
No, ale jestli to chápu správně, tak ve skriptu novyu.php záznam jen zobrazuješ pro kontrolu a odesíláš úplně jinému skriptu opravau.php, který by ho měl teprve uložit.

↑ no, vida
peteo
Profil
Davex:
presne. V novy.php ho i vo formulári editujem, až potom odosielam pre kontrolu do novyu.php.

teraz je to ale zasa celé inak, toto bolo rozhodené iba pre lepšiu kontrolu (ladenie chýb), už je to v jednom skripte (UPDATE i INSERT), a dokonca to i funguje.

ale ako zisťujem, práve pre snahu lepšej kontroly sa mi tam vlúdila chyba. Hm.

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: