Der Code den Du uns zeigst kann nicht mit dem Code übereinstimmen, der das gezeigte Ergebnis liefert. Nur auf die Sache mit der 999 kann ich Dir Auskunft geben:
Deine Abbruchbedingung greift nicht, weil ($fid == "") niemals wahr wird - es ist ja ein Array. Es greift also nur: while ( $p < 1000 ). Ergo ist p beim letzten Durchlauf gleich 999.
Bemühe Dich um fundiertes Wissen darüber, was Du tust - bevor versuchst einen Shop zu schreiben.