Siguiendo la linea de Triby, tenés que descartar todo tipo de error, a cualquier nivel, que en tu script, y sin ver el código de lo includes, son varios
Hice una simplificación de tu script
Código PHP:
Ver original<?php
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>titulo</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<!-- BEGIN MAIN WRAPPER -->
<div id="main-wrapper">
<!-- BEGIN MAIN -->
<div id="main">
<!-- BEGIN POST -->
<div id="post">
<h3 class="section-title">Login</h3>
<div class="post-entry">
<?php
$nick = "";
$contrasena= "";
if(isset($_POST["entrar"])){
if($_POST["username"] && $_POST["password"]){
$nick = $_POST['username'];
$contrasena=$_POST["password"];
$dtos = array("password" => "xxxxx", "otracosa" => "zzzz"); if($dtos['password'] == $contrasena){
echo "Bievenido! <a href='index.php'>Comienza a navegar!</a>";
}else{
echo "Contraseña incorrecta";
}
}else{
echo "Todos los campos son necesarios";
}
}else{
echo "Bienveid@, <b>Anonimo!</b><br><br>";
echo"<form name=\"Login\" method=\"post\" action=\"login.php\">
Usuario<br>
<input type=\"text\" name=\"username\" id=\"username\" value=\"$nick\">
<br>
Contrasena <br>
<input type=\"password\" name=\"password\" id=\"password\" value=\"$contrasena\">
<br>
<br>
<input type=\"submit\" name=\"entrar\" value=\"Entrar\"><br><br>
- <a href='registro.php'>No estas registrado? Registrate!</a><br>
- <a href='password.php'>Recordar la contraseña</a>
</form>";
}
?>
</div>
</div>
</div>
</body>
</html>
en esta estructura, funciona y las cookies se crean.
en tu código original hay cosas como esta
$dtos[password]
que debería ser
$dtos['password']
ó
Código PHP:
Ver original<input type=\"text\" name=\"username\" id=\"username\" value=\"".$_GET[nick]."\">
<br>
Contrasena <br>
<input type=\"password\" name=\"password\" id=\"password\" value=\"".$_GET[contrasena]."\">
Cuando $_GET no existe, lo corregi en mi ejemplo, declarando
$nick = "";
$contrasena = "";
Antes del $_POST['entrar'] y redefiniéndolos después.
En tu caso, la cosa funciona a medias, porque la condición para la comparación de clave, se cumple (por lo que asumo que la recuperación de la base de datos es correcta), aunque las cookies no se crean, esto último me tiene algo confundido, siempre tengo en cuenta (También señalado por Triby) que segun el manual de php:
Cita: setcookie() define una cookie a ser enviada junto con el resto de los headers de HTTP. Al igual que otros headers, las cookies deben ser enviadas antes de cualquier tipo de output del script (ésta es una restricción del protocolo). Ésto implica que se hagan las llamadas a esta función anteriormente a cualquier output, incluyendo las etiquetas <html> y <head> al igual que espacios en blanco.
Teniendo en cuenta esto, yo siempre en mis scripts, pongo los headers en una función y los imprimo posteriormente a las cookies, algo así
Código PHP:
Ver originalif($dtos['password'] == $contrasena){
headers();
Pero para probar tu script, puse exprofeso, como se vé los headers al inicio en el HTML, sin embargo las cookies se crearon sin problemas y sin mostrar errores y/o warnings. No sé, puede que haya habido algún cambio, yo ahora probé sobre Windows y con php 5.3.3 con php como fastCgi, cuando vos estas con la 5.2.1, no sé si eso influya.
te recomiendo que pruebes mi script, y sobre ella vayas haciendo una a una las modificaciones a ver en que momento se genera el error.
Saludos
PD
hice una prueba extra subi el test a mi server en internet con php 5.1, las cookies se crearon sin problemas, asi que lo del manual de php, no parece estar al día.
Tambien puse un campo extra para que ingresen un valor cualquiera y verifiquen
Demo
http://foros.emprear.com/php/test_cookie/login.php
una vez loguedos hay un link a la página que lee las cookies