![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 230 Pomógł: 3 Dołączył: 8.01.2008 Ostrzeżenie: (10%) ![]() ![]() |
Witam!
Ostatnio przeszedłem z AdoDB na PDO. Napisałem (z pomocą tutejszych forumowiczów (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ) taką klasę: Kod <?php class Database{ protected $db; public function __construct(){ $this->db=new Pdo('mysql:host=localhost;dbname=siatka','root','jo'); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } public function sql($query,$return='exec',$binds=null){ $sql=$this->db->prepare($query); if($binds!=null){ if(is_array($binds)){ foreach($binds as $n => $bind) $sql->bindValue(($n+1), $bind); } else $sql->bindValue(1, $binds); } if($sql->execute()){ # włączenie tablic jedynie asocjacyjnych # if($return!='exec') $sql->setFetchMode(PDO::FETCH_ASSOC); switch($return){ case 'all': return $sql->fetchAll(); break; case 'one': return $sql->fetchColumn(); break; case 'row': return $sql->fetch(); break; case 'id': return $this->db->lastInsertId(); break; } } else return false; } } $db=new Database();?> No i teraz, jeżeli np. z tabeli users chcę pobrać wiersz, gdzie login = $_POST['login'], piszę takie coś: Kod <?php $db->sql("SELECT * FROM users WHERE login=?","row",$_POST['login']);?> . Dla rodzaju returnowania exec - nic nie jest zwracane. Służy to tylko do wykonywania działań na bazie: insert, update, delete.Zamierzałem jakoś zoptymalizować tą klase - tj. rozbić jakoś rodzaj returnowania, zrobić osobne funkcje na returnowanie wiersza, wszystkiego, rekordu... Wtedy aby pobrać wiesz, napisalibyśmy np. $db->getRow("SELECT * FROM users WHERE id=1"). Proszę o jakieś pomysły jak tą klasę nieco zoptymalizować (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Może macie jakieś swoje, z których korzystacie? Albo jakieś gotowe klasy, które można pobrać z neta? Ten post edytował nospor 17.11.2008, 13:23:37 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 230 Pomógł: 3 Dołączył: 8.01.2008 Ostrzeżenie: (10%) ![]() ![]() |
Zmodyfikowałem klasę co do wyjątków:
Kod <?php class Database{ protected $db; public function __construct(){ $this->db=new Pdo('mysql:host=localhost;dbname=siatka','root','jo'); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } public function exec($query, $binds=null){ try{ $sql=$this->db->prepare($query); if($binds!==null){ if(is_array($binds)){ foreach($binds as $n => $bind) $sql->bindValue($n+1,$bind); } else $sql->bindValue(1,$binds); } $sql->execute(); } catch(PDOException $e){ $_SESSION['mesg']='Wystapil bląd biblioteki PDO: '.$e->getMessage(); } return $sql; } public function getAll($query, $binds=null){ $sql=$this->exec($query,$binds); return $sql->fetchAll(); } public function getRow($query, $binds=null){ $sql=$this->exec($query,$binds); return $sql->fetch(); } public function getOne($query, $binds=null){ $sql=$this->exec($query,$binds); return $sql->fetchColumn(); } public function insertId($query, $binds=null){ $sql=$this->exec($query,$binds); return $this->db->lastInsertId(); } } $db=new Database();?> W $_SESSION["mesg"] przechowuje tymczasowe komunikaty, które później ładowane są na stronę. Nic nie szkodzi, że returnuje $sql poza try{}catch{}? Bo wsadzając return $sql w try{}, funkcja mi nic nie zwróci. Jeżeli jest błąd, to execute() wywali false, ale jeżeli go drugi raz wywołam, to chyba drugi raz się wykona, tak? Jakbym dał tak: Kod try{ $sql=$this->db->prepare($query); if($binds!==null){ if(is_array($binds)){ foreach($binds as $n => $bind) $sql->bindValue($n+1,$bind); } else $sql->bindValue(1,$binds); } $sql->execute(); } catch(PDOException $e){ $_SESSION['mesg']='Wystapil bląd biblioteki PDO: '.$e->getMessage(); } if($sql->execute()) return $sql; To zapytanie $sql ponownie wykona się na bazie? [EDIT] Co do podawania danych do połączenia, tak zmieniłem początek klasy Database: Kod class Database{ protected $db; public function connect($engine,$host,$user,$pwd,$dbname){ $this->db=new Pdo($engine.':host='.$host.';dbname='.$dbname,$user,$pwd); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } ... I teraz na początku index'u wypisujemy takie coś: Kod <?php #wrzucenie klasy Database require_once 'inc/db.php'; $db=new Database(); $db->connect('mysql','localhost','root','haslo','nasza_baza');?> I działa, dzięki za sugestie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Ten post edytował Apocalyptiq 18.11.2008, 12:12:47 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 09:00 |