1

我得到了一个几乎可以正常工作的旧问题的答案。

我有一个功能,

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循环中工作,我必须改变什么?

4

7 回答 7

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方法。

于 2010-02-08T01:01:07.337 回答
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;
}

这很丑陋,但如果你想要那样...

于 2010-02-08T00:48:12.097 回答
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>";
}

它仍然很丑,但好一点。

于 2010-02-08T00:52:19.477 回答
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>";
}
于 2010-02-07T23:30:17.160 回答
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 是一个字符串(或者那是一个列?)因此它只被调用一次只是为了找到一个错误。

于 2010-02-07T23:40:34.993 回答
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数据访问层的设计看起来很糟糕。

于 2010-02-08T01:13:50.220 回答
0

我对你最后一个问题的回答(你没有接受......)解决了这个问题。

它维护特定 table/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);
}
于 2010-02-08T01:44:56.507 回答