Autor Zpráva
unlucky
Profil
mám řetězec ošetřený o strip tags. Když ale ukládám do databáze, tak se ukládá '

treba misto father's pen tak tam je father's pen

zkousel jsem mysql real escape ... a html entiti decode, nic z toho nefunguje

prosim o pomoc
Majkl578
Profil
unlucky:
treba misto father's pen tak tam je father's pen
Čím to je, že v tom nevidím rozdíl?
lingvik
Profil
unlucky:
Teď budu jenom hádat, ale mám pocit, že mluvíš o escapování znaků při ukládání do databáze (typicky právě apostrof). To se nedělá pomocí strip_tags (i když tahle funkce může být taky užitečná), ale univerzálně pomocí addslashes nebo pro konkrétní databázi pomocí mysql_real_escape_string, pg_escape_string apod. V databázi ale žádný rozdíl nepoznáš. To escapování se projevuje jenom ve vytvořeném SQL dotazu. Zkus si vypsat dotaz, který pomocí těch funkcí vytváříš, a před apostrofy uvidíš zpětná lomítka: father\'s pen.
unlucky
Profil
aha, tak tady na foru se automaticky prevedlo ten znak # 26 ; na apostrov

v tom skriptu nutne potrebuju strip tags a kdyz ho pouziju, tak sql escape a ani addslashes nefungujou (nahradi mi to znaky). Tez jsem zkousel kombinace s html entti decode

    $val[$i]=trim(strip_tags(addslashes($val[$i])));
    $val[$i]=html_entity_decode($val[$i]);
AM_
Profil
unlucky:
mám řetězec ošetřený o strip tags. Když ale ukládám do databáze, tak se ukládá '
strip_tags() z funkce odstraní HTML tagy, s apostrofy to nemá nic společného.

zkousel jsem mysql real escape ... a html entiti decode, nic z toho nefunguje
První metoda je pro oescapování řetězce před uložením do MySQL databáze, html_entity_decode() je metoda pro zpětný převod HTML entit &kód; na znak touto entitou reprezentovaný. Pouze první z nich má co dočinění se zmiňovanými apostrofy, druhá vůbec.

Nicméně mysql_real_escape_string funguje,
mysql_real_escape_string("father's pen") vyplivne father\'s pen. Samozřejmě do databáze se to uloží bez lomítka, lomítko je řídící znak pro interpret SQL dotazů, nikoli něco, co se taky uloží.
Příště raději s dotazem do diskuse počkej na ráno, tohle vypadá, že už jsi vůbec nevěděl, o čem mluvíš.

//EDIT: aha, teď vidím tvůj kód. Konečně začalo být jasné, o čem mluvíš.
- pokud máš vstupní řetězec převedený na HTML entity, tak tyto entity musíš převést html_entity_decode dřív, než použiješ addslashes - protože jinak je při použití addslashes v kódu entita místo apostrofu a před ní se samozřejmě lomítko neuloží.

Tez jsem zkousel kombinace s html entti decode
escapovací funkce bys neměl "zkoušet", měl bys přesně vědět, v jakém formátu data očekáváš a jak je máš zpracovat.
unlucky
Profil
kdyz pouziju strip_tags, tak krome html tagu se mi prevedou i nebezpecne znaky do entit.
Pomoci htm decode se prevedou pouze urcite znaky, treba v mem pripade ten apostrov zustava stejny a zapisuje se do dtbze jako & x26 ; atd..

Mam retezec např.: <span class="neco">Father's pen & his pen</span>. Jak byste vsechno spravne zapisovali do databaze (pouze: Father's pen & his pen)? Pritom musim pouzit jako prvni strip_tags, aby se mi odstranilo spany.
lingvik
Profil
unlucky:
Funkce strip_tags znaky nepřevádí na entity. Kde se bere ten text, který chceš ošetřovat? Není to z nějakého javascriptového textového editoru ala Word? Nejsou znaky převedené na entity ještě před použitím funkce strip_tags?
AM_
Profil
unlucky:
Viděl jsi vůbec někdy dokumentaci?

kdyz pouziju strip_tags, tak krome html tagu se mi prevedou i nebezpecne znaky do entit.
ne nepřevedou.

Pomoci htm decode se prevedou pouze urcite znaky
ne nepřevedou.

Tedy já nevím, htm decode není ani funkce, protože je tam mezera, dokonce ani htm_decode není funkce. Mohl by ses alespoň pro začátek vyjadřovat přesně.
Nicméně ani html_entity_decode nepřevádí znaky na entity, ale dělá pravý opak (entity zpět na znaky). Číst dokumentaci, než něco použiju!

$stripped = strip_tags('<span class="neco">Father's pen & his pen</span>');
$escaped_for_sql = mysql_real_escape_string($stripped);
//ted to muzes ulozit do mysql

//pokud to chci po precteni z MySQL zobrazit:
$display = htmlspecialchars($nacteno_z_mysql);
unlucky
Profil
AM:
kdyz mi chces poradit, prosim te, porad mi neco, kde jsi tim jisty. Podle tveho kodu vidim hned na prvnim radku chybu. Co se tyce strip tagu a potom mysql escapem ... strip tags mi zmeni apostrov na entitu takze escape je tady k nicemu. Stejne jsem si to vyzkousel a vysledek stejny. V dtbzi porad entita

lingvik:
retezec mam z file get contents a jeste pred strip tagama jsou normalni. Žádná entita.
AM_
Profil
unlucky:
kdyz mi chces poradit, prosim te, porad mi neco, kde jsi tim jisty.
strip tags mi zmeni apostrov na entitu
Tak máš asi jiný strip_tags než já. Zviklal jsi mě natolik, že jsem si zkusil na localhostu spustit:
echo strip_tags("<span>father's pen</span>");

A co se nestalo? nic se nestalo, tedy alespoň s apostrofem se nic nestalo, je z něj stále apostrof. (I ve zdrojáku, nemysli si, že jsem jen koukal do prohlížeče na apostrof a říkal si, že se nic neoescapovalo :) )
Takže tím, co jsem říkal, jsem si nadále dost jistý, problém bude mezi tvojí klávesnicí a tvojí židlí.
unlucky
Profil
asi jsem se spatne vyjadril, kazdopadne po 5 hod googlovani jsem konecne nasel reseni

function unhtmlentities($string)
{
    
    $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
    $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
    $trans_tbl = get_html_translation_table(HTML_ENTITIES);
    $trans_tbl = array_flip($trans_tbl);
    return strtr($string, $trans_tbl);
}

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:

0