【问题标题】:how to avoid overwriting of session array in php如何避免在php中覆盖会话数组
【发布时间】:2017-06-19 01:36:09
【问题描述】:

我有一个表单。其中的文本框下方有一个复选框列表。当我单击每个复选框时,会根据来自数据库的复选框显示一个带有子数据的模式。我想要做的是将数据传递到数据库中。那已经完成了。但问题是所有子复选框值都没有进入数据库。它仅将最后选择的主要类别的子类别与其他帖子数据一起传递到数据库中。我认为,由于 insert.php 文件中的会话数组而发生错误。它用新发布的数据覆盖会话变量。(复选框值)。我找不到它有什么问题。

我做了一个简单的表格来描述最好。

config.php

<?php
   $servername = "localhost";
   $username = "root";
   $password = "";
   $db = "mydb";

 // Create connection
    $conn = mysqli_connect($servername, $username, $password,$db);

// Check connection
   if (!$conn) {
      die("Connection failed: " . mysqli_connect_error());
      }
?>  

form.php

<body>
<div class="form1">
<form action="passData.php" method="post">

    <input type="text" name="name" placeholder="Name"/><br>
    <input type="text" name="age" placeholder="age"/><br>
    <input type="text" name="address" placeholder="address"/><br>
    <input type="checkbox" name="favourite" value="1"/>sports
    <input type="checkbox" name="favourite" value="2"/>fruits
    <input type="checkbox" name="favourite" value="3"/>colors
    <div>
        <button class="btn btn-primary" type="submit" name="submit" id="submit">Submit</button>
    </div>
</form>    
</div>

     <!--modal-->
<div id="myModal" class="modal fade" role="dialog">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">&times;</button>
        <h4 class="modal-title">Modal Header</h4>
      </div>
      <div class="modal-body">

      </div>
      <div class="modal-footer">
        <button class="btn btn-primary btn-fill" id="submit" onclick="submit();" name="submit" >save</button>

      </div>
    </div>
  </div>
</div><!--modal is finished-->


</body>

图片 1

图片 2

modal.php

<?php   
   if($_POST['value']){
      $value = $_POST['value'];
      include("config.php");

      $sql = "SELECT sub_categories FROM favourite WHERE category_id=".$value." ";
      $res = mysqli_query($conn,$sql);
      while($row = mysqli_fetch_array($res)){
      echo "<input class='category' type='checkbox' name='category[]' value ='".$row['sub_categories']."'/>".$row['sub_categories'];
      echo "<br>";

        }
}


?>

这是我的 js 文件

$(document).ready(function(){
    //model 
    $("input[type=checkbox][name=favourite]").on('change',function(){
     if(this.checked) {

        var value = $(this).val();
        $.ajax({
            url:"modal.php",
            type:"POST",
            data:{value:value},
            success:function(modalBody){
                $("#myModal .modal-body").html(modalBody);
                $("#myModal").modal('show');

            }

        });
    }
       });
});



 function submit() {

     var insert = [];
     $('.category:checked').each(function(){
           insert.push($(this).val()); 
        });

     insert = insert.toString();
            $.ajax({
            url:'insert.php',
            type:'POST',
            data:{insert:insert},
            success:function(){
             alert('success');
             $("#myModal").modal('hide');
      }
    }); 

}

当我点击模式上的保存按钮时,选中的复选框值传递给 insert.php 文件并存储在会话变量中。

插入.php

<?php
if (!isset($_SESSION['insert'])) {
$_SESSION['insert'] =[];
 }
$insert = $_POST['insert'];
array_push($_SESSION['insert'], $insert);
?>

点击提交按钮后,所有的post数据都会传入passData.php

passData.php

<?php
session_start();

include('config.php');

if(isset($_POST['submit'])){
   $name=$_POST['name'];
   $age=$_POST['age'];
   $address=$_POST['address'];

$sql= "INSERT INTO students(name,age,address,favourite) VALUES('$name',
       '$age',
       '$address',
       '".$_SESSION['insert']."');" ;
$result=mysqli_query($conn,$sql);
}


 ?>

我试着向你展示我的想法,希望你能理解。帮助我。

【问题讨论】:

    标签: php jquery checkbox bootstrap-modal


    【解决方案1】:

    我终于解决了自己。

    insert.phppassData.php必须修改如下

    插入.php

    <?php
    session_start();
    
        if (!isset($_SESSION['insert'])) {
        $_SESSION['insert'] = array();
        }
        $insert = $_POST['insert'];
        array_push($_SESSION['insert'], $insert);
    
        $list = implode(",", array_filter($_SESSION['insert']));
    
        $_SESSION['final'] = $list;
    
    ?>
    

    passData.php

    <?php
    session_start();
    
    include('config.php');
    
    if(isset($_POST['submit'])){
       $name=$_POST['name'];
       $age=$_POST['age'];
       $address=$_POST['address'];
    
    
    
           $sql= "INSERT INTO students(name,age,address,favourite) 
       VALUES('$name',
              '$age',
              '$address',
              '".$_SESSION['final']."');" ;
       $result=mysqli_query($conn,$sql);
    
       }
    
    unset($_SESSION['final']);
    session_destroy();
    
    
     ?>
    

    在此我将数组转换为字符串并将其分配给变量。然后进入会话变量。

    【讨论】:

      【解决方案2】:

      如果您要覆盖 PHP $_SESSION 超级全局,则将其复制到另一个对象并使用它;即:

      <?php
          if(!empty($_SESSION)){
              $session = array();
              foreach($_SESSION as $key => $data){
                  if($key == 'elements_i_dont_want_to_copy'){
                      continue;
                  }
                  // Elements I do want to copy:
                  $session[$key] = $data;
              }
          }
          ## Rest of your logic should now use $session, you can manipulate
          ## any elements in $session without destroying any elements of
          ## your $_SESSION.
          ## Pass back what you need from $session to $_SESSION if required
      ?>
      

      【讨论】:

        猜你喜欢
        • 2010-11-17
        • 2022-01-22
        • 1970-01-01
        • 2021-11-10
        • 2015-05-15
        • 1970-01-01
        • 2011-06-25
        • 2013-06-02
        • 1970-01-01
        相关资源
        最近更新 更多