Autor | Zpráva | ||
---|---|---|---|
JardaB Profil |
#1 · Zasláno: 4. 9. 2018, 11:42:41
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 |
#3 · Zasláno: 4. 9. 2018, 12:08:23
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 |
#4 · Zasláno: 4. 9. 2018, 12:17:19
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 |
#5 · Zasláno: 4. 9. 2018, 12:43:38
Rozumím. Moc děkuji a jdu ihned vyzkoušet...
|
||
Kajman Profil |
#6 · Zasláno: 4. 9. 2018, 12:47:26
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 |
#8 · Zasláno: 4. 9. 2018, 15:21:30
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 |
#9 · Zasláno: 4. 9. 2018, 15:29:22
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 |
#10 · Zasláno: 4. 9. 2018, 15:39:16
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 |
#11 · Zasláno: 4. 9. 2018, 15:43:37
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 |
#13 · Zasláno: 4. 9. 2018, 15:54:00
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 |
#14 · Zasláno: 4. 9. 2018, 16:02:14
JardaB:
Co vypíše tohle? var_dump($data['color']); |
||
JardaB Profil |
#15 · Zasláno: 4. 9. 2018, 16:11:55
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 |
#17 · Zasláno: 4. 9. 2018, 17:23:39
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 |
#18 · Zasláno: 4. 9. 2018, 20:59:33
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. |
||
Časová prodleva: 6 let
|
0