表单在刷新时不断向会话数组添加值a?

时间:2012-03-15 14:52:41

标签: php

我在页面上有一个带有隐藏输入的表单,其中包含一本书的名称和一个提交按钮,用于将书名添加到$ _SESSION数组中的一个arry。每次用户点击按钮时,书的名称都会添加到session中包含的数组中。这样可以正常工作。主要的问题是当我刷新页面时它再次将数据库的名称添加到数组而没有按下“添加到购物车按钮”我可以看到为什么会发生这种情况,因为当我在if语句中将值发送到数组时确保并取消设置()提交按钮。这是php部分的代码。

 <?php
   if(isset($_SESSION['username']))
   {
      if(!isset($_SESSION['itemnames']))
      {
        $itemnames = array();
        $_SESSION['itemnames'] = $itemnames;
    echo "<p>second if</p>"; 
      }
      if (isset($_GET['submit1']))
      {
       $name = $_GET['book1'];
       $_SESSION['itemnames'][]= $name ;
       unset($_GET['submit1']);
       echo "<p>" . var_dump($_SESSION['itemnames']) . "</p>";
      }
   } 
?>

这是我的表格我在页面上还有另一个表格,我想知道这是否是导致问题我现在不这么认为。

<form method="get" action="" name="myform">
    <span style="color:#000">
        <label for="quantity">Quantity:</label>
    </span>
    <select name="quantity" id="quantity">
        <option value="1" selected>1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        <option value="8">8</option>
        <option value="9">9</option>
        <option value="10">10</option>
        <option value="11">11</option>
        <option value="12">12</option>
        <option value="13">13</option>
        <option value="14">14</option>
        <option value="15">15</option>
        <option value="16">16</option>
        <option value="17">17</option>
        <option value="18">18</option>
        <option value="19">19</option>
        <option value="20">20</option>
        <option value="21">21</option>
        <option value="22">22</option>
        <option value="23">23</option>
        <option value="24">24</option>
        <option value="25">25</option>
        <option value="26">26</option>
        <option value="27">27</option>
        <option value="28">28</option>
        <option value="29">29</option>
        <option value="30">30</option>
    </select>
    <input type="hidden" name="book1" value="cape clear island: its peopleand landscape"
    />
    <input type="submit" value="Add To Cart" name="submit1">
    </button>
</form>

我无法想到为什么刷新页面会为我的阵列添加一个!即时添加名称多次只是为了测试多次点击工作。感谢您的帮助!当我得到这个部分工作时,显然不好用下拉列表做其他事情。 我基本上有一个页面上的提交按钮,我应该可以多次单击以将书籍添加到会话数组,具体取决于我想将书籍添加到购物车的次数,这将增加顶部的计数器页面的大小取决于单击项目的次数。当我刷新时,我只是不希望书在会话数组中增加。所以添加项目到购物车按钮不会将用户重定向到购物车我将有一个单独的按钮“查看购物车”,如果你得到我想在这里做什么。

2 个答案:

答案 0 :(得分:1)

您应该将POST方法用于此类形式,以帮助避免此类问题。

无论哪种方式(GETPOST),您都应在处理完表单提交后发出303 See Other HTTP状态代码,并将用户重定向到原始页面。

例如:

if (isset($_GET['submit1'])) {
  // Add the item to the array
  $_SESSION['itemnames'][] = $_GET['book1'];
  // Redirect and exit
  header('HTTP/1.1 303 See Other');
  header('Location: '.$_SERVER['HTTP_REFERER']);
  exit;
}

在上面的示例中,我使用了Referer:标头来确定将用户发送到何处。这不一定是最好的方法,因为PHP manual表示:

  

并非所有用户代理都会设置此功能,有些用户可以将HTTP_REFERER修改为功能。简而言之,它无法真正被信任。

但是,由于我对网站的结构方式一无所知,所以我已经使用了它,因为它可以在99%的时间内正常工作。

答案 1 :(得分:0)

使用post而不是get,它仍然在url中,因此它将再次插入会话

编辑:基于评论我现在看到OP想要什么,所以也许这会有所帮助

要检查它是否已经整理了你必须处理那个php端

if (in_array($name, $_SESSION['itemnames'])) {
    //its alredy there
}
else{
    //submit original code to insert
}