代码之家  ›  专栏  ›  技术社区  ›  matthy

PHP:我只能使用这个函数一次(在while循环中使用)

  •  1
  • matthy  · 技术社区  · 16 年前

    an older question 这几乎奏效了。

    我有一个功能,

    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循环中工作,我必须做哪些更改?

    7 回复  |  直到 9 年前
        1
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    用这样的方法:

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

    这很难看,但如果你想那样。。。

        2
  •  4
  •   nickf    16 年前

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

        3
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    你可以用这样的东西来代替,这样会更好:

    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
  •  0
  •   Dan Soap    16 年前

    我假设您希望迭代从数据库接收的值?

    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>";
    }
    
        5
  •  0
  •   mauris    16 年前

    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是一个字符串(或者它是一个列?),所以只调用了一次,只是为了找到一个错误。

        6
  •  0
  •   outis    16 年前

    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

    从目前的情况来看 vraagOp 看起来数据访问层的设计很差。

        7
  •  0
  •   user229044    16 年前

    它维护特定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);
    }