为什么你不应该使用mysql_fetch_assoc超过1次?

时间:2011-04-21 20:54:52

标签: php mysql sql request

有些人说你不应该多次使用mysql_fetch_assoc,为什么会这样?

例如:我想显示两个表,其中一个用户支付了会员资格,另一个用户没有支付,所以不是查询数据库2次,而是一次查询它并获得两个类型的$result变量用户然后我运行循环mysql_fetch_assoc并查看list['membership'] = 'paid'然后回显......

第二次循环mysql_fetch_assoc并查看list['membership'] = 'free'然后回显......

考虑到我注册和取消注册的用户数量相等,使用的资源更少。

4 个答案:

答案 0 :(得分:15)

将您的查询结果集视为香肠,并将mysql_fetch_assoc()视为切掉一块香肠的刀。每次你取一排,另一片香肠被切断,它总是一块新的香肠。你不能去切断之前切过的一块,因为它已经被吃掉了。

答案 1 :(得分:6)

引用Typer85(link):

  

请注意,传递给此函数的资源结果可以被认为是通过引用传递的,因为资源只是指向内存位置的指针。

     

因此,在将指针重置回起始位置之前,不能在同一脚本中循环两次资源结果。

     

例如:

<?php

// Assume We Already Queried Our Database.

// Loop Through Result Set.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// We looped through the resource result already so the
// the pointer is no longer pointing at any rows.

// If we decide to loop through the same resource result
// again, the function will always return false because it
// will assume there are no more rows.

// So the following code, if executed after the previous code
// segment will not work.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// Because $queryContent is now equal to FALSE, the loop
// will not be entered.

?>
  

唯一的解决方法是重置指针,使其在第二个代码段之前再次指向第一行,所以现在完整的代码如下所示:

<?php

// Assume We Already Queried Our Database.

// Loop Through Result Set.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// Reset Our Pointer.

mysql_data_seek( $queryResult );

// Loop Again.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

?>
  

当然,你必须做额外的检查,以确保结果中的行数不是0,否则mysql_data_seek本身将返回false,并且会出现错误提高。

     

另请注意,这适用于获取结果集的所有功能,包括mysql_fetch_rowmysql_fetch_assosmysql_fetch_array

答案 2 :(得分:3)

当有人说你不能两次拨打mysql_fetch_assoc()时,他们的意思是针对相同的资源。传递给mysql_fetch_assoc()的资源结果是通过引用完成的。在第二次使用mysql_fetch_assoc()之前,您需要重置指针的位置。

编辑:为此,请尝试使用mysql_data_seek()

答案 3 :(得分:0)

看来你想要做的是将查询结果视为数组(字段)的数组(行)。但这并不是mysql库提供的。我经常做的事实上是将行复制到一个数组数组中(只需在mysql_fetch上循环直到空)然后使用PHP为此提供的数组函数使用我自己的行集执行我想要的操作。这也最大限度地减少了表锁定的时间。