Autor Zpráva
Mufna
Profil
Zdravím Vás. Kde je prosím Vás chyba ? Hlásí mi to chybu na řádku 6.

$name  = $_POST['name'];
$email  = $_POST['email'];
$text0  = $_POST['text0'];

    $sql="INSERT INTO ".$tbl_prefix."storage (`success`, `name`, `email`, `question`, `inserted`) 
6.         VALUES ('0','".escape($name)."','".escape($email)."','".escape($text0)."',NOW())";

    query($sql);

function escape($str) {
    $str = trim($str);
    if(!is_numeric($str)) {
        $str = sprintf("'%s'", mysql_real_escape_string($str));
    }
    return $str;
}
Alphard
Profil
Jakou chybu?
Mufna
Profil
Je to všechno součástí jedné stránky (jednoho PHP souboru), na ní je celý formulář včetně zpracování (na začátku skriptu jsou zpracovávací procedury, pod nimi pak vlastní formulář) , no a když ho vyplním a odešlu, tak mi naskočí prázdná stránka v prohlížeči, pouze s hláškou:
Nezdařila se operace s databází­!
You have an error in your SQL syntax

Je ale zajímavý, že do databáze se to dostane :-(

EDIT: Tak možná že nedostane, předtím jsem to měl asi malinko jinak a to tam procházelo
Alphard
Profil
Jak vypadá $sql? Zkopírujte sem příklad sestaveného dotazu.
A opravdu mysql_error() nevypíše nic víc než "You have an error in your SQL syntax"?

Teď jsem si všiml, že funkce escape() duplikuje apostrofy.
Mufna
Profil
Alphard
funkce escape() duplikuje apostrofy
to bude ono, protože teď jsem zjistil, že chyba se neobjeví, když zkusím odeslat úplně prázdný formulář. V tom případě to do DB projde bez chybové hlášky, ale v příslušných sloupcích tabulky není prázdné místo, ale apostrof.

Zeptám se jen, jak byste to odstranil ? Myslím, že přímo v dotazu je to takto správně, takže ten bych nechal být. Takže upravit tu funkci escape() ? Tzn takhle ?
$str = sprintf("%s", mysql_real_escape_string($str));


Jak vypadá $sql
Ta by měla být v pohodě, všude mi to fungovalo, než jsem začal upravovat dotazy o fci escape()
  function query($sql) {
    $res=@mysql_query($sql);
    if (!$res) {
      echo '<p>Nezdařila se operace s databází!<br><i>'.mysql_error().'</i></p>';
      exit;
    }
    return $res;
  }
Alphard
Profil
Mufna:
Zeptám se jen, jak byste to odstranil ?
Navržená úprava bude fungovat, ale toto řešení celkově není ideální. Jestli nechcete překopat celý projekt, další odstavec ani nemusíte číst. :-)

Používáte-li tuto funkci pouze na ošetření řetězců, je navržená úprava asi nejvhodnější. Zároveň bych ale odstranil podmínku s is_numeric(), nemá zde totiž smysl. Když to trochu rozvedu, čísla do apostrofů naopak nepatří (to, že je MySQL akceptuje, ponechme stranou), takže jestli by ta funkce měla být univerzální, tak by musela apostrofy kolem řetězců doplňovat sama (a nesměly by být v dotazu samotném duplikovány) a čísla ponechávat čistá. Zde ale narazíme na problém s rozpoznáním, jaký datový typ má sloupec, do kterého chceme vkládat data. Někdy se může stát, že budete chtít vložit řetězec skládající se z číslic, to by pak skončilo syntaktickou chybou. A to ani nezmiňuji další datové typy, např. validat data a času.

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: