Brakująca metoda GetMany dla ADOdb

Opublikowane przez Jarosław Zabiełło Tue, 15 Nov 2005 11:01:00 GMT

Jedną z najlepszych bibliotek opakowujących połączenia do baz relacyjnych dla PHP jest "ADOdb":http://adodb.sf.net. Pomijając wiele zalet używania ADOdb (zintegrowany cache, moduł w C, czytelne API) zamiast PEAR::DB lub natywnych (i koszmarnych składniowo) funkcji PHP chciałbym zatrzymać się nad jedną niedoróbka. Otóż od dawna brakuje tam Funkcji GetMany() która byłaby odpowiedzialna za pobieranie porcji danych z bazy. Jest co prawda funkcja SelectLimit() ale jest jest beznadziejna gdyż nie umożliwia korzystania z parametryzowanych zapytań SQL. Poza tym ma fatalną, nieintuicyjną nazwę. Skoro jest GetOne(), GetAll(), GetRow() to dlaczego jej też nie nazwali GetMany()? Postanowiłem te braki uzupełnić. Poniżej przykład implementacji opartej na ADOdb:
<?php
require_once 'adodb/adodb.inc.php';
require_once 'adodb/adodb-errorhandler.inc.php';

class Database
{
    var $conn;
    
    function Database($cfg)
    {
        $this->conn =& NewADOConnection($cfg['dbtype']);
        $this->conn->Connect(
            $cfg['host'], 
            $cfg['user'], 
            $cfg['passwd'], 
            $cfg['db']);
         $this->conn->SetFetchMode(ADODB_FETCH_ASSOC);
    }
    
    function GetAll($sql, $params=null)
    {
        return $this->conn->GetAll($sql, $params);
    }
       
    function GetRow($sql, $params=null)
    {
        return $this->conn->GetRow($sql, $params);
    }   
    
    function GetOne($sql, $params=null)
    {
        return $this->conn->GetOne($sql, $params);
    }   
    
    function GetMany($sql, $params=null, $from, $limit)
    {
        $result = array();
        $recordSet = $this->conn->Execute($sql, $params);
        while (!$recordSet->EOF) {
            if ($from > 0) {
                $from -= 1;
                $recordSet->MoveNext();
            } elseif ($limit > 0) {
                $limit -= 1;
                $result[] = $recordSet->fields;
                $recordSet->MoveNext();
            } else {
                $recordSet->MoveNext();
            }
        }
        return $result;
    }   
}

$cfg = array(
    'dbtype' => 'mysql',
    'host' => 'localhost',
    'user' => 'root',
    'passwd' => '',
    'db' => 'baza',
    );

# przykład:

$db = new Database($cfg);
var_dump($db->GetMany("SELECT * FROM tabelka", null, 0, 10));
?>

Posted in  | Tagi  | 9 comments

Comments

  1. Avatar rsz powiedział 1 day later:

    “wiele zalet używania ADOdb (zintegrowany cache, moduł w C, czytelne API

    gdzie Ty ten moduł w C w AdoDb widziałeś? find . -name ”*.c” -> brak ;)

    btw przed chwilą hackowałem adodb 4.23 bo cośtam było sfakane z inkludami, potem problemy z wielokrotnymi inkludami (wada PHP oczywiście)... ehh… wiele zalet… amatorszczyzna…

  2. Avatar rsz powiedział 1 day later:

    A jeszcze apropos zajebistej jakości webowych produkcji w rubym:

    dodałem przed chwilą powyższy komentarz (wcześniej było 0), wróciłem na gł. stronę i w dalszym ciągu jest “no comments”. Otwieram komentarze i komentarz jednak jest.

    ehh… amatorszczyzna…

  3. Avatar JZ powiedział 2 days later:

    http://adodb.sourceforge.net/#download

    Adodb-ext-503.zip provides up to 100% speedup by replacing parts of ADOdb with C code. ADOdb will auto-detect if this extension is installed and use it automatically. This extension is compatible with ADOdb 3.32 or later, and PHP 4.3., 4.4., 5.0.* and 5.1.*. Source code for all platforms and and binaries for Windows included.

    Poza tym 4.23 to jakaś stara wersja. Aktualna jest 4.67. BTW, wyszła też 2.0 dla Pythona.

  4. Avatar rsz powiedział 2 days later:

    Dobrze wiedzieć o tym adodb-ext, ale wiesz, szczerze mówiąc, nie stawiałbym swojej reputacji/pieniędzy w środowisku produkcyjnym na stabilność takiego rozszerzenia…

  5. Avatar splatch powiedział 3 months later:

    ado db umrze, powinno umrzeć, jest strasznie mułowate, brzydko napisane. Lepiej użyć creole, które jest o wiele przejrzyściejsze.. z resztą od PHP 5.1 jest pdo…

  6. Avatar Jarosław Zabiełło powiedział 3 months later:

    Dla mnie ADOdb ma przejrzystą składnię, na pewno bardziej od natywnych funkcji pehapa. Creole działa niestety tylko z PHP5. ADodb zaś działa z PHP od wersji 4 wzwyż (plus jest nawet port do Pythona). Poza tym, ADodb jest szybsze od Creole. And last but not least, AdoDB ma własny cache z czego często korzystam. Co do bibliotek pdo, to są chyba jeszcze wciąż w fazie bety i nie są zalecane do celów produkcyjnych.

  7. Avatar splatch powiedział 3 months later:

    Creole jest dostępne również pod PHP4. Skąd wnosisz, że AdoDB jest szybsze od Creole? IMO cache nie jest integralną częścią abstrakcji bazy danych, lepsze, bardziej wydajne jest cache całych stron. API PDO wiele się nie zmieni, w PHP6 nie ma być funkcji do mysql, do sql lite etc – w ich miejsce będzie korzystać się z odpowiedniego PDO. Jeśli będą jakiekolwiek zmiany w PDO to raczej pod maską a nie w samym API. Jest nawet implementacja PDO z cache (swoją drogą polska ;]) – http://www.openpb.net/opd.php

  8. Avatar Jarosław Zabiełło powiedział 3 months later:

    Trudno mówić o wpieraniu PHP4 w Creole skoro sami piszą: “The PHP4 Version of Creole is no longer supported. These packages may or may not work with your version of PHP4.”

    Informację o większej szybkości ADOdb w stos. do Creole oparłem na artykule Timo Haberkema (“PDO – przyszły standard dostępu do baz danych”, PHP solutions 5/2005 s.22-28)

    Keszowanie całych stron nie zawsze można stosować na stronach o dużej dynamice. Zdecydowanie wole podejście jakie jest powszechne w szablonach na Pythona i Rubiego (Cheetah, Django, Myghty, Rails) gdzie można bardzo elastycznie (i na indywidualnych zasadach) keszować dowolny element strony.

    Zgadzam się, że przyszłość PHP należy do PDO.

  9. Avatar splatch powiedział 3 months later:

    Smarty umożliwia wstawianie do stron, które zostały zbuforowane dynamicznych bloków poprzez funkcję insert. :)

(leave url/email »)

   Pomoc języka formatowania Obejrzyj komentarz