有些人说你不应该多次使用mysql_fetch_assoc
,为什么会这样?
例如:我想显示两个表,其中一个用户支付了会员资格,另一个用户没有支付,所以不是查询数据库2次,而是一次查询它并获得两个类型的$result
变量用户然后我运行循环mysql_fetch_assoc
并查看list['membership'] = 'paid'
然后回显......
第二次循环mysql_fetch_assoc
并查看list['membership'] = 'free'
然后回显......
考虑到我注册和取消注册的用户数量相等,使用的资源更少。
答案 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_row
,mysql_fetch_assos
和mysql_fetch_array
。
答案 2 :(得分:3)
当有人说你不能两次拨打mysql_fetch_assoc()
时,他们的意思是针对相同的资源。传递给mysql_fetch_assoc()
的资源结果是通过引用完成的。在第二次使用mysql_fetch_assoc()
之前,您需要重置指针的位置。
编辑:为此,请尝试使用mysql_data_seek()
。
答案 3 :(得分:0)
看来你想要做的是将查询结果视为数组(字段)的数组(行)。但这并不是mysql库提供的。我经常做的事实上是将行复制到一个数组数组中(只需在mysql_fetch上循环直到空)然后使用PHP为此提供的数组函数使用我自己的行集执行我想要的操作。这也最大限度地减少了表锁定的时间。