Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> & w zapytaniu, zagadka, problem ze znakiem ampersand, zagadka
10valuebackup@gm...
post 25.01.2012, 03:13:51
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 &.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
Uriziel01
post 25.01.2012, 07:55:23
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.
Go to the top of the page
+Quote Post
viking
post 25.01.2012, 07:58:31
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


--------------------
Go to the top of the page
+Quote Post
vee
post 25.01.2012, 14:45:49
Post #4





Grupa: Zarejestrowani
Postów: 64
Pomógł: 5
Dołączył: 16.08.2011

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


Pokaż jak wykonujesz zapytanie.

Na pewno "zbierasz" te dane w apostrofy/cudzysłów?
  1. ... WHERE title='&&&&&';


Ten post edytował vee 25.01.2012, 14:46:07
Go to the top of the page
+Quote Post
10valuebackup@gm...
post 25.01.2012, 16:21:31
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 25.01.2012

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


Cytat(Uriziel01 @ 25.01.2012, 07:55:23 ) *
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.

Go to the top of the page
+Quote Post
Uriziel01
post 25.01.2012, 17:04:34
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
Go to the top of the page
+Quote Post
nospor
post 25.01.2012, 17:07:18
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
tak z ciekawości, co zwraca:
Kod
pg_query("'" . $zapytanie . "'")
A co ma zwracac? Przecież to błąd jest.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Uriziel01
post 25.01.2012, 17:23:52
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.
Go to the top of the page
+Quote Post
nospor
post 25.01.2012, 17:25:37
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ł wink.gif

Cytat
Interpreter jest czasami tak inteligentny że wszystko jest możliwe.
A to wyjasnienie jest satysfakcjonujące smile.gif

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

Go to the top of the page
+Quote Post
10valuebackup@gm...
post 26.01.2012, 03:43:19
Post #10





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 25.01.2012

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


Cytat(Uriziel01 @ 25.01.2012, 17:04:34 ) *
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
Go to the top of the page
+Quote Post
d3ut3r
post 26.01.2012, 06:52:21
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!
Go to the top of the page
+Quote Post
viking
post 26.01.2012, 07:11:11
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


--------------------
Go to the top of the page
+Quote Post
by_ikar
post 26.01.2012, 08:31:03
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:

  1. $nazwa='You & me';
  2.  
  3. $query1= 'select * from tabela where nazwa="'.$nazwa.'";';
  4. $query2= 'select * from tabela where nazwa="'.pg_escape_string($nazwa).'";';


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
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 Wersja Lo-Fi Aktualny czas: 19.07.2025 - 06:45