没有发送到$ _POST,但$ _SESSION说了别的

时间:2016-10-09 04:24:51

标签: javascript php ajax session post

我不知道我的代码发生了什么,当我运行它时,有时SESSION说有一个数组被存储,有时却没有。我正在使用调试器来检查会话。当我使用isset($ _ POST)时,返回值始终为false。我正在使用ajax将数组传递给php。

<?php
session_start();
if(isset($_POST['jExam'])){
    $decode = json_decode($_POST['jExam']);
    $_SESSION['receive'] = $decode;
    $product = $_SESSION['receive'];
}
else{
    echo "Failed to hold<br>";
}
?>

使用Javascript:

$(document).ready(function(){
    $(".class").click(function(event)){
    event.preventDefault();
    window.location.href = 'example.php';
    var jExample = JSON.stringify(array);
    $.ajax({
        data:{'jExam':jExample},
        type: 'POST',
        dataType: 'json',
        url: 'example.php'
    });
});

修改

想出为什么数组存储到SESSION中,一旦我点击打开另一页的按钮,然后在url中输入页面,数组就会存储到SESSION中。不知道为什么。仍然无法弄清楚为什么ajax没有发送到帖子。

编辑2:

我创建了一个处理名为handle.php的请求的文件。所以顶部的php脚本被添加到handle.php而不是网页中。但我得到一个“解析错误:语法错误,意外'如果'(T_IF)”。代码仍然是最重要的。

handle.php:

<?php
    session_start();
    if(isset($_POST['jExam'])){
        $decode = json_decode($_POST['jExam']);
        $_SESSION['receive'] = $decode;
        $product = $_SESSION['receive'];
    }
    else{
        echo "Failed to hold<br>";
    }
?>

编辑3:

我正在使用ajax将数组传递给php以便将其存储到会话中,以便在另一个页面中使用该数组。问题是数组没有传入$ _POST。我希望的是数组实际上可以通过,所以我可以在另一个页面上使用它。

解决:

我所做的就是添加一个具有隐藏价值的表单。并且值实际发布

<form id = "postform" action = "cart.php" method = "post">
  <input type = "hidden" id="obj" name="obj" val="">
  <input type = "submit" value = "Show Cart" id = "showcart">
</form>

在Javascript中:

$(document).ready(function(){
  $("#showcart").click(function(){
    var json = JSON.stringify(object)
    $('#obj').val(json);
    $('#obj').submit();
  });
});

感谢大家的回答,但希望这有助于其他人。

2 个答案:

答案 0 :(得分:0)

如果exam​​ple.php是处理请求的php文件,则需要将js代码更改为

$(document).ready(function(){
    $(".class").click(function(event)){
    event.preventDefault();
    var jExample = JSON.stringify(array);

    $.ajax("example.php", {
        data:{'jExam':jExample},
        type: 'POST',
        dataType: 'json'
    });
});

如果要处理响应,则应添加完整参数。

您的错误是,您在发送请求之前使用window.location.href重定向页面。因此,您的请求永远不会被发送,而是直接调用PHP-File,而不是通过AJAX,而不是使用nessecary数据。因此,您缺少PHP文件中的数据。

答案 1 :(得分:0)

您需要尝试让自己的设置更容易一些,所以这里有一些可以帮助您简化此操作的内容。你可能已经或可能没有完成其中的一些,所以无视你已经做过的事情:

  1. 使用包含在第一级php文件
  2. 上的具体定义的配置文件
  3. 只需使用data
  4. 传递一个json_encode()字段即可
  5. 不要将json作为数据类型发送,不是必需的,首先进行故障排除,然后如果需要,将其默认为发送类型
  6. 使用success功能,以便轻松查看返回
  7. 使功能分离任务
  8. <强> /config.php

    添加所有重要的偏好设置并将其添加到每个顶级页面。

    session_start();
    define('URL_BASE','http://www.example.com');
    define('URL_AJAX',URL_BASE.'/ajax/dispatch.php');
    define('FUNCTIONS',__DIR__.'/functions');
    

    <强>形式:

    只需制作一个data即可发送一组数据键/值。

    <button class="cart" data-instructions='<?php echo json_encode(array('name'=>'Whatever','price'=>'17.00','action'=>'add_to_cart')); ?>'>Add to Cart</button>
    

    给你:

    <button class="cart" data-instructions='{"name":"Whatever","price":"17.00","action":"add_to_cart"}'>Add to Cart</button>
    

    <强>的Ajax:

    只需发送普通对象

    $(document).ready(function(){
        // Doing it this way allows for easier access to dynamic
        // clickable content
        $(this).on('click','.cart',function(e)){
            e.preventDefault();
            // Get just the one data field with all the data
            var data = $(this).data('instructions');
            $.ajax({
                data: data,
                type: 'POST',
                // Use our defined constant for consistency
                // Writes: http://www.example.com/ajax/dispatch.php
                url: '<?php echo URL_AJAX; ?>',
                success: function(response) {
                    // Check the console to make sure it's what we expected
                    console.log(response);
                    // Parse the return
                    var dataResp = JSON.parse(response);
                    // If there is a fail, show error 
                    if(!dataResp.success)
                        alert('Error:'+dataResp.message);
                }
            });
        });
    });
    

    <强> /functions/addProduct.php

    理想情况下,您可能希望使用某种IDsku作为密钥,而不是名称

    // You will want to pass a sku or id here as well
    function addProduct($name,$price)
        {
            $_SESSION['cart'][$name]['name']  = $name;
            $_SESSION['cart'][$name]['price'] = $price;
    
            if(isset($_SESSION['cart'][$name]['qty']))
                $_SESSION['cart'][$name]['qty'] += 1;
            else
                $_SESSION['cart'][$name]['qty'] = 1;
    
            return $_SESSION['cart'][$name];
        }
    

    <强> /ajax/dispatcher.php

    调度程序只是作为AJAX请求调用操作。由于返回机制的性质,您可以将其展开以返回html,或者连续运行多个命令,或者只运行一个或其他任何命令。

    # Add our config file so we have access to consistent prefs
    # Remember that the config has session_start() in it, so no need to add that
    require_once(realpath(__DIR__.'/../..').'/config.php');
    # Set fail as default
    $errors['message'] = 'Unknown error';
    $errors['success'] = false;
    # Since all this page does is receive ajax dispatches, action
    # should always be required
    if(!isset($_POST['action'])) {
        $errors['message'] = 'Action is require. Invalid request.';
        # Just stop
        die(json_encode($errors));
    }
    # You can have a series of actions to dispatch here.
    switch($_POST['action']) {
        case('add_to_cart'):
            # Include function and execute it
            require_once(FUNCTIONS.'/addProduct.php');
            # You can send back the data for confirmation or whatever...
            $errors['data']    = addProduct($_POST['name'],$_POST['price']);
            $errors['success'] = true;
            $errors['message'] = 'Item added';
            # Stop here unless you want more actions to run
            die(json_encode($errors));
        //You can add more instructions here as cases if you wanted to...
        default:
            die(json_encode($errors));
    }