PHP:Я могу использовать эту функцию только один раз (используя ее в цикле while)

StackOverflow https://stackoverflow.com/questions/2218802

Вопрос

Я получил ответ на более старый вопрос который почти работает.

У меня есть функция,

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

что я хочу использовать вот так

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

Функция работает нормально, однако я могу использовать ее только один раз на странице.Второй раз, когда я вызываю его, он ничего не делает.Ошибки тоже нет, как будто функция никогда не выполнялась.

Что мне нужно изменить, чтобы он работал несколько раз и продолжал работать в цикле while?

Это было полезно?

Решение

Используйте что-то вроде этого:

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

Это некрасиво, но если ты так хочешь...

Другие советы

Ошибка связана с тем, что вы не сбрасываете результат MySQL.Поскольку он хранится в статической переменной, функция каждый раз пытается получить доступ к одному и тому же ресурсу результата.Я вижу, что вы пытаетесь вырезать шаг из своих запросов (объединяя шаги запроса и извлечения в один), но на вашем месте я бы не стал этим заниматься:выгоды не перевешивают затраты, связанные с потерей гибкости.Придерживайтесь проверенного и верного способа:

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

Или еще лучше, взгляните на ПДО методы.

Вместо этого вы могли бы использовать что-то вроде этого, было бы приятнее:

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

И используйте его так:

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

Это все еще некрасиво, но немного лучше.

Я предполагаю, что вы хотите перебрать значения, полученные из базы данных?

Вам следует изменить свой цикл на 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>";
}

Ну, вероятно, вы можете попробовать это:

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
}

Я предполагаю, что у вас есть ошибка в вашем запросе в «testtype = test», потому что test — это строка (или это столбец?). Поэтому он был вызван только один раз только для того, чтобы найти ошибку.

Как отмечает Никф, PDO может многое предложить.С PDOStatement реализует Проходимый интерфейс, вы можете использовать его непосредственно в foreach.

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

PDO также поддерживает подготовленные заявления, которые обеспечивают эффективность и безопасность, которых не хватает старому драйверу MySQL.

В нынешнем виде vraagOp Похоже, это плохой дизайн для уровня доступа к данным.

Ответ, который я дал на ваш последний вопрос (который вы не приняли...), решает эту проблему.

Он поддерживает сопоставление определенных предложений table/where и использует правильный ресурс для каждого вызова.

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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top