Me desculpe se eu entendi mal a pergunta - o código que você postou não parece produzir a saída que você postou, no entanto, aqui estão meus dois centavos; Eu acho que para corrigir o problema que você está tendo com os cabeçalhos da tabela se repetindo ao longo dos resultados, você precisa colocar o bloco que diz:
echo '<tr>';
echo '<th style="border-color:#000000; border-style:solid; border-width:1px;font-size:10px;background-image:url(images/buts3.png);color:white"">Product Code</th>';
echo '<th style="border-color:#000000; border-style:solid; border-width:1px;font-size:10px;background-image:url(images/buts3.png);color:white"">Name</th>';
No lado de um bloco if, de modo que seja exibido apenas uma vez:
if(!$displayed) {
$displayed = true;
echo '<tr>';
echo '<th style="border-color:#000000; border-style:solid; border-width:1px;font-size:10px;background-image:url(images/buts3.png);color:white"">Product Code</th>';
echo '<th style="border-color:#000000; border-style:solid; border-width:1px;font-size:10px;background-image:url(images/buts3.png);color:white"">Name</th>';
}
E não se esqueça de inicializar $displayed como false antes o laço while.
Além disso, mas um pouco além da questão real, este código que você postou é muito inseguro, pois é vulnerável a um ataque conhecido como injeção de sql. Eu recomendo que você use algo como declarações preparadas pelo PDO para garantir que você não sofra problemas de segurança.