Пользователь выходит из системы после первого комментария

0

Я использую систему входа, которая работает хорошо. Я также использую систему комментариев. Функция комментариев не появляется, если пользователь не вошел в систему (как показано ниже в commentformonoff.php).

Когда пользователь делает комментарий, информация передается из функции "show_commentbox" в файл comments2a.php. Затем информация передается в файл comments2.php.

Когда сайт сначала открывается в браузере, после входа в систему и создания комментария пользователь выходит из системы. После регистрации во второй раз в течение того же сеанса браузера пользователь больше не выходит из системы после создания комментария.

Как я могу заставить пользователя войти в систему после создания первого комментария?

Спасибо заранее,

Джон

Функция входа:

function show_loginform($disabled = false)
{

    echo '<form name="login-form" id="login-form" method="post" action="./index.php?'.$_SERVER['QUERY_STRING'].'"> 

    <div class="usernameformtext"><label title="Username">Username: </label></div> 
    <div class="usernameformfield"><input tabindex="1" accesskey="u" name="username" type="text" maxlength="30" id="username" /></div> 


    <div class="passwordformtext"><label title="Password">Password: </label></div> 
    <div class="passwordformfield"><input tabindex="2" accesskey="p" name="password" type="password" maxlength="15" id="password" /></div> 


    <div class="registertext"><a href="http://www...com/.../register.php" title="Register">Register</a></div> 
    <div class="lostpasswordtext"><a href="http://www...com/.../lostpassword.php" title="Lost Password">Lost password?</a></div> 

  <p class="loginbutton"><input tabindex="3" accesskey="l" type="submit" name="cmdlogin" value="Login" ';
    if ($disabled == true)
    {
        echo 'disabled="disabled"';
    }
    echo ' /></p></form>';


}

Commentformonoff.php:

<?php
if (!isLoggedIn())
{
    if (isset($_POST['cmdlogin']))
    {
        if (checkLogin($_POST['username'], $_POST['password']))
        {
            show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl);
        } else
        {
            echo "<div class='logintocomment'>Login to comment</div>";

        }
    } else
    {

        echo "<div class='logintocomment'>Login to comment</div>";
    }

} else
{
    show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl);
}
?>

Функция "show_commentbox":

function show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl)
{
echo '<form  action="http://www...com/.../comments/comments2a.php" method="post"> 
    <input type="hidden" value="'.$_SESSION['loginid'].'" name="uid">
    <input type="hidden" value="'.$_SESSION['username'].'" name="u">
    <input type="hidden" value="'.$submissionid.'" name="submissionid">  
    <input type="hidden" value="'.stripslashes($submission).'" name="submission">
    <input type="hidden" value="'.$url.'" name="url">
    <input type="hidden" value="'.$submittor.'" name="submittor">
    <input type="hidden" value="'.$submissiondate.'" name="submissiondate">
    <input type="hidden" value="'.$countcomments.'" name="countcomments">
    <input type="hidden" value="'.$dispurl.'" name="dispurl">



    <label class="addacomment" for="title">Add a comment:</label>

    <textarea class="checkMax" name="comment" type="comment" id="comment" maxlength="1000"></textarea>  

    <div class="commentsubbutton"><input name="submit" type="submit" value="Submit"></div> 
</form>
'; 
}

Включено в комментарии2a.php:

$uid = mysql_real_escape_string($_POST['uid']);
$u = mysql_real_escape_string($_POST['u']);

$query = sprintf("INSERT INTO comment VALUES (NULL, %d, %d, '%s', NULL)", $uid, $subid, $comment);

mysql_query($query) or die(mysql_error());

$lastcommentid = mysql_insert_id();
header("Location: comments2.php?submission=".$submission."&submissionid=".$submissionid."&url=".$url."&submissiondate=".$submissiondate."&comment=".$comment."&subid=".$subid."&uid=".$uid."&u=".$u."&submittor=".$submittor."&countcomments=".$countcomments."&dispurl=".$dispurl."#comment-$lastcommentid");
exit(); 

Включено в комментарии2.php:

if($_SERVER['REQUEST_METHOD'] == "POST"){header('Location: http://www...com/.../comments/comments2.php?submission='.$submission.'&submissionid='.$submissionid.'&url='.$url.'&submissiondate='.$submissiondate.'&submittor='.$submittor.'&countcomments='.$countcomments.'&dispurl='.$dispurl.'');}

$uid = mysql_real_escape_string($_GET['uid']);
$u = mysql_real_escape_string($_GET['u']);

EDIT: Кто-то сказал, что это может быть полезно, поэтому я отправляю их.

function isLoggedIn()
{

    if (session_is_registered('loginid') && session_is_registered('username'))
    {
        return true; // the user is loged in
    } else
    {
        return false; // not logged in
    }

    return false;

}

