Autor Zpráva
midlan
Profil
Zdravím,
chci se zeptat proč escapovací funkce v pro MySQL v PHP přidávají zpětné lomítko i před uvozovky (") ?
Alphard
Profil
Proč by neměly? Jsou to znaky se zvláštním významem, stejně jako jiné.
juriad
Profil
http://dev.mysql.com/doc/refman/5.1/en/string-literals.html
A string is a sequence of bytes or characters, enclosed within either single quote (“'”) or double quote (“"”) characters.
midlan
Profil
Alphard, juriad:
Tím se vysvětluje proč je uvozovka taky escapovaná, ale nechápu jaktože se mi do databáze neuloží i to lomítko? To s tím tvůrci počítali předem?
EDIT: aha už to chápu, když zpětné lomítko nescapuji tak bude ignorováno, když za ním není speciální znak.
juriad
Profil
Protože je to tak navržené, pročti si odkázanou stránku; obzvlášť okolí tabulky 9.1

Abys uložil zpětné lomítko, musíš ho napsat dvakrát za sebou. To také escapovací funkce dělají.
midlan
Profil
juriad:
Abys uložil zpětné lomítko, musíš ho napsat dvakrát za sebou.
Tohle mi je známo i z PHP (a ostatních jazyků), ale PHP když nenajde za neescapovaným lomítkem speciální znak, tak s lomítkem zachází jako kdyby escapované bylo, právě jsem si myslel že v MySQL to bude taky tak.
Tori
Profil
midlan:
právě jsem si myslel že v MySQL to bude taky tak.
Je to přesně tak. Pro MySQL jsou uvozovky / apostrofy specielní znak. V různém kontextu můžou být specielní různé znaky. Berte v úvahu, že ten řetězec se vyhodnocuje několikrát - jak v PHP, tak v MySQL.
edit: opravena blbost.
midlan
Profil
Tori:
Je to přesně tak.
Právě, že není.

Narážel jsem hlavně na to, že v PHP (a snad ve všech ostatních jazycích) kód
<?php
echo 'dnes je \hezky';
vypíše dnes je \hezky, tedy to samé jako kdybych použil escapované lomítko (správné řešení)
<?php
echo 'dnes je \\hezky';
protože h není speciálním znakem.

V tomhle se mysql chová jinak, SELECT 'dnes je \hezky' vypíše dnes je hezky, kdežto SELECT 'dnes je \\hezky' vypíše dnes je \hezky
Tori
Profil
midlan:
Omlouvám se za dezinformace, máte pravdu samozřejmě.
Majkl578
Profil
midlan:
protože h není speciálním znakem.
I kdyby byl, nemělo by to efekt, protože řetězec je v apostrofech. Vždy by se tedy vypsalo \hezky (resp. tedy např. \novinka).

tedy to samé jako kdybych použil escapované lomítko (správné řešení)
Správné by bylo v případě použití uvozovek. U apostrofů nikoliv, jelikož u nich se escape sekvence neprovádí.
Jan Tvrdík
Profil
midlan:
a snad ve všech ostatních jazycích
Jen doplním, že ve striktnějších jazycích (jako třeba C#) to s tím jedním lomítkem rozhodně neprojde právě proto, že \h je nevalidní escape sekvence.

Moje osobní doporučení je escapovat zpětné lomítko vždy ve dvojitých uvozovkách. V apostrofech jen, je-li to potřeba.

Majkl578:
U apostrofů nikoliv, jelikož u nich se escape sekvence neprovádí.
Je to správné řešení je to i u apostrofů. Rozdíl je v tom, že u apostrofů není to předchozí řešení špatné.
midlan
Profil
Jan Tvrdík:
Moje osobní doporučení je escapovat zpětné lomítko vždy ve dvojitých uvozovkách. V apostrofech jen, je-li to potřeba.
Už jsem si navyknul escapovat přesně tak jak se má, protože dost často používám regulární výrazy.

Děkuji všem za objasnění.

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: