Неправильно установлены файлы cookie в PHP-скрипте - PullRequest
5 голосов
/ 13 мая 2009

Я очень новичок в php и пытаюсь использовать cookie, но он не работает на моем сайте, может кто-нибудь подсказать мне, пожалуйста, что не так в моем коде:

<?php
session_start();
?>
<script>
function Redirect(url)
{
 location.href = url;
}

</script>
<?php 

define('_VALID_ACCESS', true);
include_once "includes/connect.php";
include_once "includes/login.php";


if(empty($_POST['loginname']) || empty($_POST['password']))
{
    $msg = "User or password is empty";
}
else
{
    if(login($_POST['loginname'], $_POST['password']) == true)
    {
        $usern = $_POST['loginname'];
        session_register('loginname');
        $loginname = $usern;        
        sleep(1);
            if(activestatus($_POST['loginname'], $_POST['password']) == true)
            {
            $usern = $_POST['loginname'];
            session_register('loginname');
            $loginname = $usern;        
            sleep(1);

            $hour = time() + 3600;
            setcookie("ID_my_site", $_POST['loginname'], $hour);
            setcookie("Key_my_site", $_POST['password'], $hour); 
            $test = $_COOKIE["ID_my_site"];
            $msg = "<script> Redirect ('home.html?testname=".$test."')</script>"; 
             //header("Location: home.html"); 
            }
            else
            {
            $msg = "<script> Redirect ('valid.php?testname=".$usern."')</script>"; 
            }

    }
    else
    {
        $msg = "<font color=red>User or Password is wrong</font>";
    }
}
echo '<div id="divTarget">' . $msg . '</div>'; 
?>
  <link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
  <link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print">
  <link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">  
 <body>
 <div class="container" id="login_container">
<form id="login" action="action.php" method="post" name="loginform" >
    <fieldset id="login_screen"  style="width:350px">
        <label id="login_label" for="login">User Login </label> 
        <br><br>
        <label for="login">Email Address</label>
        <input type="text" name="loginname" id="loginname" value="email@coolmates.com">    
        <p id="space"><label for="password">Password</label>
        <input type="password" id="password" name="password"  value="********" ></p>
        <input type="checkbox">Keep me signed in until i signout
        <p id="test"><input type="submit" value="Submit"></p>
        <a href="forgetpassword.html">Forgot
        your password</a>&nbsp;&nbsp;|<span id="free">Not a member?</span><a href="regForm.html">Sign up</a><blink><span id="free">Free</span></blink> 
        </p>
    </fieldset>
</form> </div>
</body>

Ответы [ 4 ]

6 голосов
/ 19 мая 2009

Включите display_errors и установите для error_reporting значение E_ALL, и вы должны увидеть сообщение об ошибке «заголовки уже отправлены» - вы должны вызвать setcookie () ДО ТОГО, КАК ЛЮБОЙ HTML ОТПРАВЛЕН. С php.net/setcookie:

setcookie () определяет cookie для отправлено вместе с остальной частью HTTP заголовки. Как и другие заголовки, печенье должен быть отправлен до любого вывода из ваш сценарий (это протокол ограничение). Это требует, чтобы вы сделать вызов этой функции до любой вывод, в том числе и теги, а также любые пробелы.

В блоке кода, который вы разместили этот бит:

<script>
function Redirect(url)
{
 location.href = url;
}

</script>

Выводится прямо в браузер задолго до того, как вы попытаетесь установить файлы cookie.

Ваши две возможности состоят в том, чтобы использовать буферизацию вывода так, чтобы вы выводили все в самом конце, или переключаться на метод, где весь ваш код обработки выполняется сначала в одном сценарии, и там вы устанавливаете значения $ _SESSION и cookie, а затем включите второй скрипт в конец первого, который содержит код для вывода в браузер.

3 голосов
/ 19 мая 2009

Попробуйте это (указав корень вашего сайта):

setcookie("ID_my_site", $_POST['loginname'], $hour,'/');

или попробуйте это (добавив кавычки к вашему имени пользователя):

setcookie("ID_my_site", "$_POST['loginname']", $hour,'/');
2 голосов
/ 13 мая 2009

1-й, вам не нужно регистрировать сессию, вы можете просто сделать.

Так как session_register является предпочтительным методом начиная с 4.1.0 и устарел с PHP 5.3

$_SESSION["loginname"] = $_POST["loginname"]

2-й, если вы собираетесь использовать сеансы, ваш поток может быть лучше, так как это не работает.

$_SESSION["foo"] = 1;
header("Location: stuff.php");

Тогда вы не можете просматривать данные сеанса в stuff.php. Вы можете либо отправить пользователя на главную страницу, и выполнить там аутентификацию, и если она пройдет, вы просто продолжите загрузку главной страницы, а если этого не произойдет, вы отправите пользователя обратно к логину. страница, как это.

if($_SESSION["authenticated"] == 0)
{
    header("Location: login.php");
    die();
}
1 голос
/ 01 июня 2009

Кроме того, вы не должны хранить пароль данных cookie - это большая безопасность Нет-нет !!!

Если вы хотите сделать что-то подобное, установите уникальный - случайный - идентификатор, который изменяется, когда они входят в систему и используют его вместо этого (вам все равно следует MD5)

...