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

PHP:我只能使用这个函数一次(在while循环中使用),php,mysql,while-loop,static-variables,Php,Mysql,While Loop,Static Variables,我得到了一个几乎有效的答案 我有一个功能 function vraagOp($table,$where) { static $rVraagOp; if(!$rVraagOp){ $qVraagOp = "SELECT * FROM $table WHERE $where"; $rVraagOp = mysql_query( $qVraagOp ); } return mysql_fetch_assoc( $rVraagOp ); }

我得到了一个几乎有效的答案

我有一个功能

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(vraagOp(“testtable”,“testtype=test”))
{
回声“测试
”; }
该功能运行良好,但是,我每页只能使用一次。我第二次叫它,它什么也没做。也没有错误,就像函数从未发生一样


为了使它能够多次工作并仍能在while循环中工作,我需要做哪些更改?

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

您应该将循环更改为
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>";
}
foreach(vraagOp(“testtable”,“testtype=test”)作为$row)
{
//在这里,您可以完全访问函数返回的行
打印(行);
回声“测试
”; }
我假设您希望迭代从数据库接收的值

您应该将循环更改为
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>";
}
foreach(vraagOp(“testtable”,“testtype=test”)作为$row)
{
//在这里,您可以完全访问函数返回的行
打印(行);
回声“测试
”; }
你可以试试这个:

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

那么您大概可以尝试以下方法:

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

使用类似以下内容:

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;
}
$r = null;
while (vraagOp("testtable","testtype = test", $r)) 
{
   echo "testing <br>";
}

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

可以这样做:

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;
}
$r = null;
while (vraagOp("testtable","testtype = test", $r)) 
{
   echo "testing <br>";
}

这很难看,但如果你想这样…

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

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;
}
然后像这样使用它:

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;
}
$r = null;
while (vraagOp("testtable","testtype = test", $r)) 
{
   echo "testing <br>";
}
$r=null;
while(vraagOp(“testtable”,“testtype=test”,“$r))
{
回声“测试
”; }

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

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

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;
}
然后像这样使用它:

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;
}
$r = null;
while (vraagOp("testtable","testtype = test", $r)) 
{
   echo "testing <br>";
}
$r=null;
while(vraagOp(“testtable”,“testtype=test”,“$r))
{
回声“测试
”; }

它仍然很难看,但有点好。

错误是因为您没有重置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)) { ... }

或者更好的是,看看这些方法。

错误是因为您没有重置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)) { ... }

或者更好的是,看看这些方法。

正如nickf提到的,PDO可以提供很多功能。由于
PDOStatement
实现了该接口,因此可以在
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
看起来是一个糟糕的设计。

正如nickf所提到的,PDO有很多可以提供的。由于
PDOStatement
实现了该接口,因此可以在
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
对于数据访问层来说似乎是一个糟糕的设计。

我对你上一个问题的回答(你没有接受…)解决了这个问题

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

我给你最后一个问题的答案(你没有接受…)解决了这个问题

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

哼。。。为什么您想要一个基本上是mysql的别名的函数
do\u fetch
。。。你为什么想要一个基本上是mysql别名的函数
do\u fetch
?你应该使用一些像样的变量名,伙计你应该使用像样的变量名,伙计