Drupal 2 blocks same form function with different output not working
I would suggest to prefix the form array with your product ID (I guess $product->pid or something like this) :

function my_module_block_form($form, &amp;$formstate, $product) {
    $form[$product-&gt;pid]['submit_product] = array(
      '#type' =&gt; 'image_button',
      '#button_type' =&gt; 'submit',
      '#src' =&gt; base_path() . path_to_theme() . '/images/buy.gif',
    );
    $form[$product-&gt;pid]['product_name'] = array(
      '#type' =&gt; 'hidden',
      '#value' =&gt; $product-&gt;name,
    );
    return $form;
}


Then the fields shouldn't be overwritten.