Pues el mysql_fetch_xxxx (sea array, assoc, object, row, etc ... ) devuelve TRUE hasta que no hay registros q leer en ese caso obtiene un FALSE .. El "secreto" xD está en que a cada pasada del bucle (mejor dicho, a cada llamada de la funcion mysql_fetch_xxx) se mueve el puntero interno de la consulta obtenida por mysql_query() y se avanza un registro en ella (hacia adelante obtenido en el "fetch_xxx" el registro q esté el puntero de la tabla) .. por lo tanto toma un valor nuevo dando "true" si hay o "false" si no hay registros q leer ...
Esos detallitos los puedes ver en el manual de PHP .. ahí ves que parametros requiere -Tal- función y que devuelve la función:
Cita: Fetch a result row as an associative array, a numeric array, or both. (PHP 3, PHP 4 )
array mysql_fetch_array ( resource result [, int result_type ] )
Returns an array that corresponds to the fetched row, or FALSE if there are no more rows.
(este es el ejemplo de fetch_array .. pero es igualmente aplicable al resto de mysql_fetch_xxx)
Un saludo,
Si en algo me equivoco .. me corrigen.