PHP:私は一度だけ、この機能を使用することができます(whileループでそれを使用して)

StackOverflow https://stackoverflow.com/questions/2218802

質問

私は ほとんどどの作業されています。

私は機能を持っている、

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

機能が正常に動作します、しかし、私はそれを1ページに1つの時間を使うことができます。私はそれを呼び出す二回目は、それは何もしません。エラーなしのどちらか、それは関数が起こったことがないだけのようだ。

私はそれが複数回動作し、まだ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
}

私の推測では、テストが文字列である(または列?ということである)ので、それは一度だけだけと呼ばれていましたがエラーを発見するので、あなたが「テスト・タイプ=テスト」で、あなたのクエリにエラーがあるということです。

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もサポートしていますをrel="nofollow noreferrer">古いMySQLドライバが不足しているセキュリティます。

現状では、

vraagOpは、データアクセス層の貧デザインになりそうだ。

私は(あなたが...受け入れなかった)あなたの最後の質問に与えた答えは、この問題を解決します。

これは、特定のテーブル/句のマッピングを維持し、各コールの正しいリソースを使用します。

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);
}
scroll top