Autor Zpráva
JardaB
Profil
Zdravím, potřebuji nastínit správný zápis vrácení dat javascriptu z PHP. Problém mi činí uvozovky.

nyní vracím následovně:

$fce = "changeT(`".$data[color]."`)";
$html .= "<img src='".$cesta."' onclick='".$fce.";' height='48' title='".$data[cname]."'>";
                        
 echo '{"data": "'.$html.'"}';

problém mi činí, když tam potřebuji použít více uvozovek. Použil jsem to takhle $fce = "changeT(`".$data[color]."`)"; Sice to funguje, ale přijde mi že to nemaká v IE. Když zkusím zápis \", tak mi to javascript nepřevezme.

$fce = "changeT(\"".$data[color]."\")"; - tohle prostě nejde
Radek9
Profil
JardaB:
Mícháš šílené množství různých uvozovek do sebe, přitom k tomu není důvod. Zpětné apostrofy (`) nefungují v IE, protože se jedná o poměrně novou fičuru.

V PHP se správně JSON generuje pomocí funkce json_encode. Obsah jednotlivých atributů bys měl ošetřovat pomocí funkce htmlspecialchars.

$fce = 'changeT(' . json_encode($data['color']) . ')'; // zakódování JS stringu
$html .= '<img src="' . htmlspecialchars($cesta) . '" onclick="' . htmlspecialchars($fce) . '" height="48" title="' . htmlspecialchars($data['cname']) . '">'; // ošetření atributů

echo json_encode(['data' => $html]); // zakódování JS objektu
JardaB
Profil
Díky, mrknu na to...
Tohle téma je pro mne relativně nové. Ty data v pak musím zpětně nějak dekodovat v javacriptu?
Ošetření atributů tam nemám, protože jde o data z dtb, kde byly již ošetřeny při vkládání. Navíc jde o data, která nevkládá běžný uživatel.
Radek9
Profil
JardaB:
Ty data v pak musím zpětně nějak dekodovat v javacriptu?
Ne. Z hlediska JS je to naprosto validní JSON. Funkce json_encode převede PHP datové typy na jejich ekvivalenty v JS (ve stringové podobě).

Ošetření atributů tam nemám, protože jde o data z dtb, kde byly již ošetřeny při vkládání.
Tam jde spíš o to, že ta data mohou obsahovat např. znaky ", &, < nebo >. A v tu chvíli máš problém, protože ti to rozbije HTML. Takže minimálně u toho volání JS funkce je to nutnost (jelikož json_encode vyplivne všechny stringy v klasických uvozovkách).
JardaB
Profil
Rozumím. Moc děkuji a jdu ihned vyzkoušet...
Kajman
Profil
JardaB:
Tohle téma je pro mne relativně nové.

V tom případě doporučuji phpfashion.com/escapovani-definitivni-prirucka
JardaB
Profil
Kajman:
Díky, tam je to opravdu srozumitelně uvedené...


Radek9:
echo json_encode(['data' => $html]);

tohle mi hlásí následující chybu: Parse error: parse error, expecting `')''
Radek9
Profil
JardaB:
Na jaké verzi PHP to pouštíš? Zřejmě není podporován zkrácený zápis pole. Tohle by mělo fungovat všude:
echo json_encode(array('data' => $html));
Keeehi
Profil
JardaB:
Buď máš někde jinde špatně uzavřené/neuzavřené závorky a parser došel až sem a teprve tady zahlásil chybu, nebo používáš opravdu archaickou verzi PHP 5.3 nebo dokonce starší která neznala tento zkrácený zápis polí. V tom případě by to chtělo updatovat na novější verzi. Verzi 5.3 už ani nenajdeš v tabulce s grafickým přehledem podpory verzí. Do konce roku ještě vydží 5.6 ale pokud už máš měnit verzi tak co momentálně dává smysl je 7.2. Verze 7.0 končí dříve než 5.6 a aktivní podpora 7.1 už je taky téměř u konce.
JardaB
Profil
Radek9:
echo json_encode(array('data' => $html));

tohle už je ok, nicméně mi to vrátí následující html:

<img src="textil/129-05-a.jpg" onclick="changeTextil(" 05")" height="48" title="Královská modrá">

to je přímo zkopírováno z elementu kam jsem to poté vložil. Jednak nevím proč je tam ta mezera před 05 a také nemyslím že to může fungovat. Hlásí to po kliknutí : Uncaught SyntaxError: Unexpected end of input
Kajman
Profil
JardaB:
Ukažte php kód s escapováním.

Pro kontrolu nepoužívejte procházení elementů v konzoli, ale přímo zdrojový kód vrácený na požadavek.

Místní zvýrazňovač kódu občas uvozovky upraví, lepší bude použít [prenone] a tim ho vypnout.
Radek9
Profil
JardaB:
nicméně mi to vrátí následující html:
Je to ze zdrojového kódu, nebo z developer tools? Pokud první možnost, tak jsi nepoužil funkci htmlspecialchars (viz [#2]).


Jednak nevím proč je tam ta mezera před 05
To už bude chyba na straně PHP (mimo zde uvedené kód). V tom stringu reálně ta mezera musí být. Funkce json_encode pouze string escapuje a obalí uvozovkami.

Hlásí to po kliknutí : Uncaught SyntaxError: Unexpected end of input
To zase bude problém funkce changeTextil v JS, nikoli problém PHP.
JardaB
Profil
Jasně to mi pak došlo, že když to zkopíruji přímo z elementu, tak ty uvozovky budou upraveny. To ale nevysvětluje tu mezeru před 05... Ten kód je přesně ten co tu už byl psán. Není v něm nic upraveno.

$fce = 'changeTextil(' . json_encode($data['color']) . ')'; // zakódování JS stringu
$html .= '<img src="' . htmlspecialchars($cesta) . '" onclick="' . htmlspecialchars($fce) . '" height="48" title="' . htmlspecialchars($data['cname']) . '">'; // ošetření atributů
 
echo json_encode(array('data' => $html));
 
Radek9
Profil
JardaB:
Co vypíše tohle?
var_dump($data['color']);
JardaB
Profil
již mi to jede. V kodu u sebe jsem neměl htmlspecialchars($fce), ale jen $fce
Opravdu bych nevěřil, že tam vzniknou znaky, které by bylo nutné ošetřit htmlspecialchars();

V původním kódu uvedeném na začátku to fungovalo i bez htmlspecialchars();
Radek9
Profil
JardaB:
Opravdu bych nevěřil, že tam vzniknou znaky, které by bylo nutné ošetřit htmlspecialchars();
No, třeba ty uvozovky, že. :-) To jsem ostatně psal již ve [#4], že v tomhle případě je to nutnost.

V původním kódu uvedeném na začátku to fungovalo i bez htmlspecialchars();
Samozřejmě. Protože se tam nepoužívaly uvozovky.
RastyAmateur
Profil
Jenom tak trochu mimo, nebylo by lepší si přes ten ajax posílat pouze ty proměnné ($cesta, $data['color'] a $data['cname']) a ten statický obsah (prvek img) vytvořit v javascriptu?
JardaB
Profil
RastyAmateur:
Možná je to z hlediska programování čistější řešení, ale já tady generuji cca 50 odkazů v rekurzi. Musel bych vracet nějaké pole proměnných a tam to opět cyklovat. Pro mě je čitelnější a použitelnější tohle.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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

0