Oznámení
Pripojeni k DB2 – neimplementovane funkce v driveru
před 7 lety

- Ekin
- Člen | 4
Dibi 2.0 (revision 7c47f57 released on 2012–02–03)
PHP 5.3.8
Ahoj
mám pomerne rozsiahlu aplikáciu, kde používam dibi ako databázovú vrstvu. Jednou z charakteristík aplikácie je to, že sa nasadzuje na rôznych prostrediach a nad rôznymi databázami. V podstate sa mi bez extra problémov podarilo zabezpečiť pripojenie na MySql, Oracle a MSSQL(PDO). (požiadavka je, aby stačilo zmeniť nastavenie pripojenia a fungovalo to).
Momentálne riešim pripojenie na IBM DB2 (k dispozícii mám na testovanie verziu 9.2).
Moje pripojenie:
<?php
dibi::connect(array(
'driver' => 'pdo',
'pdo' => new PDO('odbc:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=SOMEDATABASE; HOSTNAME=SOMEHOSTNAME;PORT=50000;PROTOCOL=TCPIP;', 'username', 'password'),
'charset' => 'utf-8'
));
?>
Connect je bez problémov. Problém nastane pri použití dibi::query alebo
dibi::test. Jedná sa o to, že všetky stringy v úvodzovkách, alebo
premenné resolvujúce sa na stringy mi z query zmiznú.
Príklad:
<?php
$value='somevalue';
dibi::test("select SOMECOLUMN from SOMETABLE where COLUMN = '".$value."'");
dibi::test("select SOMECOLUMN from SOMETABLE where COLUMN = %s",$value);
dibi::test("select SOMECOLUMN from SOMETABLE where COLUMN = 'somevalue'");
?>
vráti vo vsetkých prípadoch:
SELECT SOMECOLUMN FROM SOMETABLE WHERE COLUMN =
Zistil som, že v tomto prípade nastane problém v tom, že odbc/pdo
driver pre DB2 nemá naimplementovanú funkciu quote (PDO::quote).
Konkrétne volanie je v „dibi/drivers/pdo.php“ vo funkcii escape :
<?php
public function escape($value, $type)
{
switch ($type) {
case dibi::TEXT:
return $this->connection->quote($value, PDO::PARAM_STR);
?>
quote skutočne vráti prázdny string, alebo null.
pre moje potreby som si to upravil na:
<?php
public function escape($value, $type)
{
switch ($type) {
case dibi::TEXT:
if ($this->driverName == "odbc") {return myQuoteMethod($value);} else {
return $this->connection->quote($value, PDO::PARAM_STR);
}
?>
kde „myQuoteMethod“ je nejaká moja funkcia, ktorá so postará o escaping/quoting
Ďalší problém nastáva pri použití ohraničenia [ na identifikátory. Tj napríklad query:
<?php
dibi::query("select [COLUMN] from Table");
?>
vrati:
select [COLUMN] from Table
V tomto prípade (zas v pdo.php vo funkcii escape) ide o :
<?php
case dibi::IDENTIFIER:
switch ($this->driverName) {
case 'mysql':
return '`' . str_replace('`', '``', $value) . '`';
case 'pgsql':
return '"' . str_replace('"', '""', $value) . '"';
case 'sqlite':
case 'sqlite2':
return '[' . strtr($value, '[]', ' ') . ']';
case 'odbc':
case 'oci': // TODO: not tested
case 'mssql':
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
default:
return $value;
}
?>
zmenil som to na:
<?php
case 'odbc': return $value;
?>
Čo samozrejme nieje veľmi ok, ale pre účely testovania to zatiaľ funguje (v databázi sú len rozumné názvy).
Moje otázky:
- Je možné spraviť si do dibi vlastný driver (niečo ako pdo_DB2.php) a pri pripojení používať ten? Nerád by som tam nechával editované súbory z ofic distribúcie dibi pre prípad, že budem v budúcnosti prechádzať na ďalšiu verziu. Taktiež sa mi môže stať že budem používa´t odbc aj pre iné databázy.
- nemá dibi nejakú vstavanú quote funkciu, ktorú by som mohol použiť miesto <?php $this->connection->quote() ?> ?
Dík za odpovede
PS: po nikom nechcem, aby implementoval driver na DB2, ale niekomu inému, kto sa snaží pripojiť sa tento post môže hodiť.
před 7 lety

- Milo
- Nette Core | 1119
Můžeš vše nahlásit jako issue na Github. Těžko se to ale bude opravovat, protože to nejsou časté databáze.
Vlastní driver si můžeš napsat. Stačí třídu pojmenovat
DibiSuperDriver, loadnout před Dibi a můžeš používat. Viz API
před 7 lety

- Ekin
- Člen | 4
Dik,
urobil som to tak, že som si z toho vyrobil vlasný driver.
v podstate zmeny sú v ňom také ako som opísal hore, takže keď to bude
niekto potrebovať, tak nech to kľudne použije.
Je to zľahka otestované na DB2 verzie 9