mysql_fetch_arrayを呼び出すたびに クエリから次の行を取得します。そのwhile mysql_fetch_arrayの間、ループはtrueを返し続けます 変数$row2に割り当てるものがまだ残っています 。行がなくなると、変数を与えるものがなくなり、falseが返されます。
ETA: あなたが言及した最後のビットに関しては、あなたの例のようにループの各反復で可変の増分を持つことができますが、それは完全に必要というわけではありません。 $var = mysql_num_rows($data)のように実行すると、返された行数を確認することもできます。 whileの前 ループ。