It looks like you are mixing up some things. Much of what you have should work with just bit of information.
If you are going to send the data in the url (Buy.php?ID=<?=$ID?>), otherwise know as GET ($_GET), you do not have to send it as part of a form. Just have PHP generate the url like you have already done in your code.
<a href="http://localhost/CI/Buy.php?ID=<?=$ID?>"> <i>Buy</i></a>
Do note that you can send more than one piece of data via the url by just separating each item with an ampersand (&).
Also sending data via GET presents a few problems like if the user should revisit the page by clicking it in their history or if they should manually change the url. So usually POST is better.
If there is data that has to come from a form I would say send it all via POST ($_POST) and then use javascript to submit it.
function submitMe()
{
document.MyTable.submit();
}
If there is some piece of data that is set by PHP and needs to be sent to the next page put it into a "hidden" input field.
Lastly note that $REQUEST is a PHP super global that can get the data from both POST and GET. So make sure your GET data doesn't have the same key as some POST data if you are going to use $REQUEST.
$_POST['ID']
$_GET['ID']
For the above example if you use a $_REQUEST['ID'] you may find the results to not be what you want.
Next your query is bit off. Try this
$QueryQ="SELECT * FROM `MyTable WHERE `ID` = '" . $PostID . "'";
Lastly if the data is being submitted from a web page I highly recommend that you check it before you use it to get data form your database. Even a rookie hacker knows how to do a SQL injections. Check out the [man]mysql_real_escape_string[/man] function.