function checkLogin($u, $p)
{
global $seed; // global because $seed is declared in the header.php file

    if (!valid_username($u) || !valid_password($p) || !user_exists($u))
    {
        return false; // the name was not valid, or the password, or the username did not exist
    }

    //Now let us look for the user in the database.
    $query = sprintf("
        SELECT loginid 
        FROM login 
        WHERE 
        username = '%s' AND password = '%s' 
        AND disabled = 0 AND activated = 1 
        LIMIT 1;", mysql_real_escape_string($u), mysql_real_escape_string(sha1($p . $seed)));
    $result = mysql_query($query);
    // If the database returns a 0 as result we know the login information is incorrect.
    // If the database returns a 1 as result we know  the login was correct and we proceed.
    // If the database returns a result > 1 there are multple users
    // with the same username and password, so the login will fail.
    if (mysql_num_rows($result) != 1)
    {
        return false;
    } else
    {
        // Login was successfull
        $row = mysql_fetch_array($result);
        // Save the user ID for use later
        $_SESSION['loginid'] = $row['loginid'];
        // Save the username for use later
        $_SESSION['username'] = $u;
        // Now we show the userbox
        return true;
    }
    return false;
}
  • 0
    Работает ли приложение php из Apache2 на сервере Debian?
  • 0
    Это на хостинге Unix. Я не уверен насчет Apache2 или Debian. Я новичок.
Теги:

3 ответа

1

Я думаю, что ваша ошибка в isLoggedIn() вы могли бы опубликовать это. Потому что у вас есть два пути для записи поля комментариев. Это может означать, что при входе в систему выбирается первый путь, но при обновлении, когда вы должны были перейти ко второму пути, это не так.

Ошибка также может быть в checkLogin, не устанавливая переменную сеанса?

отправьте как isLoggedIn(), так и checkLogin():)


<?php
if (!isLoggedIn()) // most likely the place of error
{
    if (isset($_POST['cmdlogin']))
    {
        if (checkLogin($_POST['username'], $_POST['password'])) // setting session variable correctly?
        {
            // path one
            // are you supposed to set some session variables here? or in checkLogin()?
            show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl);
        } else
        {
            echo "Login to comment";

        }
    } else
    {

        echo "Login to comment";
    }

} else
{
    // path two
    show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl);
}
?>

Изменить: В isLoggedIn() используйте isset() вместо session_is_registered(). session_is_registered() устарела с PHP 5.3.0. if(isset($_SESSION['loginid']) && isset($_SESSION['username'])

В нижней части файла CommentOnOff.php вы можете ввести этот код? var_dump($_SESSION) Он должен распечатать все, что содержится в сеансе. Затем вы можете увидеть, действительно ли имя пользователя и имя пользователя хранятся в сеансе:)

  • 0
    Хорошо спасибо. Я разместил isLoggedIn () и checkLogin ().
  • 0
    Модифицированный ответ для вас :)
Показать ещё 1 комментарий
0

У меня были очень похожие симптомы в веб-приложении, которое я разрабатывал.

Попробуйте добавить файл favicon.ico(пустой в порядке) в корневую директорию вашего приложения.

Это симптомы, которые я испытывал...

Firefox:

Пользователь регистрируется, появляется первая страница "вошла в систему". Пользователь нажимает ссылку и больше не входит в систему. Пользователь регистрируется снова и получает первую страницу "вошел в систему". Пользователь нажимает ссылку и все еще входит в систему. Пользователь продолжает использовать приложение как зарегистрированное пользователем без проблем.

Chrome:

Пользователь регистрируется, появляется первая страница "вошла в систему". Пользователь нажимает ссылку и больше не входит в систему. Пользователь регистрируется снова и получает первую страницу "вошел в систему". Пользователь нажимает ссылку и снова выходит из системы. Пользователь просто не может оставаться в системе после первой страницы входа в систему.

Я проверил журналы ошибок и увидел, что каждый запрос ищет файл favicon.ico. Я добавил пустой файл favicon.ico в корневой каталог приложений и проблема остановлена.

  • 2
    Это вам нужно объяснить немного больше. Это меня ошарашило. С чем это поможет? Другое, затем удаление 404-х из ваших журналов доступа
  • 0
    Да, это кажется странным. Это удивило меня, когда это решило мою проблему, но это сделало. Приложение, которое я разрабатывал, прекрасно работало на моей машине для разработки (без favicon.ico), поэтому я знал, что мой код в порядке. Я провел некоторое время, экспериментируя с настройками php.ini, и в качестве последнего средства я добавил favicon.ico на сервер, который вызывал проблему, чтобы сохранить журнал ошибок. Внезапно моя проблема входа / выхода была решена.
0

Было бы неплохо узнать больше о том, что происходит. Это всего лишь фрагменты, которые вы считали важными, а не все.

Есть несколько вопросов, связанных с кодом, который вы указали: - Как файл commentformonoff.php соединяется с другими файлами php, которые вы отправили? - Что происходит в функциях isLoggedIn() и checkLogin()? - Почему вы разделяете функции на комментарии2.php и comments2a.php? Перенаправление без причины просто добавляет задержку к выполнению. Есть ли причина, по которой вы не можете обработать запрос? - значения комментариев попадают непосредственно в запрос без санитарии в комментарии2a.php, что является серьезным нарушением безопасности. - В comments2a.php вы создаете перенаправление и передаете переменные GET, а в комментарии2.php вы проверяете POST и перенаправляете, если найден пост-запрос. Почему вы это делаете?

Проверьте Smarty, если это возможно, это не большие накладные расходы, и вам не нужно писать функции, выплевывая html-формы. Или вы можете включить html-код непосредственно в код, если внутри нет параметров, с закрытием и повторным открытием тегов php.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню