1 (изменено: Hase, 2012-07-15 20:58:52)

Тема: Странное поведение сессий.

Здравствуйте!)
У меня следующая проблема: сессии отправляются через раз... Если более точно, то если пользователь в первый раз отправляет форму, то сессии передаются хорошо. Если пользователь опять вводит информацию в эту форму и отправляет ее, то сессии не передаются. Если еще раз провести эту процедуру, то сессию опять передаются. Короче, они не передаются каждый второй раз. Ниже привожу скрипты...

<form action="php_scripts/search.php" method="POST" id="form" onsubmit="document.getElementById('ajaxloader').style.opacity='1'">
    <table style="width:95%;text-align:center;">
<?php
$result = mysql_query("select countries from search");
$select = '<select class="select" name="country_id" id="country_id"><option value="0">Выберите страну</option>';
for ($c=1; $c<mysql_num_rows($result)+1; $c++) {
    $f = mysql_fetch_array($result);
    $select .='<option value="'.$c.'">'.$f['countries'].'</option>';
}
$select .= '</select>';
echo <<<_END
        <tr>
            <td style="width:50%">
                Отправление
            </td>
            <td>
                Прибытие
            </td>
        </tr>
        <tr>
                <td>
                <select class="select" id="countr" name="countr1">
                    <option>Россия</option>
                </select>
            </td>
            <td>
                $select    
            </td>
        </tr>
        <tr>
            <td>
                <select class="select" id="cities" name="cities1">
                    <option>Москва</option>
                </select>
            </td>
            <td>
                <select class="select" name="region_id" id="region_id">
                    <option value="0">Выберите город</option>
                </select>    
            </td>
        </tr>
        <tr>
            <td colspan="2">
                Дата
            </td>
        </tr>
        <tr>
            <td>
                <input class="select" type="text" id="datepicker1" name="first">
            </td>
            <td>
                <input class="select" type="text" id="datepicker2" name="second">
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="image" src="images/project/submit.png" class="submit" style="margin:0" onmouseover="this.src='images/project/submitact.png'" onmouseout="this.src='images/project/submit.png'" >
            </td>
        </tr>
_END;
?>
         </table>
</form>

- Это сама форма.


<?php 
    include "functions.php";
    function CheckDMY($val) {
    if(preg_match("/^(\d\d)\.(\d\d)\.(\d\d\d\d)$/",$val,$dmy)==0) { return false; }
    if(!checkdate($dmy[2],$dmy[1],$dmy[3])) { return false; }
    if(!mktime(0,0,0,$dmy[2],$dmy[1],$dmy[3])) { return false; }
    return $dmy; 
    }
    $country = $city = $fdate = $sdate = "";
    session_start();
    if (isset($_SESSION['country_id'])) destroySession();
    if (isset($_POST['country_id'])) {
        $country = $_POST['country_id'];
        $city = $_POST['region_id'];
        $fdate = $_POST['first'];
        $sdate = $_POST['second'];
        if ((CheckDMY($fdate) == false) or (CheckDMY($sdate) == false) or ($country == "0") or ($city == "0")) {
        echo  "<br><div class='errormsg round' id='errormsg'>Возможно, одно из полей не заполнено, или заполнено некорректно. Проверьте правильность введенных Вами данных.</div><br>";
        } else {
            $error1 = $error2 = $error3 = $error4 = $error5 = "";
            $error = FALSE;
            $temp = explode(".",$fdate);
            $t = mktime(0,0,0, intval($temp[1]), intval($temp[0]), intval($temp[2])); 
            if (time() > $t) {
                $error2 = "Введенная дата в первом поле не может быть отправлена. Проверьте правильность введенных Вами данных.";
                $error = TRUE;
            } 
            $temp1 = explode(".",$sdate);
            $t1 = mktime(0,0,0, intval($temp1[1]), intval($temp1[0]), intval($temp1[2])); 
            if (time() > $t1) {
                $error3 = "Введенная дата во втором поле не может быть отправлена. Проверьте правильность введенных Вами данных.";
                $error = TRUE;
            }
            if ($t1<$t) {
                $error4 = "Введенная дата во втором поле не может быть раньше даты в первом поле. Проверьте правильность введенных Вами данных.";
                $error = TRUE;
            }
            if ($fdate == $sdate) {
                $error5 = "Введенная дата в первом поле совпадает с датой во втором поле. Проверьте правильность введенных Вами данных.";
                $error = TRUE;
            }
            if ($error == FALSE) {
                $_SESSION['country_id'] = $country;
                $_SESSION['region_id'] = $city;
                $_SESSION['date'] = "$fdate - $sdate";
                echo "<script> document.location.href='../tour.php' </script>";
            } else {
                echo "<br><div class='errormsg round' id='errormsg'>";
                if ($error1<>"") {
                    echo "<br>$error1<br>";
                }
                if ($error2<>"") {
                echo "<br>$error2<br>";
                }
                if ($error3<>"") {
                    echo "<br>$error3<br>";
                }
                if ($error4<>"") {
                    echo "<br>$error4<br>";
                }
                if ($error5<>"") {
                    echo "<br>$error5<br>";
                }
                echo "</div><br>";
            }
        }
    }
