PHP: Ben sadece (bir süre döngü içinde kullanarak) bir kez bu fonksiyonu kullanabilirsiniz

7 Cevap php

Neredeyse çalışıyor an older question üzerine bir cevap aldım.

Ben bir işlevi var,

function vraagOp($table,$where)
{
    static $rVraagOp;
    if(!$rVraagOp){
        $qVraagOp = "SELECT * FROM $table WHERE $where";
        $rVraagOp = mysql_query( $qVraagOp );
    }
    return mysql_fetch_assoc( $rVraagOp );
}

Böyle kullanmak istediğiniz

while (vraagOp("testtable","testtype = test")) 
{
   echo "testing <br>";
}

Fonksiyonu iyi çalışır, ancak, ben sadece o sayfa başına bir kez kullanabilirsiniz. Ben onu aramak ikinci kez bir şey yapmaz. Hiçbir hata, ya sadece happend asla işlevi gibi.

Ne birden çok kez çalışmak ve hala iken döngü içinde çalışması yapmak için değiştirmek zorunda mı?

7 Cevap

Bu gibi bir şey kullanabilirsiniz:

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

Bu çirkin, ama böyle istersen ...

Eğer mysql sonucu sıfırlama değil çünkü hatadır. Bir statik değişken depolanan olduğundan, fonksiyon aynı result resource her zaman erişmeye çalışıyor. Ben size sorguları (sorgulama birleştirerek ve içine bir adım alınırken) bir adım kesmek için çalışıyoruz görebilirsiniz, ama olsaydı ben onunla rahatsız olmaz: faydaları kaybı maliyeti ağır basmaktadır yok esneklik. Denenmiş ve gerçek bir şekilde sadık:

$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)) { ... }

Veya daha da iyisi, PDO yöntemleri bir göz atın.

Bunun yerine, daha güzel olurdu böyle bir şey kullanabilirsiniz:

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

Ve bu gibi kullanmak:

$r = null;
while (vraagOp("testtable","testtype = test", $r)) 
{
   echo "testing <br>";
}

Hala çirkin, ama biraz daha iyi.

Ben size veritabanından aldığınız değerler üzerinde yinelemek istediğinizi varsayalım?

Bir foreach fonksiyonu için döngü değiştirmeniz gerekir:

foreach (vraagOp("testtable","testtype = test") as $row) 
{
   // here you have full access on the rows the function returns
   print_r($row);
   echo "testing <br>";
}

Peki muhtemelen bu deneyebilirsiniz:

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
}

Benim tahminim bir test bir dize (veya bir sütun? Olduğunu) Bu nedenle sadece bir kez, sadece bir hata bulmak için çağrıldı çünkü "TestType = test" adresinden sorgu bir hata olması.

Nickf bahseder gibi, PDO teklif çok şey var. PDOStatement Traversable arabirimini uygular yana, bir foreach bunu doğrudan kullanabilirsiniz.

$query = $db->prepare("SELECT id, name, location FROM `events` WHERE `when`=?");
$query->execute(array(strtotime('-3 days UTC')));
foreach ($query as $event) {
   ...
}

PDO de verimliliği ve eski mysql sürücü yoksun güvenlik sunuyor ki, prepared statements destekler.

Haliyle, vraagOp bir veri erişim katmanı için kötü bir tasarım olarak görünüyor.

Ben (kabul etmedi ...) son soruya verdiği cevabı bu sorunu çözer.

Bu özel tablo / maddelerinin bir eşleme korur ve her çağrı için doğru kaynak kullanır.

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