Класс базы данных PHP MYSQL - получить метод mysql_fetch_assoc для перехода к следующей записи - PullRequest
0 голосов
/ 06 января 2012

Я создаю собственный класс базы данных для использования с моими проектами. Я построил метод fetchAssoc (), однако, когда я вызываю его в цикле while, он не переходит к следующей записи. Он вызывает первую запись снова и снова, пока не истечет время ожидания сценария.
Ниже приведен соответствующий код:

Методы

function runQuery($q)
{
    $this->numQueries++;
    $this->query = ($q);
    $this->setResult($q);
    $this->result;  
}

function fetchAssoc($q = NULL)
{
    if($q == NULL)
    {
        $q = $this->query;  
    }
    $this->setResult($q);
    if($q == NULL  || mysql_num_rows($this->result) < 1)
    {
        return NULL;    
    }
    else 
    {
        return mysql_fetch_assoc($this->result);
    }
}
    function setResult($q = NULL)
{
    if($q == NULL)
    {
        $q = $this->query;  
    }
    if($q == NULL)
    {
        return FALSE;   
    }
    else
    {
        $this->result = @mysql_query($q);   
    }
}

SCRIPT:

//runQuery -- Should run the query and store the Result and Query
$q = "SELECT * FROM make ORDER BY make";
$db->runQuery($q);

//fetchAssoc --  return current row of result set and move pointer ahead
foreach($db->fetchAssoc() as $key => $value)
{
echo $value." has a foreign key of: ".$key."<br />";    
}
//Also tried
while($row = fetchAssoc())
{
    echo $value." has a foreign key of: ".$key."<br />";    
}

1 Ответ

2 голосов
/ 06 января 2012

Это потому, что вы выполняете запрос каждый раз, когда вызываете функцию fetchAssoc (по крайней мере, это то, что я думаю, что setResult должен делать при просмотре вашего кода). После сброса запроса вы возвращаете первую ассоциацию из результата, которая приводит к массиву. Поскольку он продолжает приводить к первой ассоциации вашего результирующего набора, код продолжает цикл до тех пор, пока не будет достигнуто время max_execution.

fetchAssoc не должен делать ничего, кроме как вернуть mysql_fetch_assoc для этого-> результата, если я правильно понимаю ваш код.

Я сломаю это для вас:

//first lines of fetchAssoc
if($q == NULL)
{
    $q = $this->query;  
}

в фрагменте кода, использующем эту функцию, вы не передаете $ q, поэтому $ q всегда является $ this-> query.

$this->setResult($q);

Затем вы вызываете setResult, который в соответствии с вашим собственным комментарием выполняет запрос и устанавливает this-> result. Поэтому, если вы вызываете функцию fetchAssoc, запрос $ this-> выполняется каждый раз, и каждый раз результат обновляется с результатом для этого запроса.

if($q == NULL  || mysql_num_rows($this->result) < 1)
{
    return NULL;    
}
else 
{
    return mysql_fetch_assoc($this->result);
}

Поскольку $ q никогда не может быть нулевым (вы дали ему значение в этом случае ранее), единственная проверка здесь - на num_rows. Пока это так, вы возвращаете первую строку $ this-> result с fetch_assoc. Это всегда одна и та же строка, поскольку вы обновляете запрос и результат, а также каждый вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...