문제

나는 답을 얻었다 오래된 질문 거의 작동합니다.

나는 기능이 있고

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

또는 더 나은 것을 살펴보십시오 pdo 행동 양식.

대신 이와 같은 것을 사용할 수 있습니다. 더 좋을 것입니다.

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

여전히 추악하지만 조금 더 좋습니다.

데이터베이스에서받은 값을 반복하고 싶다고 생각하십니까?

루프를 a로 변경해야합니다 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
}

내 생각에 Test는 문자열이기 때문에 "TestType = test"에서 쿼리에 오류가 발생할 수 있습니다. 따라서 열이기 때문에 오류를 찾기 위해 한 번만 호출되었습니다.

Nickf가 언급했듯이 PDO는 제공해야 할 것이 많습니다. 부터 PDOStatement 상행 트래버스 가능 인터페이스, a에서 직접 사용할 수 있습니다 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 데이터 액세스 계층의 디자인이 좋지 않은 것 같습니다.

내가 당신의 마지막 질문에 대해 준 대답 (당신이 받아들이지 않은 ...)은이 문제를 해결합니다.

그것은 특정 테이블/위치에서 조항을 매핑하고 각 호출에 대해 올바른 리소스를 사용합니다.

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