Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ucieczki w zapytaniach sql (poprzez PDO)
Forum PHP.pl > Forum > Bazy danych
jolam
Jak mogłabym zrobić ucieczkę od niedozwolonych znaków? Bo robię UPDATE do bazy i niektóre stringi zawierają jakieś sekwencje znaków, które skutecznie powodują błędy zapytania. Czyli muszę jakoś obejść te błędne fragmenty. Jak to zrobić? Dla PDO znalazłam quote ale nie bardzo chce mi działać, to znaczy nie wiem jak zadziałać tą funkcją quote na zmienną np $zmm tak, żeby potem mogła zrobić UPDATE i jak wartość podac właśnie $zmm.

Kolejna sprawa to jak ja odkręcę działanie tej lub innej funkcji? Bo w bazie muszę mieć w jakiś sposób przetworzone teksty właśnie z myśla o SQL. Ale jak bym chciała je pobrać z bazy i wyświetlić, albo edytować to pewnie by mi przeszkadzały te apostrofy (chyba apostrofy są wstawiane w tym uciekaniu w sql) I nie wiem jak to odkręcić.

pozdrawiam i bardzo proszę o pomoc Jola
jolam
Już zabieram się do rozgryzania tego, rozumiem, że ta funkcja przerobie mój tekst do takiej postaci, żeby dało się go dodać do bazy? Czy można tej funkcji używać bez prepare, bo tego jeszcze nie umiem? A ja potrzebuje tylko na zmienną z tekstem nią zadziałać i potem dodać go do bazy.

Jola
Quantum
musi być z prepare, czego tu sie uczyć ? smile.gif
jolam
Nie wszystko na raz, jednocześnie! Nie dam sobie rady. Próbuję użyć tego bindvalue ale mi nie wychodzi. Czy jest inny sposób na poprawieni tekstu w zmiennej? Czy może chodzi o nie poprawianie tekstu w zmiennej ale tylko o poprawianie go na chwile w zapytaniu? Tak czy siak to nie działa mi sad.gif sadsmiley02.gif

Jola
wookieb
Przecież pisze jak wół w przykładzie co masz zrobić. Manual sam za ciebie tego nie napisze. Pokaż jak robisz.
Quantum
  1. $userid = 123;
  2. $content = 'zawartosc komentarza';
  3.  
  4. $stmt = $dbh->prepare('insert into comments (userid, content) values (?,?)');
  5. $stmt->bindParam(1, $userid, PDO::PARAM_INT);
  6. $stmt->bindParam(2, $content, PDO::PARAM_STR);
  7. $stmt->execute();
  8.  
  9. można i tak:
  10.  
  11. $stmt = $dbh->prepare('insert into comments (userid, content) values (:userid,:content)');
  12. $stmt->bindValue(':userid', $userid, PDO::PARAM_INT);
  13. $stmt->bindValue(':content', $content, PDO::PARAM_STR);
  14. $stmt->execute();
  15.  


questionmark.gif blinksmiley.gif a i uprzedzę następne pytanie bindParam działa tylko ze zmiennymi, gdyż używa referencji, a do bindValue możesz dawać i zmienne i wartości, także używaj tego co będzie Ci w danym momencie potrzebne winksmiley.jpg mam nadzieję, że coś wytłumaczyłem, a jak nie to pozostaje jeszcze książka, google, manual.. laugh.gif
nospor
@sniffer32 a czym sie rozni podany przez ciebie kod od tego ktory tu już padł w linku do manualu?
jolam
Próbowałam jeszcze z guote, bo wydawało mi się prostsze:

$aa = $dbh -> quote( $text );
echo $aa;
$sql1233 = "
UPDATE tab
SET opis_pl = '$aa'
WHERE id = '$id'
";
$dbh -> exec( $sql1233 );

ale nie wyszło, bład się pojawił sad.gif

Ale muszę powiedzieć: sniffer32 jesteś kochany! to z bindvalue DZIAŁA!
Nawet nie wiesz jak bardzo się cieszę. Trochę to zagmatwane ale działa a to najważniejsze.
Czy mógłbyś zerknąć również na ten kod z quote? Czemu on nie działa? Bo nie mogę ukryć, że jak na razie to całe prepare i bindvalue troszkę mnie przytłacza i ilością kodu i w ogóle. Może jest jest jeszcze jakieś inne rozwiązanie?




pozdrawiam najserdeczniej
Jola
nospor
Cytat
Ale muszę powiedzieć: sniffer32 jesteś kochany! to z bindvalue DZIAŁA!

przeciez dokladnie to samo mialas w linku co dostalas na samym początku. przykladaj uwagę do tego co ci ludzie dają, bo w przeciwnym wypadku moderatorzy podejmą stosowne kroki*


*pójdą sobie na piwo.... winksmiley.jpg
jolam
nospor teraz to i ja taka mądra jestem smile.gif Ale jak wpatrywałam się w ten manual to ni w ząb nie umiałam sobie tego przerobić sad.gif Teraz się zastanawiam jak przerobić ten sposób z quotes żeby zadziałał. Bo to nie daje mi spokoju. Gdzieś mam błąd ale nie potrafiłam go znaleźć. Może widzisz co powinnam poprawić?

pozdrawiam Jola
Quantum
Cytat(jolam)
ale nie wyszło, bład się pojawił


