Domanda

ho ricevuto una risposta su una questione più vecchio che è quasi di lavoro.

Ho una funzione,

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

che voglio usare come questo

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

La funzione funziona bene, però, posso usare solo una volta per pagina. La seconda volta lo chiamo io che non fa nulla. Nessun errore o, è proprio come la funzione mai accaduta.

Che cosa devo cambiare per farlo funzionare più volte e ancora lavorare nel ciclo while?

È stato utile?

Soluzione

Usa qualcosa come questo:

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

E 'brutto, ma se si vuole così ...

Altri suggerimenti

L'errore è perché non stai resettare il risultato mysql. Perchè viene memorizzato in una variabile statica, la funzione sta tentando di accedere alla stessa risorsa risultato ogni volta. Vedo che si sta cercando di tagliare un passo dalle query (che unisce l'interrogazione e il recupero dei passi in uno), ma non vorrei perdere tempo con esso, se fossi in te: i benefici non superino i costi la perdita di flessibilità. Stick per il modo vero e provato:

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

O, meglio ancora, dare un'occhiata a metodi DOP .

Si potrebbe usare qualcosa di simile a questo, invece, sarebbe più bello:

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

E usare in questo modo:

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

E 'ancora brutto, ma un po' meglio.

Presumo che si desidera per scorrere i valori ricevuti dal database?

Si dovrebbe cambiare il ciclo per una funzione 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>";
}

Bene presumibilmente si può provare questo:

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
}

La mia ipotesi è che avete un errore nella query al "TestType = test" a causa di prova è una stringa (o è che una colonna?) Quindi è stato chiamato solo una volta solo per trovare un errore.

Come nickf menzioni, DOP ha molto da offrire. Dal momento che PDOStatement implementa il Traversable interfaccia, è possibile utilizzarlo direttamente in un foreach.

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

istruzioni preparate , che offrono efficienza e la sicurezza che il driver mysql vecchio manca.

Così com'è, il vraagOp sembra essere una cattiva progettazione per un livello di accesso ai dati.

La risposta che ho dato alla sua ultima domanda (che non ha accettato ...) risolve questo problema.

Si mantiene una mappatura di tabella specifica / clausole where, e utilizza la risorsa corretta per ogni chiamata.

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top