0

私は、人々が郵便番号に基づいて検索できる Web サイトに取り組んでいます。初めてページにアクセスすると、ポップアップ ダイアログが開きます。郵便番号と半径 x km を入力する必要があります。

送信時に Cookie は「郵便番号」と「半径」として設定されます。

メインページの検索バーにこれらの Cookie を出力します。しかし、フォームを送信しようとすると、Cookie の値が取得されません。空ではありませんが、手動で再入力して送信をクリックすると機能します。何が問題なのですか?

Pro6pp (オンラインの郵便番号データベース) を使用しており、そこから特定の半径の郵便番号を取得しています。それらをSESSIONに保存します。

私のダイアログ:

<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>';

?>

なぜ機能しないのかわかりません。

4

1 に答える 1

1

setcookie()関数はいくつかのパラメーターを受け入れます。そのうちの 1 つはPATHです。設定していないことに気づきました。パスを「/」に設定すると、ドメイン全体で利用できるようになります。そして、それはあなたの問題を解決します。

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

TestCookie には、1 時間後に有効期限が切れる $value があり、ドメイン全体で使用できます。

マニュアルから

Cookie が使用可能になるサーバー上のパス。「/」に設定すると、Cookie はドメイン全体で使用可能になります。「/foo/」に設定すると、Cookie は /foo/ ディレクトリと、ドメインの /foo/bar/ などのすべてのサブディレクトリ内でのみ利用可能になります。デフォルト値は、Cookie が設定されている現在のディレクトリです。

setcookie() でクッキーの適切なパスを設定する必要があり、それは機能します。

マニュアルの詳細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()"

変更する必要があるコード

<?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="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']); 
    }
?>
于 2013-05-16T10:18:55.337 に答える