2010-09-26 117 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的圖案的現有實現中的一個)。