tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Návrat původního zdroje přes getResource

před 8 lety

simecky
Člen | 2

Zdravím,

chtěl bych udělat postupný přechod na dibi. Momentálně mám pro práci s SQL volanou svoji funkci mysqlquery, která teprve volá mysql_query. Pro začátek jsem do této funkce chtěl dát volání přes dibi a pomocí metody getResource získat proměnou, kterou returnu pro obyčejný mysql_fetch_array.

V rámci této pomocné funkce je načtení dat přes mysql_fetch_array bez problému, bohužel pokud tuto proměnou vrátím returnem tak tam již nemohu číst data přes mysql_fetch_array

var_dump v samotné pomocné funkci vrací:
resource(14) of type (mysql result)

var_dump po returnu:
resource(14) of type (Unknown)

Nějaký nápad proč by mohl vznikat tento problém? return výsledku přímo z mysql_query funguje bez problému.

před 8 lety

Milo
Nette Core | 1124

Resource typu Unknown vznikne, pokud zdroj nějakým způsobem uzavřeš.

$fd = fOpen('file.txt', 'w');
var_dump($fd);  // resource(25) of type (stream)
fClose($fd);
var_dump($fd);  // resource(25) of type (Unknown)

Nevím jak MySQL, ale u PostgreSQL následující funguje:

function dbQuery()
{
    $db = dibi::getConnection()->getDriver()->getResource();
    $res = pg_query($db, 'SELECT * FROM tabulka');
    return $res;
}

$res = dbQuery();
$row = pg_fetch_assoc($row);

var_dump($row); // pole s řádkem z DB

před 8 lety

simecky
Člen | 2

K žádnému uzavření spojení u mě nedochází.

Kód:

<?php
function query($sql)
{
    $a=mysql_query($sql);
    var_dump($a);
    return $a;
}

$b=query("SELECT NOW()");
var_dump($b);
?>

mě vrátí:

resource(10) of type (mysql result)
resource(10) of type (mysql result)

Ale kód za použití dibi:

<?php
function query($sql)
{
    try
    {
        $in = dibi::query($sql);
        if ( $in instanceOf DibiResult ){
            $a = $in->getResource();
        }
        else $a = false;
    } catch (Exception $e)
    {
        echo 'Caught exception: ', $e->getMessage(), "\n";
    }

    var_dump($a);
    return $a;
}

$b=query("SELECT NOW()");
var_dump($b);
?>

vrátí:

resource(10) of type (mysql result)
resource(10) of type (Unknown)

před 8 lety

Milo
Nette Core | 1124

DibiDriver, ve tvém případě DibiMySqlDriver, v destruktoru uvolňuje result. Takže když objekt při ukončení funkce zaniká, result se uvolní. Nejsnazší bude destruktor vyhodit a uvolňovat result ručně.

před 7 lety

David Grudl
Nette Core | 6822

Auto-uvolňování se po zavolání getResultResource() vypne.