我得到的回答上一个老问题这几乎是工作。

我有一个函数,

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>";
}

在功能工作正常,但是,我只能用它每页一次。第二次,我把它叫做它不会做任何事情。没有任何错误,它只是像函数从未happend。

我有什么才能使其工作多次,仍然在while循环工作?改变

有帮助吗?

解决方案

使用这样的:

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;
}

这是丑陋的,但如果你想这样的...

其他提示

这个错误是因为你没有重置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 方法。

您可以使用这样的事情,而不是,会比较好看:

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>";
}

它仍然是难看的,但更好一点。

我假设你要迭代从数据库中获得的值?

您应该将循环更改为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>";
}

那么想必你可以试试这个:

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 =测试”在您的查询错误,因为测试是一个字符串(或者是一个列?)因此,它才被称为一次才发现错误。

如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还支持准备语句的,它提供效率并且,旧的MySQL驱动缺乏安全性。

既然这样,该vraagOp看起来是用于数据访问层差的设计。

我给你的最后一个问题(你不接受......)答案解决了这个问题。

它保持特定的表/ 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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top