Cookie没有被html表单读取

时间:2013-05-16 10:13:11

标签: php html forms codeigniter cookies

我正在一个人们可以根据邮政编码进行搜索的网站上工作。 第一次访问页面时,会打开一个弹出对话框。你必须填写你的邮政编码和x km的radisu。

提交时,

将cookie设置为“邮政编码”和“半径”。

我在主页上的搜索栏中打印出这些Cookie。但是当我想提交表单时,它没有获得cookie的价值。它不是空的,但当我手动重新键入它然后单击提交它工作。可能是什么问题?

我正在使用Pro6pp(在线邮政编码数据库),我从中获得特定半径的邮政编码。我把它们保存在会话中。

我的对话框:

<div id="dialog" class="hidden" title="Welkom bij OostWestRegioBest.nl">

    <p>Zoeken in uw regio.</p>
    <p>Voer een postcode in zonder letters. Voorbeeld: 1234.</p>
    <br/>
    <form method="post" action="">

        <input type="text" name="postcode" size="25" placeholder="Postcode">
        <select name="radius">
            <option disabled selected>Afstand</option>
            <option value="5">5</option>
            <option value="10">10</option>
            <option value="15">15</option>
            <option value="20">20</option>
            <option value="25">25</option>
        </select> 
        <br/><br/>
        <hr>
        <br/>
            <p style="float: right"><input type="submit" value="Opslaan"></p>
            <input type="hidden" name="submitted" value="true">
            <input type="hidden" name="afstand" value="true" />

</form>

<?php
    if(isset($_POST['postcode']))
    {
        setcookie('radius', $_POST['radius'], time() + (20 * 365 * 24 * 60 * 60));
        setcookie('postcode', $_POST['postcode'], time() + (20 * 365 * 24 * 60 * 60));
        header("location: {$_SERVER['PHP_SELF']}");
    };
?>

我的搜索表单:

    <form name="input" method="post" action="searchresults" class="pro6pp_range">
    <input type="search" onchange="validate()" placeholder="Zoeken..." name="search" size="70">
          <select class="range">
          <? $radius = $this->input->cookie('radius'); ?>
          <? $sesspc = $_SESSION['searched_post_code'] = $_COOKIE['postcode']; ?>
          <? $postcode = $sesspc ?>
            <option selected="selected" value="<?= $this->input->cookie('radius'); ?>"><?= $this->input->cookie('radius');?> km</option>
            <option value="">Kies een afstand</option>
            <option value="5">5 km</option>
            <option value="10">10 km</option>
            <option value="15">15 km</option>
            <option value="20">20 km</option>
            <option value="25">25 km</option>
            <option value="50">50 km</option>
          </select>
        <input type="search" required="required" name="searchpc" class="postcode" value="<?= $postcode ?>" placeholder="Postcode (1234)" maxlength="4">

        <input type="submit" value="Zoeken">
        <br/>
        <span class="message"></span>
        <br/>
    </form>

<?php

$searchpc = $this->input->post('searchpc');

if(empty($searchpc)){
        unset($_SESSION['postcodes']); 
    }
?>

在表单和pro6pp数据库之间进行交互的代码:

<!--    <script>
    window.location.replace("home/searchresults");
    </script>
-->
<?php 

     session_start();

echo '<pre>';
     $new_post_code=$_GET['post_code'];
        if($new_post_code!='' && $new_post_code!=0){
        if(!isset($_SESSION['searched_post_code']) || 
        empty($_SESSION['searched_post_code'])){ 
        $_SESSION['searched_post_code']=$new_post_code; 
        $_SESSION['searched_post_code'] = $_COOKIE['postcode'];
        }elseif($_SESSION['searched_post_code']!=$new_post_code){ 

        $_SESSION['searched_post_code']=$new_post_code; 

        unset($_SESSION['postcodes']); 
        }
        }
     $string = implode($_SESSION['postcodes'], '|');
     $output=$_GET['output'];
     $_SESSION['postcodes'][]=$output;
     echo $output;
     print_r($_SESSION);
     print_r($_COOKIE);
echo '</pre>';

?>

我不知道为什么它不起作用。

1 个答案:

答案 0 :(得分:1)

setcookie()函数接受少数参数其中一个是路径我注意到你没有设置它。将路径设置为&#39; /&#39;将使其在整个领域内可用。它解决了你的问题。

例如

 setcookie("TestCookie", $value, time()+3600, '/');

TestCookie将拥有$ value,该值在1小时后到期,并且可用于整个域。

来自手册

  

可在其上使用cookie的服务器上的路径。如果设置为&#39; /&#39;,则Cookie将在整个域中可用。如果设置为&#39; / foo /&#39;,则cookie只能在/ foo /目录和所有子目录中使用,例如/ foo / bar / of domain。默认值是设置cookie的当前目录。

你需要在setcookie()中为你的cookie设置正确的路径,它会起作用。

手动http://php.net/manual/en/function.setcookie.php

中的更多内容

此外:

  1. 编辑$ _SESSION和$ _COOKIE的更改键,设置不同于您选中的键。

  2. 如果删除$ _SESSION变量,首先检查isset()是否存在此变量

  3. 在下次加载可以看到Cookie的网页之前,Cookie才会显示。要测试cookie是否已成功设置,请在cookie过期前检查下一个加载页面上的cookie。

  4. 它不会影响问题,但会将onchange="validate()"更改为此onchange="return validate()"

  5. 您应该更改的代码

    <?php
    if(isset($_POST['postcode']))
    {
        setcookie('radius', $_POST['radius'], time() + (20 * 365 * 24 * 60 * 60), '/');
        setcookie('postcode', $_POST['postcode'], time() + (20 * 365 * 24 * 60 * 60), '/');
        header("location: {$_SERVER['PHP_SELF']}");
    };
    

    &GT;


    <form name="input" method="post" action="searchresults" class="pro6pp_range">
    <input type="search" onchange="return validate()" placeholder="Zoeken..." name="search" size="70">
          <select class="range">
          <? $radius = isset($_COOKIE['radius']) ? $_COOKIE['radius'] : -1; ?>
          <? if(isset($_COOKIE['postcode'])) {$sesspc = $_COOKIE['postcode']; $_SESSION['postcode']= $_COOKIE['postcode'];} ?>
          <? $postcode = $sesspc ?>
          <? if(isset($_COOKIE['radius'])
            echo '<option selected="selected" value="'.$_COOKIE['radius'].'">'.$_COOKIE['radius'].' km</option>';
          ?>
            <option value="">Kies een afstand</option>
            <option value="5">5 km</option>
            <option value="10">10 km</option>
            <option value="15">15 km</option>
            <option value="20">20 km</option>
            <option value="25">25 km</option>
            <option value="50">50 km</option>
          </select>
        <input type="search" required="required" name="searchpc" class="postcode" value="<?= $postcode ?>" placeholder="Postcode (1234)" maxlength="4">
    
        <input type="submit" value="Zoeken">
        <br/>
        <span class="message"></span>
        <br/>
    </form>
    
    <?php
    
        if(isset($_POST['searchpc']) && isset($_SESSION['postcode']))
        {
           if(empty($_POST['searchpc']) ) unset($_SESSION['postcode']); 
        }
    ?>