Frage

bekam ich eine Antwort auf eine ältere Frage , die fast funktioniert.

Ich habe eine Funktion,

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

, dass ich will, so verwenden,

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

Die Funktion funktioniert gut, aber ich kann es nur einmal pro Seite verwenden. Das zweite Mal, dass ich es nenne es nichts tun. Kein Fehler entweder, es ist wie die Funktion nie passiert.

Was muss ich ändern, um es mehrmals funktioniert und immer noch in der while-Schleife arbeiten?

War es hilfreich?

Lösung

Verwenden Sie so etwas wie folgt aus:

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

Es ist hässlich, aber wenn Sie möchten, wie das ...

Andere Tipps

Der Fehler ist, weil Sie nicht das mysql Ergebnis zurückgesetzt wird. Weil es in einer statischen Variablen gespeichert wird, wird die Funktion versucht, die gleichen Ergebnis Ressource jedes Mal zuzugreifen. Ich kann sehen, dass Sie versuchen, einen Schritt aus Ihren Anfragen zu schneiden (die Abfrage kombinieren und Schritte in ein Abrufen), aber ich würde es nicht stören, wenn ich Dir wäre: Die Vorteile überwiegen die Kosten nicht zu einem Verlust der Flexibilität. Halten Sie sich an die bewährten Art und Weise:

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

oder noch besser, werfen Sie einen Blick auf die PDO Methoden.

Sie so etwas wie dies stattdessen verwenden könnten, wäre schön:

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

Und es wie folgt verwendet werden:

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

Es ist immer noch hässlich, aber ein bisschen besser.

Ich nehme an, Sie möchten die Werte iterieren Sie aus der Datenbank erhalten?

Sie sollten Ihre Schleife auf eine foreach Funktion ändern:

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

Nun vermutlich können Sie versuchen, diese:

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
}

Meine Vermutung ist, dass Sie einen Fehler in der Abfrage bei dem „Testtype = test“ haben, weil Test eine Zeichenfolge (oder ist, dass eine Spalte?) Ist daher war es nur ein einziges Mal nur aufgerufen, einen Fehler zu finden.

Wie Nickf erwähnt, hat PDO viel zu bieten. Da PDOStatement die Travers Schnittstelle, können Sie es direkt in einem foreach verwenden.

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

PDO unterstützt auch Prepared Statements , die Effizienz bieten und Sicherheit, die der alte mySQL-Treiber fehlt.

Wie es aussieht, die vraagOp sieht ein schlechtes Design für eine Datenzugriffsschicht sein.

Die Antwort, die ich auf Ihre letzte Frage gab (die man nicht akzeptieren ...) löst dieses Problem.

Es verwaltet eine Zuordnung von bestimmten Tabelle / where-Klauseln und verwendet die richtige Ressource für jeden Anruf.

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top