The code you showed is concatenating individual values to a string, and presumably this is what you want.
If you are asking “how can I also reuse that data somewhere else?” then one answer is to capture the original query as an array variable and then create your string as you did, but to then go on and reuse the array to output a table somewhere else in your script.
$product_list = "";
$sql = mysql_query("SELECT * FROM products ORDER BY date_added DESC");
$rows = mysql_fetch_array($sql); // $rows is a new var holding the array
if (count($rows)) { // check count of array here instead of $productCount
foreach($rows as $row)){ // use foreach() construct
$id = $row["id"];
$product_name = $row["product_name"];
$price = $row["price"];
$date_added = strftime("%b %d, %Y", strtotime($row["date_added"]));
$product_list .= "Product ID: $id - <strong>$product_name</strong> - $$price - <em>Added $date_added</em> <a href='inventory_edit.php?pid=$id'>edit</a> • <a href='inventory_list.php?deleteid=$id'>delete</a><br />";
}
} else {
$product_list = "You have no products listed in your store yet";
}
// then, somewhere else in your script:
foreach($rows as $row)){ // use foreach() construct
// output your table
}
However, if your Q was “How do I output the whole thing as a table instead of a string?”, then all you have to do is alter the concatenation in the loop - where you use the string to collect up all the bits of your table.