What the article probably meant was this:
If you attempt to get the first result set, then the result pointer is moved down by 1 row.
Now, you can verify that there is a first result set, but you already have it.
So, for looping purposes, you use a do while loop.
If you use a while loop, then your loop will miss the first result set, since the result pointer no longer points there.
On the other hand, by finding the number of rows returned by the query, the result pointer isnt moved at all (or maybe is moved, but then reset).
This means that using a while loop will include the first result set, as required.
This can be considered cleaner than using a do while loop, since the reader has to read all the way down to view the loop condition, which can be troublesome if the code in between is substantial.
To apply this to your problem, it means that although you have incorporated mysql_num_rows(), you still have the extra mysql_fetch_* that is moving your result pointer by 1 row.