![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 25.01.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Mam dziwny (dla mnie) problem. Sklejam sobie zapytanie SQL w PHP. Zapytanie zawiera znak & (bo mam takie wartości w bazie). Zapytanie nie działa. Robię echo $zapytanie. Kopiuje je z ekranu i przypisuję z powrotem (na sztywno) jeszcze raz do $zapytanie. Działa! No i w czym problem? Wiem tylko, że występuje tylko w przypadku stringów zawierających znak &. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 307 Pomógł: 37 Dołączył: 9.11.2010 Skąd: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Nie widzę powodu aby ampersand miał być jakimś nietypowym znakiem w SQLu, możesz proszę pokazać przykładowe działające oraz przykładowe nie działające zapytanie, inaczej strzelamy tutaj na oślep.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Jest. Strzelam że będzie mysql http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html
-------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 64 Pomógł: 5 Dołączył: 16.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 25.01.2012 Ostrzeżenie: (0%) ![]() ![]() |
Nie widzę powodu aby ampersand miał być jakimś nietypowym znakiem w SQLu, możesz proszę pokazać przykładowe działające oraz przykładowe nie działające zapytanie, inaczej strzelamy tutaj na oślep. Bo nie jest nietypowym znakiem w SQL. Właściwie sam SQL tu chyba nie ma nic do rzeczy. Problem leży raczej na poziomie samego PHP. Nie mogę wkleić 2 zapytań (działającego i niedziałającego), bo na ekranie to one są identyczne! To jest tak: zapytanie = tresc sql z ampersandem; pg_query (zapytanie) = error bazy; echo zapytanie; CTRLC+CTRLV; zapytanie = 'CTRLC+CTRLV'; pg_query (zapytanie) = DZIAŁA!; //Dokładny kod mogę wkleić dopiero wieczorem, ale logika jest taka jak powyżej. Thnx all za zaintertesowanie. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 307 Pomógł: 37 Dołączył: 9.11.2010 Skąd: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
No widzisz tylko że akurat SQL jest językiem interpretowanym przez wyrażenia regularne przez co wszelkie znaki specjalne mają istotny wpływ na wynik. Mi dokładniej chodziło o `tresc sql z ampersandem` pozwoli to łatwo sprawdzić czy jest tam jakiś problem z treścią zapytania czy też problem leży po stronie PHP.
EDIT: A tak z ciekawości, co zwraca: Kod pg_query("'" . $zapytanie . "'")
Ten post edytował Uriziel01 25.01.2012, 17:05:48 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat tak z ciekawości, co zwraca: A co ma zwracac? Przecież to błąd jest.
Kod pg_query("'" . $zapytanie . "'") -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 307 Pomógł: 37 Dołączył: 9.11.2010 Skąd: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Interpreter jest czasami tak inteligentny że wszystko jest możliwe.
P.s-Chyba że chodzi ci o brak uchwytu do połączenia ? Jeżeli tak, no to chyba wiadomo że błąd celowy. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat P.s-Chyba że chodzi ci o brak uchwytu do połączenia ? Jeżeli tak, no to chyba wiadomo że błąd celowy. No teraz chyba ty mnie masz za debila/głupka/ciote, ze myślisz, że takiej pierduły bym się czepiał ![]() Cytat Interpreter jest czasami tak inteligentny że wszystko jest możliwe. A to wyjasnienie jest satysfakcjonujące ![]() Tak czy siak musimy czekać na pełne zapytanie od autora tematu. Nie ma co zgadywać/wróżyć -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 25.01.2012 Ostrzeżenie: (0%) ![]() ![]() |
No widzisz tylko że akurat SQL jest językiem interpretowanym przez [...] Dobra. Metodą prób i błędów znalazłem przyczynę, ale dalej nic z tego nie rozumiem. Doszedłem do tego, że problem jest wtedy kiedy wartości dla zapytania SQL są przepuszczane przez pg_escape_string. Muszą być, bo zawierają też apostrofy jako treść. Czyli nie ma co wklejać kodu, bo ten kod to pg_escape_string($string) z konkatenacją reszty SQL. Bez pg_escape_string działa (no wtedy nie działają dane z apostrofem, co by była równowaga w przyrodzie). I teraz mi wytłumaczcie dobrzy ludzie, dlaczego: - pg_escape_string($string) robi cokolwiek ze znakiem ampersand w $stringu? (dla sql to jest znak bez znaczenia)? - dlaczego tej zmiany nie widać na ekranie ("echo $string" wyświetla dokładnie to samo, co echo "pg_escape_string($string)" jeśli chodzi o &, chociaż jedno działa a drugie nie działa)? - WTF? Reasumując: dla $nazwa='You & me'; $query1= "select * from tabela where nazwa='".$nazwa."';"; (mniejsza o cudzysłowy) $query2= "select * from tabela where nazwa='".pg_escape_string($nazwa)."';"; // echo query1 i echo query2 wyświetlą dokładnie to samo na ekranie i zapytanie to zadziała uruchomione bezpośrednio na bazie, // ale uruchomione z poziomu PHP poprzez pg_query zadziała tylko to pierwsze. //czemu? uff |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 709 Pomógł: 176 Dołączył: 24.10.2010 Ostrzeżenie: (0%) ![]() ![]() |
w manualu znalazłem info że bardziej zaleca się używanie:
pg_escape_literal być może to rozwiąże twój problem. -------------------- http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
A jeszcze lepiej przerzuć się na PDO i stosuj prepared statements. Najwyraźniej wszyscy mają gdzieś mój post o funkcjach bitowych na bazach jeśli ciąg będzie źle łączony. A jak wygląda zapytanie nie wiemy tylko zgadywanie.
PS. Spróbuj jeszcze zrzutować na stringa 'aaa'::string i zobacz co będzie. Ten post edytował viking 26.01.2012, 07:12:41 -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
IMO no właśnie, wszędzie używasz apostrof, a w takiej apostrofie to nie trudno o problem, wystarczy że znajdzie się w stringu znak dolara i już mogą być jazdy. Jeżeli nie potrzebujesz dodawać do ciągu zmiennej bez apostrofu/cudzysłowia, a wierz mi że nie potrzebujesz praktycznie w żadnym przypadku, to używaj cudzysłowia. Wtedy parser nie będzie ci zawartości twojego stringa pod żadnym kontem parsować, tylko od razu przepuści.
Spróbuj tak, i powiedz jakie będą tego efekty:
Oczywiście tam pod $nazwa, podstaw to co masz oryginalnie, pozamieniaj tylko apostrofy na cudzysłowia i cudzysłowia na apostrofy. Jak używasz jakiegoś ludzkiego edytora, to możesz to zrobić jednym kliknięciem w całym kodzie. Ten post edytował by_ikar 26.01.2012, 08:31:52 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 06:45 |