Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: & w zapytaniu, zagadka
Forum PHP.pl > Forum > PHP
10valuebackup@gmail.com
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 &.
Uriziel01
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.
viking
Jest. Strzelam że będzie mysql http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html
vee
Pokaż jak wykonujesz zapytanie.

Na pewno "zbierasz" te dane w apostrofy/cudzysłów?
  1. ... WHERE title='&&&&&';
10valuebackup@gmail.com
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.

Uriziel01
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 . "'")
nospor
Cytat
tak z ciekawości, co zwraca:
Kod
pg_query("'" . $zapytanie . "'")
A co ma zwracac? Przecież to błąd jest.
Uriziel01
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.
nospor
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ć
10valuebackup@gmail.com
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
d3ut3r
w manualu znalazłem info że bardziej zaleca się używanie:

pg_escape_literal

być może to rozwiąże twój problem.
viking
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.
by_ikar
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.