【问题标题】:Session not sending correctly through AJAX会话未通过 AJAX 正确发送
【发布时间】:2015-08-20 13:43:54
【问题描述】:

我有以下我认为可以正常工作的代码,但事实证明用户会话没有正确发送。假设我正在尝试发帖,它不需要我的 id,它需要最后一个注册我网站的用户的 id。为什么会这样?

我将此作为我的$userid 变量,它应该占用我的会话。我正在页面顶部初始化会话。

我做错了什么?

$(document).ready(function(){ 
             $("#submit_announcement").on("click", function () {

             var user_message = $("#announcement_message").val();
                //$user = this.value;
                 $user = $("#approved_id").val();
                $.ajax({ 
                    url: "insert_announcements.php", 
                    type: "POST",
                    data: {
                           "user_id": $user,
                                        //"message": user_message
                                        "user_message": user_message
                            },
                    success: function (data) {
                           //  console.log(data); // data object will return the response when status code is 200
                             if (data == "Error!") {
                                 alert("Unable to get user info!");
                                 alert(data);
                             } else {
                                 $(".announcement_success").fadeIn();
                                 $(".announcement_success").show();
                                 $('.announcement_success').html('Announcement Successfully Added!');
                                 $('.announcement_success').delay(5000).fadeOut(400);
                             }
                         },
                         error: function (xhr, textStatus, errorThrown) {
                             alert(textStatus + "|" + errorThrown);
                             //console.log("error"); //otherwise error if status code is other than 200.
                         }
                     });
                 });
             });

PHP 和表单

$userid = ( isset( $_SESSION['user'] ) ? $_SESSION['user'] : "" );

try {
    //Prepare
     $con = mysqli_connect("localhost", "", "", "");
     if ($user_stmt = $con->prepare("SELECT `id` FROM users")) {

        $user_stmt->execute();
        $user_stmt->bind_result($user_id); 

        if (!$user_stmt) {
            throw new Exception($con->error);
        }
     }
        $user_stmt->store_result();
         $user_result = array();
?>               
     <div class="announcement_success"></div>
            <p>Add New Announcement</p>
                <form action="" method="POST" id="insert_announcements">
                <input type="hidden" value="<?php echo $userid; ?>" id="approved_id" name="user_id" />
                    <textarea rows="4" cols="50" id="announcement_message" name="message" class="inputbarmessage" placeholder="Message" required></textarea>
                    <label for="contactButton">
                        <button type="button" class="contactButton" id="submit_announcement">Add Announcement</button>
                    </label>
                </form>

更新:显示示例的 PHP 文件

// $announcement_user_id= $_POST['user_id'];
$userid = ( isset( $_SESSION['user'] ) ? $_SESSION['user'] : "" );
$announcement_message= $_POST['user_message'];
$test = print_r($_POST, true); 
file_put_contents('test.txt', $test); 
//var_dump($announcement_user_id);

$con = mysqli_connect("localhost", "", "", "");
$stmt2 = $con->prepare("INSERT INTO announcements (user_id, message, date) VALUES (?, ?, NOW())");
    if ( !$stmt2 || $con->error ) {
        // Check Errors for prepare
         die('Announcement INSERT prepare() failed: ' . htmlspecialchars($con->error));
    }
    if(!$stmt2->bind_param('is', $userid, $announcement_message)) {
        // Check errors for binding parameters
        die('Announcement INSERT bind_param() failed: ' . htmlspecialchars($stmt2->error));
    }
    if(!$stmt2->execute()) {
        die('Announcement INSERT execute() failed: ' . htmlspecialchars($stmt2->error));
    }
        //echo "Announcement was added successfully!";
    else
    {
         echo "Announcement Failed!";
    }

【问题讨论】:

  • 我已经在页面开始处初始化会话了。

标签: javascript php ajax forms session


【解决方案1】:

您正在选择所有个用户:

SELECT `id` FROM users

因此,当您从该结果中获得一条记录时,它可能会巧合地成为表中的最新记录。

您正在尝试将参数绑定到 i:

$user_stmt->bind_result($user_id);

所以也许你打算有一个WHERE 子句?

SELECT `id` FROM users WHERE `id` = ?

不过,这似乎……没有必要。因为您已经拥有 ID。您似乎正在从客户端发布 ID, 将其保持在会话状态, 从数据库中获取它。因此,您甚至想在这里做什么都不是完全清楚的。但有一点很清楚,查询将返回该表中的每条记录。

【讨论】:

  • @Paul:这不是您已经在这里做的吗?:$_SESSION['user'] 如果您在登录时拥有用户 ID,请将其存储在会话值中。然后在其他页面上使用该会话值。您需要做的就是确保会话在使用它的每个页面的开头开始。
  • @Paul:首先在 AJAX 中发布用户 ID 并不清楚您要完成什么。如果这是当前登录用户的 ID,请在会话中跟踪它。绝对不要依赖通过 AJAX 发送的标识符,因为用户可以发送他们想要的任何 ID,从而有效地模拟其他用户。
  • @Paul:那么绝对不要从客户端代码发送它。这将允许用户模拟他们想要的任何用户。在会话中跟踪用户的身份服务器端。当用户登录时,将用户的 ID 存储在会话中。然后在任何需要它的页面上,从会话中获取它。 (正如您问题中 PHP 中的第一行代码所做的那样。)
  • @Paul:您不要从客户端代码发送会话。会话完全在服务器端维护。当您需要向数据库中插入一条记录并将其与当前登录用户相关联时,您可以从$_SESSION 数组中获取该用户的 ID。
  • @Paul:当用户登录时,将他们的 ID 存储在会话中。类似:$_SESSION['user'] = $someUserIDValue;。然后在以后需要使用该 ID 的页面上,从会话中获取它:$theUserID = $_SESSION['user'];。只要session_start() 包含在两个页面的顶部,您在一个页面的会话中存储的任何值都将在另一页面的会话中可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 2018-01-07
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多