Según el manual:
http://www.php.net/mysql_fetch_assoc Cita: Devuelve un array asociativo de cadenas que corresponde a la fila recuperada, o FALSE si no hay más filas disponibles.
Y yo creo que te está devolviendo FALSE, pues el mensaje de error indica eso.
Por eso es mala idea usar do-while, un while() siempre resulta mejor.