Pergunta

Eu tenho uma resposta sobre uma pergunta mais velho que está quase a trabalhar.

Eu tenho uma função,

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

que eu quero usar como esta

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

A função funciona bem, no entanto, só pode usá-lo uma vez por página. A segunda vez que eu chamá-lo de que ele não faz nada. Nenhum erro seja, é apenas como a função nunca happend.

O que eu tenho a mudança, a fim de fazer o trabalho várias vezes e ainda trabalhar no loop while?

Foi útil?

Solução

Use algo como isto:

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

É feio, mas se você quiser assim ...

Outras dicas

O erro é porque você não está redefinindo o resultado mysql. Porque ele está sendo armazenado em uma variável estática, a função está tentando acessar o mesmo recurso de resultado de cada vez. Eu posso ver que você está tentando cortar um passo de suas consultas (que combina a consulta e recuperar passos em um), mas eu não me preocupar com isso se eu fosse você: os benefícios não superam os custos em perda de flexibilidade. Atenha-se a maneira de verdade e tentou:

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

Ou melhor ainda, dê uma olhada nas DOP métodos.

Você poderia usar algo como isto em vez disso, seria mais agradável:

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 usá-lo como este:

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

Ainda é feio, mas um pouco melhor.

Eu suponho que você quer repetir os valores que recebe do banco de dados?

Você deve alterar o loop para uma função 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>";
}

Bem, presumivelmente, você pode tentar este:

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
}

O meu palpite é que você tem um erro em sua consulta no "TestType = test" porque teste é uma string (ou isso é uma coluna?) Por isso, só foi chamado uma vez só para encontrar um erro.

Como nickf menciona, DOP tem muito a oferecer. Desde implementos PDOStatement Traversable interface, você pode usá-lo diretamente em um foreach.

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

DOP também suporta declarações preparadas , que a eficiência oferta e segurança que o driver antigo mysql falta.

Tal como está, os olhares vraagOp ser uma má concepção de uma camada de acesso a dados.

A resposta que deu à sua última pergunta (que você não aceitou ...) resolve este problema.

Ele mantém um mapeamento de tabela específica / Onde cláusulas, e usa o recurso correto para cada chamada.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top