?>

--- Это скрипт проверки формы. (search.php)


<?php
$country = $city = $date = "";
if (isset($_SESSION['country_id'])) {
    $country = $_SESSION['country_id'];
    $city = $_SESSION['region_id'];
    $date = $_SESSION['date'];
}
$result = mysql_query("select countries from search");
$select = '<select class="select" name="country" id="country"><option value="0">Выберите страну</option>';
for ($c=1; $c<mysql_num_rows($result)+1; $c++) {
    $f = mysql_fetch_array($result);
    if ($c == $country) {
        $select .='<option selected="selected" value="'.$c.'">'.$f['countries'].'</option>';
    } 
    else {
        $select .='<option value="'.$c.'">'.$f['countries'].'</option>';
    }
}
$select .= '</select>';


    if (($country == 0) or ($country == "")){
        $selectcity = '<select class="select" name="city" id="city"><option value="0">Выберите город</option></select>';
    } //Если не выбрана страна, то города не отображаются
    if ($country == 1) {
        $selectcity = '<select class="select" name="city" id="city"><option value="1">Аналия</option></select>';
    } //Если выбрана турция, то отображается Анталия
    if ($country == 2) {
        if ($city == 2) {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Бургас</option><option value="2" selected="selected">Варна</option></select>';
        } //Болгария, Варна
        else {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Бургас</option><option value="2">Варна</option></select>';
        } //Болгария, Бургас
    }
    if ($country == 3) {
        if ($city == 2) {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Хургада</option><option value="2" selected="selected">Шарм</option></select>';
        } //Егпет, Шарм
        else {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Хургада</option><option value="2">Шарм</option></select>';
        } //Египет Хургада
    }
    if ($country == 4) {
        if ($city == 2) {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Ираклион</option><option value="2" selected="selected">Каламата</option><option value="1">Корфу</option><option value="1">Кос</option><option value="1">Ларнака</option><option value="1">Радос</option><option value="1">Салоники</option></select>';
        } //Греция Каламата
        elseif ($city == 3) {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Ираклион</option><option value="2">Каламата</option><option selected="selected" value="1">Корфу</option><option value="1">Кос</option><option value="1">Ларнака</option><option value="1">Радос</option><option value="1">Салоники</option></select>';
        } //Греция Корфу
        elseif ($city == 4) {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Ираклион</option><option value="2">Каламата</option><option value="1">Корфу</option><option  selected="selected" value="1">Кос</option><option value="1">Ларнака</option><option value="1">Радос</option><option value="1">Салоники</option></select>';
        } //Греция Кос
        elseif ($city == 5) {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Ираклион</option><option value="2">Каламата</option><option value="1">Корфу</option><option value="1">Кос</option><option selected="selected" value="1">Ларнака</option><option value="1">Радос</option><option value="1">Салоники</option></select>';
        } //Греция Ларнака
        elseif ($city == 6) {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Ираклион</option><option value="2">Каламата</option><option value="1">Корфу</option><option value="1">Кос</option><option value="1">Ларнака</option><option selected="selected" value="1">Радос</option><option value="1">Салоники</option></select>';
        } //Греция Родос
        elseif ($city == 7) {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Ираклион</option><option value="2">Каламата</option><option value="1">Корфу</option><option value="1">Кос</option><option value="1">Ларнака</option><option value="1">Радос</option><option selected="selected" value="1">Салоники</option></select>';
        } 
        else {
            $selectcity = '<select class="select" name="city" id="city"><option value="1">Ираклион</option><option value="2">Каламата</option><option value="1">Корфу</option><option value="1">Кос</option><option value="1">Ларнака</option><option value="1">Радос</option><option value="1">Салоники</option></select>';
        } //Греция Салоники
    }
