Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> działanie apostrofu
c4ld3ra
post
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 1.12.2009

Ostrzeżenie: (0%)
-----


Wiatm, mam pytanie do znawców baz danych, gdy do zapytania dorzucam pojedynczy apostronf np.: SELECT * FROM tabela WHERE pole= 'wartosc'' ; , bądź gdziekolwiek ich nieparzystą liczbe do otrzymuje komunikat o błędzie syntaktycznym a kiedy dorzucam parzysta liczbe apostroafów to po prostu mam np.: brak wyników wyszukiwania. Mógły by ktoś mnie nakierowac na informacje dlaczego parzyta liczba apostrofów nie wywołyje błędu synkatycznego, jak sie zachowóje silnik bazodanowy. Z góry wielki dzienki.

Ten post edytował c4ld3ra 19.12.2011, 15:37:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Nie jestem pewien czy to takie proste - ale z tego co piszesz jako "nieparzystą" liczbę apostrofów rozumuję jako błąd.

AFAIK apostrofy zawsze powinny występować w parach stąd też - nieparzyście to błąd - wyjątkiem są oczywiście escapowane apostrofy...

Co do samego działania zasada jest chyba dość prosta - jeśli w zapytaniu wstawisz gdzieś apostrof - silnik domyśla się, że będziesz w nim wpisywał jakieś słowo klucz - nazwę tablicy, pola itp. czeka zatem na jego zakończenie. Jesli dorzucisz jakieś dwa apostrofy po sobie w zapytaniu silnik spróbuje wyciągnąć z nich jakąś nazwę - jeśli mu się uda i coś będzie nie grało to wywali błąd ale nie syntaktyczny a brak pola o podanej nazwie lub coś w tym rodzaju. Jeśli zaś apostrofy są puste to nie jest to błąd syntaktyczny smile.gif składnia się zgadza poniekąd - natomiast umieszczenie apostrofów w różnym miejscu może dać różne rezultaty. Na przykład:

  1. SELECT * FROM `tabelka`


i

  1. SELECT * FROM `tabelka` ``


Da ten sam wynik ale dokładanie większej liczby apostrofów nawet parami może przynieść dziwne rezultaty - w końcu SQL uzna, że coś w miejscu tych apostrofów powinno być i może wówczas wywalić błąd składni - na przykład:

  1. SELECT `` * FROM `tabelka`


w tym momencie zamiast `` powinna być nazwa pola - nie ma jej więc to błąd składni itd...

Ciekawe pytanie w ogóle - skąd takie?


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Shili
post
Post #3





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

Ostrzeżenie: (0%)
-----


@up
Znak ` to nie jest apostrof smile.gif

W apostrofie wpisujemy ciągi znaków (stringi). Otwarty apostrof (najprościej) oznacza, że baza danych spodziewa się ciągu znaków i zamykającego apostrofa; nie ma - błąd

znak ` to grawis lub backquote. Dużo osób myli te dwa znaki smile.gif
Grawis ogólnie służy do tego, aby w nazwach tabel i kolumn była możliwość umieszczenia słowa zastrzeżonego SQL

http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html

  1. SELECT usage FROM statistics
wygeneruje błąd, bo usage jest słowem zastrzeżonym
natomiast
  1. SELECT `usage` FROM statistics
już błędu nie wygeneruje.

Ale oczywiście zgadzam się
Cudzysłowie proste, apostrofy i grawisy powinny występować parami. Chyba że są escape'owane.
Go to the top of the page
+Quote Post
c4ld3ra
post
Post #4





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 1.12.2009

Ostrzeżenie: (0%)
-----


Szukam informacji jak sie zachowuje silnik BD gdy napotka np.:
  1. 'aaa' ''
bo wtedy nie otrzymuje żdanego komunikatu o błędzie, tylko ze w bazie nie ma takich danych, czy pomiedzy takimi dwoma parami apostrofów, zawierającymi jakieś dane lub nie zachodzi jakaś niejawna konkatenacja i dwa ciagi sa traktowane są jako jeden? A co do pytania Sephirusa skąd takie pytanie to po prostu natrafiłem na zagadnienie i mnie zaciekawiło dlaczego smile.gif .
Go to the top of the page
+Quote Post
barcisz
post
Post #5





Grupa: Zarejestrowani
Postów: 41
Pomógł: 12
Dołączył: 8.04.2011

Ostrzeżenie: (0%)
-----


Podwójny apostrof wewnątrz stringa działa jak escapowanie pojedynczego apostrofu. Najlepiej to sprawdzić zapytaniem:

  1. SELECT 'ab''a'


Zwróci nam wynik:

ab'a
Go to the top of the page
+Quote Post
c4ld3ra
post
Post #6





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 1.12.2009

Ostrzeżenie: (0%)
-----


Cytat(barcisz @ 21.12.2011, 13:08:38 ) *
Podwójny apostrof wewnątrz stringa działa jak escapowanie pojedynczego apostrofu. Najlepiej to sprawdzić zapytaniem:

  1. SELECT 'ab''a'


Zwróci nam wynik:

ab'a

W moim przykładzie jest odstęp pomiędzy kolejnymi apostrofami, wiec sie nie wyeskejpują, szukam informacji jak sie traktowane są tego rodzaju ciągi znaków.
Go to the top of the page
+Quote Post
Shili
post
Post #7





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

Ostrzeżenie: (0%)
-----


Zachodzi konkatenacja.

'a' 'b' da Ci ciąg ab

Z tym że:

'ab' '' również powinno zwrócić ab.

Więc:
  1. SELECT * FROM tabela WHERE name = 'marysia'

=
  1. SELECT * FROM tabela WHERE name = 'mar' 'ysia'


Przynajmniej w teorii.
U mnie działa zupełnie poprawnie. Żadnego braku nie stwierdziłam.
Go to the top of the page
+Quote Post
toaspzoo
post
Post #8





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


zamieniaj ' na \'


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 21:24