Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] PDO - kilka pytań
Forum PHP.pl > Forum > Przedszkole
desavil
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.
skowron-line
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 ..');
desavil
Na końcu zapytania dodałem
  1. $stmt -> closeCursor();


I...
Fatal error: Call to a member function closeCursor() on a non-object in
skowron-line
Zapytanie wykonuje się poprawnie questionmark.gif
desavil
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?
skowron-line
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ń.
desavil
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,
skowron-line
http://lmgtfy.com/?q=optymalizacja+zapyta%C5%84+sql
konole
Tak ciężko? http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO
desavil
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 smile.gif
Temat jest całkiem o czymś innym.
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.