2010-02-07 32 views
1

我在an older question上得到了一個幾乎可以工作的答案。PHP:我只能使用這個函數一次(在while循環中使用它)

我有一個函數,

function vraagOp($table,$where) 
{ 
    static $rVraagOp; 
    if(!$rVraagOp){ 
     $qVraagOp = "SELECT * FROM $table WHERE $where"; 
     $rVraagOp = mysql_query($qVraagOp); 
    } 
    return mysql_fetch_assoc($rVraagOp); 
} 

,我想用這樣的

while (vraagOp("testtable","testtype = test")) 
{ 
    echo "testing <br>"; 
} 

功能工作正常,但是,我只能用它每頁一次。我第二次稱它它什麼都不做。也沒有錯誤,就像從未發生過的功能一樣。

爲了讓它工作多次並仍然在while循環中工作,我需要改變什麼?

+1

你應該使用一些體面的變量名,夥計 – Hanse 2010-02-09 08:13:59

回答

3

使用這樣的事情:

function vraagOp($table,$where) 
{ 
    static $rVraagOp = null; 
    if(!isset($rVraagOp)){ 
     $qVraagOp = "SELECT * FROM $table WHERE $where"; 
     $rVraagOp = mysql_query($qVraagOp); 
    } 
    $ret = mysql_fetch_assoc($rVraagOp); 
    if(!$ret) $rVraagOp = null; 
    return $ret; 
} 

這是醜陋的,但如果你想這樣的...

0

我假設你想迭代你從數據庫接收到的值?

您應該將循環更改爲foreach功能:

foreach (vraagOp("testtable","testtype = test") as $row) 
{ 
    // here you have full access on the rows the function returns 
    print_r($row); 
    echo "testing <br>"; 
} 
0

那麼想必你可以試試這個:

function do_query($table, $where){ 
    // please do some escaping for your $table and $where if necessary 
    $qVraagOp = "SELECT * FROM `$table` WHERE $where"; 
    $rVraagOp = mysql_query($qVraagOp); 
    return $rVraagOp; 
} 

function do_fetch($result){ 
    return mysql_fetch_assoc($result); 
} 

$res = do_query('testtable', 'testtype = "test"'); 

while($row = do_fetch($res)){ 
    var_dump($row); // dump each row out 
} 

我的猜測是,你有你的查詢時出現錯誤的「testtype = test「,因爲test是一個字符串(或者是一個列?)因此,它只被調用一次才發現錯誤。

+2

赫姆...爲什麼你想一個函數'do_fetch',基本上是'mysql_fetch_assoc'的別名? – 2010-02-08 01:01:41

1

你可以使用這樣的事情,而不是,會比較好看:

function vraagOp($table,$where, &$resource) 
{ 
    if(!isset($resource)){ 
     $qVraagOp = "SELECT * FROM $table WHERE $where"; 
     $rVraagOp = mysql_query($resource); 
    } 
    $ret = mysql_fetch_assoc($resource); 
    if(!$ret) $resource = null; 
    return $ret; 
} 

並使用它是這樣的:

$r = null; 
while (vraagOp("testtable","testtype = test", $r)) 
{ 
    echo "testing <br>"; 
} 

它仍然很醜,但稍好一點。

4

錯誤是因爲你沒有重置mysql結果。因爲它被存儲在一個靜態變量中,所以函數每次都試圖訪問相同的結果資源。我可以看到你試圖從查詢中刪除一個步驟(將查詢和檢索步驟合併爲一個步驟),但是如果我是你,我不會打擾它:這些好處不會超過損失的成本靈活性。堅持嘗試和真正的方法:

$result = mysql_query("SELECT * FROM foo"); 
while ($row = mysql_fetch_assoc($result)) { ... } 

// loop through it again: 
mysql_data_seek($result, 0); // rewinds the result 
while ($row = mysql_fetch_assoc($result)) { ... } 

甚至更​​好,看看在PDO方法。

+0

+1用於推薦PDO – outis 2010-02-08 01:02:02

0

正如nickf提到的,PDO有很多東西可以提供。由於PDOStatement實現Traversable接口,因此可以直接在foreach中使用它。

$query = $db->prepare("SELECT id, name, location FROM `events` WHERE `when`=?"); 
$query->execute(array(strtotime('-3 days UTC'))); 
foreach ($query as $event) { 
    ... 
} 

PDO還支持prepared statements,它提供了舊的mysql驅動程序缺少的效率和安全性。

就目前而言,vraagOp看起來對於數據訪問層來說是一個糟糕的設計。

0

我給你最後一個問題的答案(你不接受...)解決了這個問題。

它維護特定表/ where子句的映射,併爲每個調用使用正確的資源。

function vraagOp($table, $where) 
{ 
    // Holds our mysql resources in a map of "{$table}_{$where}" => resource 
    static $results = array(); 

    $key = $table . '_' . $where; 

    if (!isset($results[$key])) 
    { 
     // first call of this particular table/where 
     $results[$key] = mysql_query("SELECT * FROM $table WHERE $where"); 
    } 

    $row = mysql_fetch_assoc($results[$key]); 

    if ($row === false) 
     // remove this key so a subsequent call will start over with a new query 
     unset($results[$key]); 

    return $row; 
} 

// Usage 

while ($row = vraagOp("table1", "where field > 7")) { 
    print_r($row); 
}