2010-02-07 78 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); 
}