Oznámení
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 | 1119
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 | 1119
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 8 lety
- David Grudl
- Nette Core | 6806
Auto-uvolňování se po zavolání getResultResource() vypne.