Pregunta

Tengo una respuesta en una cuestión mayor que está casi de trabajo.

Tengo una función,

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

que quiero usar como esto

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

La función funciona bien, sin embargo, sólo puedo usarlo una vez por página. La segunda vez que lo llamo que no hace nada. No hay error o bien, que es igual que la función nunca sucedió.

¿Qué tengo que cambiar a fin de hacer que funcione en múltiples ocasiones y siguen trabajando en el bucle while?

¿Fue útil?

Solución

Utilice algo como esto:

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 feo, pero si usted quiere así ...

Otros consejos

El error se debe a que usted no está restableciendo el resultado de MySQL. Debido a que está siendo almacenado en una variable estática, la función está tratando de acceder al mismo recurso resultado cada vez. Puedo ver que usted está tratando de cortar un paso desde sus consultas (la combinación de la consulta y recuperación de pasos en uno), pero no me molestaría con él si fuera tú: los beneficios no superan los costos en la pérdida de flexibilidad. Sobre el inicio del camino probado y verdadero:

$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 mejor aún, echar un vistazo a los métodos DOP .

Se puede usar algo como esto en su lugar, sería más agradable:

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

Y utilizar de esta manera:

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

Todavía es feo, pero un poco mejor.

Asumo que desea iterar sobre los valores que recibe de la base de datos?

Debe cambiar su lazo a una función 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>";
}

Bueno, presumiblemente, puede probar lo siguiente:

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
}

Mi conjetura es que usted tiene un error en su consulta en el "TestType = prueba" porque la prueba es una cadena (o es que una columna?) Por lo tanto, sólo se llama una vez sólo para encontrar un error.

Como nickf menciones, DOP tiene mucho que ofrecer. Desde PDOStatement implementa el de Traversable interfaz, se puede usar directamente en un foreach.

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

declaraciones preparadas , que ofrecen la eficiencia y la seguridad de que el conductor carece de MySQL edad.

En su forma actual, la vraagOp parece ser un mal diseño de una capa de acceso de datos.

La respuesta que he dado a tu última pregunta (que no ha aceptado ...) resuelve este problema.

Se mantiene una asignación de tabla específica / cláusulas WHERE, y utiliza el recurso correcto para cada llamada.

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top