我希望能够调用一个查询函数,并根据结果将它们放入一个我可以在函数外部调用的对象中。这就是我所拥有的:
<?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循环,但不知道该放入什么。
答案 0 :(得分: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-ish工具(即Zend Db Table,Doctrine,Propel或一个ActiveRecord模式的现有实现)。