PHP třída pro připojení k postgreSQL
by LucaS on Dec.21, 2008, under PHP
Nechci zde psát žádný seriál. Takových je na internetu mraky a pokud se někdo chce opravdu učit nějaký programovací nebo skriptovací jazyk, měl by investovat to knížky a rozhodně nešetřit korunou navíc. Nešetřit říkám záměrně, protože mezi chytrými knížkami jsou i ty ostatní s názvem “programátorem za 20 dní…”. Tyto knížky Vám moc nedají. Ani nebudu psát doporučení. Já začal na PHP 3 s knížkou od pana Koska z roku 1999. Pro mě to tehdy byla bible PHP. Škoda, že pan Kosek už nějak zaspal. V této knize je skvělá reference funkcí a tehdy i smysluplné příklady. Všechny mé příklady budou postaveny na databázi postgreSQL. Dost tuhle databázi přednostňuji např. před mySQL. Snad z příkladů vycítíte ten rozdíl a výhody v používání.
Teď bych chtěl jen postavit základy. Ke všem příkladům budu používat následující PHP třídu pro připojení k databázi. Ušetří nám všem nějaký ten čas. Třídu stačí vždy jen na začátku skriptu inicializovat a dál se už o nic nestaráme. Třída se klidně dá přepsat pro mySQL (pokud bude zájem, mohu ji zde napsat) a skripty, krété k ní budou připojeny to nijak neohrozí. Třídu nazveme jednoduše db. Obsahuje funkce pro nejčastěji používané operace s databází (query, fetchRow, fetchArray, …). Při inicializaci se třida připojí k databázi a pak ji už jen voláme v případě potřeby. Následující kód uložte pod názvem class.connect.php.
<?php /** * ==================== * připojení a práce s databází postgreSQL * http://www.ekloe.com */ class db { private $linkid; private $host; private $port; private $user; private $pswd; private $db; private $result; function __construct() { $this->host = DB_SERVER; $this->port = DB_PORT; $this->db = DB_NAME; $this->user = DB_USER; $this->pswd = DB_PASS; } function connect() { try { $this->linkid = Pg_Connect("host=".$this->host." port=".$this->port." dbname=".$this->db." user=".$this->user." password=".$this->pswd.""); pg_query('SET search_path TO '.PSQL_SCHEMA); if(! $this->linkid) throw new Exception("Nepodařilo se připojit k serveru."); } catch (Exception $e) { die($e->getMessage()); } } function query($query) { try { $this->result = pg_query($this->linkid, $query); if(! $this->result) throw new Exception("Query ERROR"); } catch (Exception $e) { echo($e->getMessage()); // následující řádek můžete odkomentovat // zobrazí podrobnou chybu včetně odeslaného SQL dotazu // print_r($e); } return $this->result; } // funkce pro PHP 5.1 a vyssi function queryParams($query, $parameters) { try { $this->result = pg_query_params($this->linkid, $query, $parameters); if(! $this->result) throw new Exception("Query ERROR"); } catch (Exception $e) { echo($e->getMessage()); // následující řádek můžete odkomentovat // zobrazí podrobnou chybu včetně odeslaného SQL dotazu // print_r($e); } $this->queryCount++; return $this->result; } function affectedRows() { $count = pg_affected_rows($this->result); return $count; } function numRows() { $count = pg_num_rows($this->result); return $count; } function fetchObject() { $row = pg_fetch_object($this->result); return $row; } function fetchRow() { $row = pg_fetch_row($this->result); return $row; } function fetchArray() { $row = pg_fetch_array($this->result, NULL, PGSQL_ASSOC); return $row; } function sqlCheck($test_str) { $test_str = strtr($test_str," ","x"); $test_str = strtr($test_str,"+","x"); $test_str = strtr($test_str,"--","x"); $test_str = strtr($test_str,"&","x"); return $test_str; } } # konec tridy pgsql = POSTGRESQL ?>
Všechny funkce jsou vpodstatě jen vytaženy z php manuálu a zabaleny do třídy, se kterou se mnohem lépe manipuluje. K vysvětlení se snad jen funkce __construct(), která se vždy provede po každé inicializaci třídy. Je to konstrukční třída a většinou se v inicializují členské proměnné, nebo běh třídy. Tedy přiřadíme k proměným hodnoty pro připojení k databázi.
Poznámka: Pokud používáte verzi php 5.1 a vyšší, rozhodně místo funkce query používejte fuknci queryParams. Je to vylepšená verze dotazu na databázi odolná proti SQL Injection. Jelikož jsou parametry oddělené od dotazu, je nemožné z “venčí” dotaz ovlivňovat.
Nyní si musíme hodnoty k databázi nadefinovat. Vytvořte si soubor s názvem config.inc.php a do něj vložte následující kód. Tento soubor si budeme v dalších příkladech i mírně doplňovat. Je dobré si vždy opakující se hodnoty ukládat centrálně v jednom souboru, aby bylo jednoduché údaje měnit.
// === pripojeni k postgreSQL DB define ('DB_SERVER', 'localhost'); define ('DB_PORT', '5432'); define ('DB_NAME', 'jmeno databaze'); define ('DB_USER', 'jmeno uzivatele'); define ('DB_PASS', 'heslo'); define ('PSQL_SCHEMA', 'public'); // pouzity nazev schema v postgreSQL
A když to všechno dáme dohromady, příklad použití by mohl vypadat následovně. Pokud jste nikdy nepoužívali v php třídy, všimněte si jednoduchosti při používání.
// pripojeni pripravenych souboru include_once('config.inc.php'); include_once('class.connect.php'); // inicializace tridy $db = new db(); // pripojeni k databazi $db->connect(); // prvni dotazy do databaze $db->query("INSERT INTO clanky (cislo_clanku, text_clanku) VALUES (1, 'Muj prvni clanek')"); // totozny dotaz ale s pouzitim queryParams $db->queryParams("INSERT INTO clanky (cislo_clanku, text_clanku) VALUES ($1, $2)", array (1, 'Muj prvni clanek')); $db->query("SELECT * FROM clanky WHERE (cislo_clanku = 1) LIMIT 1"); // totozny dotaz ale s pouzitim queryParams $db->queryParams("SELECT * FROM clanky WHERE (cislo_clanku = $1) LIMIT 1", array(1));
Budu rád, když mi napíšete do komentářů případné nejasnosti. Je lepší, když mě povedete co psát, něž psát články, které nikoho nezajímají. Třída je ke stažení zde: postgreSQL connect class. Chvíli jsem přemýšlel, jestli je dobré psát a zveřejňovat postupy. Nakonec jsem se rozhodl, že ano. Přikláním se spíše k open source a myslím si, že se tím v kódu mohou vychytat chyby, nebo najít případná lepší řešení.
Kam dál (další články na eKloe.com):

July 6th, 2009 on 15:30
Dobrý den, chtěl bych se optat, jestli se dá takto ošetřit i mysqli. mám třídu na připojení k databázi, ovšem neošetřenou. Pokud to jse co jste zde psal, že by jste byl ochoten to přepsat k mysql tak bych chtěl poprosit. Moje momentální třída vypadá takto:
class MyDB extends MySQLi {
private static $_instance = null;
const SERVER = ‘localhost’;
const USERNAME = ‘xxxxxx’;
const PASSWORD = ‘xxxxxx’;
const DBNAME = ‘xxxxxx’;
private function __construct() {
parent::__construct(self::SERVER, self::USERNAME, self::PASSWORD, self::DBNAME);
}
public static function _() {
if(self::$_instance === null) {
self::$_instance = new self();
}
return self::$_instance;
}
}
Děkuji předem.
March 29th, 2010 on 12:22
Dobrý den,
Moc vám chci poděkovat za tento článek. Dostal jsem zaúkol napsat knihovnu pro práci s postgres databází a moc jsem nevěděl jak na to. A vaše knihovna mi šla velkým příkladem.
Opravdu mockrát děkuji!