eKloe.com - Kubuntu User

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í.


Sdílej:
  • Facebook
  • Google Bookmarks
  • Live
  • Twitter
  • StumbleUpon
:,
2 komentářů:
  1. Petr Labuda

    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.

  2. Adam

    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!

Odpovědět

Hledat: