Question

Je suis une réponse sur une question plus qui est presque travail.

J'ai une fonction,

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

que je veux utiliser comme ceci

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

La fonction fonctionne très bien, mais je ne peux l'utiliser une fois par page. La deuxième fois que je l'appelle, il ne fait rien. Pas d'erreur non plus, il est tout comme la fonction ne happend.

Qu'est-ce que je dois changer pour le faire fonctionner plusieurs fois et toujours travailler dans la boucle while?

Était-ce utile?

La solution

Utilisez quelque chose comme ceci:

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

Il est laid, mais si vous voulez comme ça ...

Autres conseils

L'erreur est parce que vous n'êtes pas remettre à zéro le résultat mysql. Parce qu'il est stocké dans une variable statique, la fonction tente d'accéder au même résultat ressource chaque fois. Je peux voir que vous essayez de découper une étape de vos requêtes (combinant l'interrogation et la récupération des étapes en une seule), mais je ne voudrais pas déranger avec elle si je vous: les avantages ne l'emportent pas sur les coûts de la perte de souplesse. Tenez-vous à la manière éprouvée et vraie:

$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 mieux encore, jetez un oeil sur les méthodes AOP .

Vous pouvez utiliser quelque chose comme ça à la place, serait plus agréable:

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

Et l'utiliser comme ceci:

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

Il est toujours laid, mais un peu mieux.

Je suppose que vous voulez effectuer une itération sur les valeurs que vous recevez de la base de données?

Vous devez changer votre boucle à une fonction 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>";
}

Eh bien, vous pouvez probablement essayer ceci:

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
}

Je suppose que vous avez une erreur dans votre requête à la « TestType = test » parce test est une chaîne (ou est-ce une colonne?) Par conséquent, il n'a été appelé une seule fois pour trouver une erreur.

Comme nickf mentionne, AOP a beaucoup à offrir. Depuis PDOStatement implémente le Traversable interface, vous pouvez l'utiliser directement dans un foreach.

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

AOP soutient également déclarations préparées , qui offrent l'efficacité et la sécurité que le pilote ancien mysql manque.

En l'état actuel, le vraagOp semble être une mauvaise conception pour une couche d'accès aux données.

La réponse que j'ai donné à votre dernière question (que vous n'avez pas accepté ...) résout ce problème.

Il maintient une cartographie de table spécifique / où les clauses, et utilise la ressource correcte pour chaque appel.

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top