Es muy sencillo el problema que tienes. Al añadir el while con ese código dentro, lo que has hecho es crear tantos formularios en tu web como iteraciones hace el while. Entonces, cuando le das a enviar, sólo se envía el formulario cuyo botón has pulsado. La solución también es sencilla, tienes que crear un único formulario, es decir, mover el while de lugar. Algo así:
Código PHP:
Ver original<?php
?>
<div class="producto">
<form action="agregar_producto.php" method="post">
<img src="IMAGENES DE SELECCION/editadas/IMG_3482.JPG" height="127" align="left"/>
<?php
echo "<h1>" .$row['nom_prod'], "</h1>";
$nombre= $row['nom_prod'];
?>
<p> Es una secreción de las glándulas hipofaríngeas de las abejas nodrizas. Todas las larvas son alimentadas con jalea real los tres primeros días de su vida, a partir de esa fecha únicamente la larva elegida reina se alimentará con ella, mientras que las abejas obreras dispondrán de una mezcla de polen, agua y miel. </p>
Cantidad: <input name="cantidad[]" type="text" id="cantidad" size="2"/>
<?php
echo "# ID: " .$row['id_prod'], ", ";
$id = $row['id_prod'];
echo "Precio: " .$row['precio_prod'], " ";
$precio= $row['precio_prod'];
$_SESSION["nom_prod"]= $nombre;
$_SESSION["id_prod"]= $id;
$_SESSION["precio_prod"]= $precio;
}
?>
<input type="submit" value="Añadir al Carro" />
<img src='images/carro_anadir.gif' />
</form>
</div>
Como ves, he hecho dos modificaciones más, el id del div no puede utilizar ahora un campo de la función, ya que el div no se repite, queda fuera del while y, por tanto, no puede usar datos extraidos del fetch.
Por otro lado, he tenido que cambiar el name del input text a cantidad[], ya que el input se repetirá tantas veces como productos haya en la consulta. Añadiendo los corchetes indicas a PHP que ese campo se enviará como un array de valores y no como un valor único. Es decir, en el PHP en que recibes la respuesta tendrás un array de cantidades.
Un saludo.