In case you have done already HTML output prior the use of setcookie you need to find the place where your HTML output started. Above that line place the ob_start Docs function which will start output buffering.
With output buffering enabled, your program can still "output" HTML but it will not be send immediately. Then you should be able to call setcookie with no problems:
<?php
function login($username,$pwd)
{
$mysqli=dbconnect(); //no output
$query = "SELECT * FROM `users` WHERE `name`='$username' AND `password`='$pwd'";
$result = $mysqli->query($query) or die($mysqli->error.__LINE__);
if($result->num_rows == 1) {
while($row = $result->fetch_assoc()) {
ob_start(); //set output buffering before setting cookies..
setcookie("ID", $row['userid'], time()+3600*24*365);
ob_end_flush(); // flush data
if (isset($_COOKIE['UNIQUE_ID']))
{echo 'Connected';}
else{echo 'No cookie today :(';}
}
}
dbclose($mysqli); //no output
}
?>
The output buffer will be automatically send to the browser when your script finishes, so there is not much more you need to care about, the rest works automatically.