to wstaw jego zawartość tutaj, nie mamy parserów w głowach tongue.gif
wookieb
A $id skąd masz? Z czytanki?
wyswietl sobie zapytanie i wklej tutaj to bedziesz wiedziała jaki jest błąd.
jolam
Taki mam błąd (wycięłam ścieżkę do skryptu bo była bardzo długa):

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1 near "jest": syntax error' in TUTAJ_SCIEZKA_DO_SKRYPU:245 Stack trace: #0 TUTAJ_SCIEZKA_DO_SKRYPU(245): PDO->exec('?questionmark.gif?UPDATE tab..') #1 {main} thrown in TUTAJ_SCIEZKA_DO_SKRYPU on line 245

A $id mam z wcześniejszej cześć skryptu. I to akurat jest na pewno dobrze. Problem jest z zawartością tego co jest w $aa. Bo jeśli $aa='abc'; to wtedy jest ok. Macie jakiś pomysł co tu może być źle?

pozdrawiam serdecznie Jola
wookieb
A o co my prosiliśmy? O wyświetlenie zapytania czyli twojego $sql1233
jolam
wookieb ale w zapytaniu będzie cała treść artykułu, czyli to będzie bardzo długie. Chyba działanie funkcji nie powinno zależeć od treści artykułu?

Zmieniłam treść wstawiając jedno zdanie tylko. Teraz zmienna $text='Drzeworyt jest jedną z technik druku wypukłego.';
wyświetlenie zapytania sql :
UPDATE tab SET opis_pl = ''Drzeworyt jest jedną z technik druku wypukłego.'' WHERE id = '1000'

błąd jest tak
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1 near "Drzeworyt": syntax error' in TUTAJ_SCIEZKA_DO_SKRYPU:247 Stack trace: #0 TUTAJ_SCIEZKA_DO_SKRYPU(247): PDO->exec('?questionmark.gif?UPDATE tab...') #1 {main} thrown in TUTAJ_SCIEZKA_DO_SKRYPU on line 247

czy teraz będziesz potrafił mi pomóc?

pozdrawiam serdecznie Jola

nospor
nie: SET opis_pl = '$aa'
a: SET opis_pl = $aa
jolam
Za raz sprawdzę. Ale wydaje mi się to dziwne, bo jesli mam zapytanie
"
UPDATE tab
SET opis_pl = '$aa'
WHERE id = '$id'
"
to czemu raz zmienne mają być w apostrofach ('$id') a raz nie ($aa). Na czym to polega, od czego zależy? Może powinnam jakoś inaczej używać cudzysłowów i apostrofów w zapytaniach? Wytłumaczysz mi to, proszę?

pozdrawiam Jola

Zadziałało! Ale teraz to już zgłupiałam zupełnie! O co chodzi z tym brakiem apostrofów. Domyślam się, że funkcja quoted dodaje właśnie owe apostrofy, co może powodować te kłopoty, z którymi się zmagałam. Czy zamiast tego gdybym miała
'
UPDATE tab
SET opis_pl = "$aa"
WHERE id = "$id"
'
to byłoby dobrze?
nospor
Cytat
Domyślam się, że funkcja quoted dodaje właśnie owe apostrofy
nie ma co sie domyslic. to jest czarno na bialym napisane w manualu przy opisie funkcji quote.

Cytat
Czy zamiast tego gdybym miała
'
UPDATE tab
SET opis_pl = "$aa"
WHERE id = "$id"
'
to byłoby dobrze?
Nie. wowczas wlozysz tekst, ktory bedzie mial w sobie apostrofy. A chyba chcesz wlozysz tekst bez apostrofow
jolam
No masz racje chciałabym włożyć tekst bez apostrofów, żebym później nie musiała ich usuwać. A czy da się jakoś tak używać cudzysłowów i apostrofów, żeby nie trzeba było z okazji użycia funkcji quote usuwać apostrofy przy zmiennych w zapytaniu sql? Chodzi mi o takie bardziej uniwersalne rozwiązanie. Proszę poradź mi.

pozdrawiam serdecznie Jola
nospor
uzywasz PDO tak? Tak. To uzywaj go w pelni tak jak go stworzono i bedziesz miala zawsze jeden mechanizm i sie nigdy nie pomylisz.

Poza tym jak cos jest ID to pewnie to liczba i nie powinno sie tego wogole brac w apostrofy.
Fifi209
W PDO masz:
prepare, które łączysz z bindValue lub bindParam i wtedy nie musisz używać apostrofów.
jolam
Zapomniałm o tym $id, czyli liczbie, której nie muszę dawać w " albo '.

Tak używam PDO i właśnie na stronie http://pl.php.net/manual/pl/book.pdo.php
znalazłam tą funkcję quote. Ona jest gorsza niż to rozwiązanie z prepare i bindvalue? Myślałam, że oba należą do PDo i są równie dobre. A przyznać muszę, że to rozwiązanie z quote jest prostsze dla mnie i mniej kodu zajmuje.

pozdrawiam serdecznie Jola
Fifi209
One służą moim zdaniem do czegoś innego...
Poczytaj o bindValue i się przekonasz. Automatycznie zabezpieczy Cię przez SQLi etc.
nospor
Cytat
Ona jest gorsza niż to rozwiązanie z prepare i bindvalue?

http://pl2.php.net/manual/pl/pdo.quote.php
Cytat
If you are using this function to build SQL statements, you are strongly recommended to use PDO::prepare() to prepare SQL statements with bound parameters instead of using PDO::quote() to interpolate user input into a SQL statement. Prepared statements with bound parameters are not only more portable, more convenient, immune to SQL injection, but are often much faster to execute than interpolated queries, as both the server and client side can cache a compiled form of the query.
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.