It doesn't look like the recordsets on your page are working correctly.
If i view source of the page and look at the code for the first gift box:
<form id="threePForm" name="muirhead_1_ATC_" method="POST" action="/dev/gift-boxes.php">
<input type="hidden" name="muirhead_1_ID_Add" value="" >
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<th> </th>
<th> </th>
<th> </th>
<th>Quantity</th>
</tr>
<tr id="buttons">
<td><input type="submit" id="atc" name="muirhead_1_ATC" value="Add to Cart" class="button" /></td>
<td><input type="submit" id="checkout" name="muirhead_Checkout_1" value="Checkout" class="button" /></td>
<td><input type="submit" id="continueShopping" name="continueShopping" value="Continue Shopping" class="button lastOne" /></td>
<td><input class="quantityField" name="muirhead_1_Quantity_Add" type="text" value="1" /></td>
</tr>
</table>
</form>
the iD element does not have a value:
<input type="hidden" name="muirhead_1_ID_Add" value="" >
in the original PHP code, the ID is coming from the recordset. Double check that your record sets are defined properly.
For the checkbox selection, you would need to define a new column in your cart object. in the add to cart button behavior, set the new option column to be updatable from a checkbox. You can then add the additional checkboxs to the page using the same name as the fisrt one created by the eCart Add to cart behaivor, make sure the name ends with [] so that all selected items will be passed as an array.
you can then add the following code at line 1 to convert the array to a comma seperated list:
<?php
if($_SERVER["REQUEST_METHOD"] == "POST") {
foreach($_POST as $key => $val) {
if(is_array($_POST[$key])) $_POST[$key] = implode(", ", $_POST[$key]);
}
}
?>