簡體   English   中英

PHP:我只能使用一次此功能(在while循環中使用它)

[英]PHP: I can only use this function once (using it in a while loop)

我得到了一個幾乎可以解決的老問題的答案。

我有一個功能,

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循環中工作,我必須更改什么?

該錯誤是因為您沒有重置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)
{
    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;
}

很難看,但是如果你想要那樣的話...

您可以改用這樣的方法,效果會更好:

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 = test”中的查詢中有錯誤,因為test是一個字符串(或那是一列?),因此僅被調用一次才發現錯誤。

尼克(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對於數據訪問層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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM