Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][SQL] PDO - kilka pytań
desavil
post
Post #1





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Witajcie,

Postanowiłem przejść z mysql_query na PDO. Jestem w tym temacie jak nowy.
We większości poradników widzę podczas rozpoczęcia połączenia funkcję try{} oraz na końcu catch(){}
Czy jest to wymagane, czemu to służy?

W pliku z funkcjami mam połączenie z bazą po przez PDO:
  1. function con(){
  2. try{ $pdo = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); }
  3. catch(PDOException $e){ echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  4. }


Lecz po wykonaniu:
  1. $stmt = $pdo -> query('SELECT * FROM xxx WHERE xxx');
  2. foreach($stmt as $row){
  3. echo '<li>'.$row['nazwa'].': '.$row['opis'].'</li>';
  4. }

Dostaję błędy, że obiekt nie jest w klasie czy coś takiego, po przez brakujące try.
W jaki sposób dodać te try do zapytań?
A może po prostu w funkcji łączenia usunąć try i nie będzie problemu i nie będzie ono wymagane do zapytań?


Mam jeszcze jedno pytanie.
Jakich typów zapytać używać, co jest bezpieczniejsze, szybsze.
Typu:
  1. SELECT * FROM xx WHERE yy=zz

Czy:
  1. SELECT id,typ FROM xx WHERE yy=zz


Tak samo z dodawaniem rekordów używać:
  1. INSERT INTO produkty SET `nazwa`='nazwa', `opis`='opis'

Czy:
  1. prepare('INSERT INTO `produkty` (`nazwa`, `opis`) VALUES( :nazwa, :opis,)');


Cały czas w mysql_query używałem tych pierwszych, czy robiłem duży błąd jeżeli chodzi o bezpieczeństwo?

Pozdrawiam, i dziękuję za wszystkie odpowiedzi.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Podstawy podstaw. Funkcja musi zwracać obiekt klasy PDO czyli w twoim przypadku
  1. function conn()
  2. {
  3. // twój kod
  4. return $pdo
  5. }
  6.  
  7. $pdo = conn();
  8. $pdo->query('SELECT ..');
Go to the top of the page
+Quote Post
desavil
post
Post #3





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Na końcu zapytania dodałem
  1. $stmt -> closeCursor();


I...
Fatal error: Call to a member function closeCursor() on a non-object in
Go to the top of the page
+Quote Post
skowron-line
post
Post #4





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Zapytanie wykonuje się poprawnie (IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
desavil
post
Post #5





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Błąd był w zapytaniu, ale takie zapytanie chyba nie ma sensu, da się to zapisać inaczej?:
  1. $stmt = $pdo -> query('SELECT * FROM `users` WHERE `lol1`=\''.$lol1.'\' AND `lol2`=\''.$lol2.'\' AND `status`=\'1\' AND `country`=\'PL\'');

Czy tylko tak, jeżeli używam ', znów jak użyje "SELECT to przez " będzie znów mniej optymalne.

Macie jakieś pomysły?

Ten post edytował desavil 16.08.2011, 11:27:17
Go to the top of the page
+Quote Post
skowron-line
post
Post #6





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(desavil @ 16.08.2011, 10:38:30 ) *
Błąd był w zapytaniu, ale takie zapytanie chyba nie ma sensu, da się to zapisać inaczej?:
  1. $stmt = $pdo -> query('SELECT * FROM `users` WHERE `lol1`=\''.$lol1.'\' AND `lol2`=\''.$lol2.'\' AND `status`=\'1\' AND `country`=\'PL\'');

Czy tylko tak, jeżeli używam ', znów jak użyje "SELECT to przez " będzie znów mniej optymalne.

Macie jakieś pomysły?



  1. $stmt = $pdo -> query('SELECT * FROM `users` WHERE `lol1`="'.$lol1.'" AND `lol2`="'.$lol2.'" AND `status`=1 AND `country`="PL"');

bardziej optymalnie nie będzie. Intów się nie escapuje, bo to spowalnia zapytanie. Poczytaj na necie o optymalizacji zapytań.
Go to the top of the page
+Quote Post
desavil
post
Post #7





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Czyli, jeżeli zmienna $lol1 jest liczbą to w zapytaniu robię:
`lol1`='.$lol1.'

A jeżeli tekstem to:
`lol1`="'.$lol1.'"

Dobrze zrozumiałem?

PS. Dodatkowo jeżeli typ liczby jest: 12.45, to używam pierwszego, a jeżeli 12,34 to drugiego?

Z góry dziękuję za wszystkie odpowiedzi, były mi bardzo pomocne.
Pozdrawiam,

Ten post edytował desavil 16.08.2011, 11:56:09
Go to the top of the page
+Quote Post
skowron-line
post
Post #8





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


http://lmgtfy.com/?q=optymalizacja+zapyta%C5%84+sql
Go to the top of the page
+Quote Post
konole
post
Post #9





Grupa: Zarejestrowani
Postów: 275
Pomógł: 32
Dołączył: 21.03.2006
Skąd: Warszawa

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


Tak ciężko? http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO
Go to the top of the page
+Quote Post
desavil
post
Post #10





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Cytat(konole @ 16.08.2011, 14:36:29 ) *

Właśnie z tego cały czas korzystam, i całe to przeczytałem, czego Ty chyba nie zrobiłeś, a podajesz link (IMG:style_emoticons/default/smile.gif)
Temat jest całkiem o czymś innym.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 16:40