?>
<div class="round block" style="margin: 20px auto">
    <div class="blockcontent">
        <div class="round headcontent"><b><h2 style="margin:0;padding:5px">Оставьте, пожалуйста, заявку</h2></b></div>
        <table style="width:100%">
            <tr>
                <td style="width:40%; padding:10px">
                    Вы можете оставить заявку, и в скором времени с Вами свяжется представитель нашей компании. Для того, чтобы с Вами связались, необходимо заполнить форму справа.
                </td>
                <td style="width:60%">
                    <form>
<?php
echo <<<_END
                        <table style="width:90%; float:right">
                            <tr>
                                <td style="width:50%; text-align:left">E-mail</td>
                                <td style="width:50%"><input class="select clear" value="Введите Ваш e-mail"></td>
                            </tr>
                            <tr>
                                <td style="width:50%; text-align:left">Телефон</td>
                                <td style="width:50%"><input class="select clear" value="Введите номер Вашего телефона"></td>
                            </tr>
                            <tr>
                                <td style="width:50%; height: 30px" colspan="2">Ваша заявка</td>
                            </tr>
                            <tr>
                                <td style="width:50%; text-align:left">Страна прибытия</td>
                                <td style="width:50%">$select</td>
                            </tr>
                            <tr>
                                <td style="width:50%; text-align:left">Город прибытия</td>
                                <td style="width:50%">$selectcity</td>
                            </tr>                            
                        </table>
                    </form>
_END;
?>
                </td>
            </tr>
        </table>
    </div>
</div>

--- Часть страницы, куда должны приходить сессии. Каждый второй раз $_SESSION['country_id'] не приходит.


<?php
require 'login.php';

mysql_connect($dbhost, $dbuser, $dbpass) or die(mysql_error());
mysql_query('SET NAMES cp1251');
mysql_query("SET CHARACTER SET 'cp1251'");
mysql_select_db($dbname) or die (mysql_error());

function queryMysql($query) // выдает запрос к базе данных, иначе выдает ошибку
{
 $result = mysql_query($query) or die(mysql_error());
 return $result;
}

function destroySession() 
{
 $_SESSION=array();
 if (session_id() != "" || isset($_COOKIE[session_name()]))
     setcookie(session_name(), '', time()-2592000, '/');
 session_destroy();
}

function sanitizeString($var) 
{
 if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) 
 {
  $str = stripslashes($var);
  $str = mysql_real_escape_string($var);
 } 
 else 
 {
  $str = mysql_real_escape_string($var);
 }
 return $var;
}
?>

- functions.php

2

Re: Странное поведение сессий.

Если вам будет понятней, то вот сайт -  turol.ru

Форма - поиск тура. При первом вводе идет все гладко. Если вы попробуете заново ввести данные в форму и отправить ее, то данные в форме (в центре страницы) не будут соответствовать данным, введенным в форме поиска.

3

Re: Странное поведение сессий.

Судя по всему, каждый второй раз сессии очищаются в этой строке:

if (isset($_SESSION['country_id'])) destroySession();

4

Re: Странное поведение сессий.

Hanut сказал:

Судя по всему, каждый второй раз сессии очищаются в этой строке:

Согласен, но если идти дальше по скрипту, они должны заново создаться...

5

Re: Странное поведение сессий.

Hase сказал:

Согласен, но если идти дальше по скрипту, они должны заново создаться...

Функция session_destroy(); удаляет идентификатор сессии, а новый не создается. То есть после session_destroy() отсутствует функция session_start(), поэтому новая сессия отсутствует. Я бы советовал избежать обнуление сессии, а при необходимости просто очистить переменные сессии, но саму ее не сбрасывать; это просто неэффективно, по причине того, что на сервере будет создана целая куча временных сессионных файлов.

6

Re: Странное поведение сессий.

Хм, спасибо за совет, учту smile