Mi pare ovvio:
Ogni volta nel while richiami la funzione recupero_db, che rifà la query sul db e ti restituisce di consegueza sempre il primo elemento.
Se la tua funzione si trova in una classe, potresti mettere il risultato della query in una campo privato e crearti un metodo getNext() che fa mysql_fetch_assoc su quel campo. Se non usi una classe devi usare una variabile globale.
In alternativa, ma non so quanto sia efficiente, potresti prepararti l'array in modo da non dover usare fetch_assoc
Codice PHP:
function recupero_db($campi,$tabella,$filtri) {
$query_sql = "SELECT $campi FROM $tabella$filtri";
$result_sql = mysql_query($query_sql, getConnection());
$result = array();
while($row_sql = mysql_fetch_assoc($result_sql) ){
array_push($result, $row_sql);
}
return $result;
}
// nella pagina
$rows = recupero_db("...", "...", "...");
foreach($rows as $row){
echo "...".$row['pubb_id']."...";
}