2010-09-26 124 views
1

我希望能够调用查询函数,并根据结果将它们放入一个可以在函数外调用的对象。这是我所拥有的:简单的数据库查询函数

<?php 

function query($sql) { 
global $r; 

$database = "theatre"; 
$db_conn = pg_connect ("host=localhost port=5432 
dbname=$database user=postgres"); 
if (!$db_conn): ?> 
<h1>Failed connecting to postgres database <?php echo $database;?></h1> 
<?php 
exit; 
endif; 

$ep = pg_query ($db_conn, $sql); 

while ($r = pg_fetch_object ($ep)) { 

} 

pg_free_result($ep); 
pg_close($db_conn); 

} 

query('select * from test'); 
echo $r->fname; 

我不想将任何列名硬编码到函数中。所以fname就是一个例子,但它会根据查询动态变化。我有一个while循环,但不知道要放什么。

回答

1

由函数pg_fetch_object返回的值已经是一个对象,因此不需要遍历结果。只返回:

return pg_fetch_object ($ep); 

然后,只需使用返回的结果,而不提及这个尴尬的全局变量$r

$r = query('select * from test'); 
echo $r->fname; 

此外,不需要释放资源与pg_free_result。它在它存在的作用域结束时自动释放(在这种情况下,这是当前函数)。调用pg_close也可能会降低脚本速度,因为下次您调用该函数时必须重新创建连接。我建议将连接存储在本地静态变量中,而不是完全关闭 - 它会自动关闭。

function query($sql) { 
    $database = "theatre"; 
    static $db_conn; 
    if (!$db_conn) { 
     $db_conn = pg_connect ("host=localhost port=5432 dbname=$database user=postgres"); 
    } 
    ... 

作为长期解决方案,我建议研究对象关系映射的主题和学习的可用的ORM肥胖型工具之一(即Zend Db TableDoctrinePropel,或ActiveRecord的图案的现有实现中的一个)。