处理会话

时间:2009-12-04 10:27:18

标签: php session

需要一些有关如何处理会话的帮助。我正在使用ajax技术来实现一个小组讨论平台,其成功很多取决于我是否能够正确处理会话,能够看到谁在线等。我该如何有效地做到这一点。请记住,这是典型的单个URL ajax应用程序,其中服务器仅响应请求。当用户输入他的数据时,所有表单验证都在客户端完成。我需要帮助。低于目前为止所写的内容。

<?php
include_once "../database/dbconnect.php";

session_start();

$username = isset($_POST["userNameLogin"]) ? $_POST["userNameLogin"] : $_SESSION["userNameLogin"];
$pwd = isset($_POST["passwordLogin"]) ? $_POST["passwordLogin"] : $_SESSION["passwordLogin"];

// Sending these messages to my client side validation code json-style.

if(!isset($username)){
echo("{message : 'NoName'}");
}

elseif(!isset($pwd)){
echo("{message : 'NoPW'}");
}

// creating the session variables to hold username and pwd

$_SESSION['userNameLogin'] = $username;

$_SESSION['passwordLogin'] = $pwd;

// calling the function incuded above to make connection to mysql db

dbConnection();

//query retrieves username and pwd from db and counts the result. if it is one, then they //certianly exist and if not unset the variables created above. The varibles were created
//above so i do not have to check if they exist before unsetting them.

$sQuery = "SELECT * FROM users WHERE
username = '$username' AND password = '$pwd'";

$result = mysql_query($sQuery) or die(mysql_error());

$intFound = mysql_num_rows($result);

if ($intFound == 0) {
unset($_SESSION['userNameLogin']);
unset($_SESSION['passwordLogin']);

// AD - Access Denied

echo("{message : 'AD'}");
}

else{

//a flag to set in the database who is currently online. value of 1 for users who are //online and zero for users who are not. If i want a list of those online, i check the //column called online and then check to see if the $_SESSION['username'] exist. If it //does then i know the user is online. That is what the second script is for. New to this //stuff, and do not know a better way of doing it

mysql_query("UPDATE users SET online = '1' WHERE username = '$username'") or die(mysql_error);

}

上述脚本应该让用户通过向客户端的验证代码发送消息来登录或拒绝访问。 正如你所看到的,我是新手,我有一些问题。我该怎么做才能确保会话设置和设置不正确,即用户注销时。 其次,我如何监控谁在线以及谁没有使用会话。这是我试图检查谁当前在线,然后使用用户名构建一个json文件并将其发送到客户端。 Json更容易解析。

下面的脚本试图确定谁在线

<?php
// this script determines which sessions are currently active by
// 1.) checking to see which online fields in the users table are set to 1
// 2.) by determining if a session variable has been set for these users.
// If it is not set, it means user is no longer active and script sets its online field in the users table to zero.
// After doing this, the script, then queries the users table for online fields with values one, writes them to an
// array and passes them to the client.

include_once "../database/dbconnect.php";
//include "../validation/accessControl.php";

$tempActiveUsers = array();
$activeUsers = array();
$nonActiveUsers = array();

dbConnection();

$sql = "SELECT username from users WHERE online = '1' ";

$active_result = mysql_query($sql) or die(mysql_error);

if($active_result){
while($aValues = mysql_fetch_array($active_result)){
array_push($tempActiveUsers, $aValues['username']);
}
}

forEach($tempActiveUsers as $value){
/*if($_SESSION['$value'] == $value){
$activeUsers += $value;
} */
if(isset($_SESSION['userNameLogin']) == $value){
array_push($activeUsers, $value);
}else{
array_push($nonActiveUsers, $value);
}
}

forEach($nonActiveUsers as $value1){
$sql1 = "UPDATE users SET online='0' WHERE username = '$value1'";

$set_result = mysql_query($sql1) or die(mysql_error);
}

$length = sizeof($activeUsers);
$len = 1;
$json ='{"users" : {';
$json .= '"user":[';
forEach($activeUsers as $value2){
$json .= '{';
$json .= '"username" : "' .$value2.'" }';
if($len != $length){
$json .= ',';
}
$len++;
}
$json .= ']';
$json .= '}}';
echo $json;

请仔细阅读并提供一些建议。非常感谢。我的项目框架很好,但我可以实现很多用户功能,因为我无法跟踪谁在线以及如何管理他们的会话。如果您需要更多背景信息,请告诉我们。提前致谢

1 个答案:

答案 0 :(得分:0)

添加'注销'按钮并单击它上面的事件处理程序,它通过取消设置会话变量或完全销毁会话向服务器发出ajax请求以停止会话,并且在ajax完成回调时放置一个更新用户界面以显示用户的函数是退出。

登录程序可以按如下方式完成:用户点击“登录”按钮,会出现一些要求输入用户名和密码的表格。然后将此表单与ajax一起提交到服务器脚本,就像您的第一个一样。服务器脚本检查用户名和密码是否有效,并通过回调将验证信息返回给客户端:登录失败时的失败通知或有关当前登录用户的一些信息,例如:用户名,全名以及js中客户端上此用户可能需要的任何内容。然后,您的客户端脚本将根据服务器端脚本返回的登录状态继续运行。

你应该永远记住安全性。

在使用json向客户端发送任何敏感数据之前,您应始终检查会话是否有效并启动。客户端脚本可以在没有您控制的情况下轻松修改和执行,您应该只在服务器端防止意外活动。

你应该在用户发布的字段上应用一些转义,然后在sql查询中使用它们以避免sql注入攻击,例如:通过使用mysql_escape_string()。

而不是构建json字符串,你可以使用json_encode(),它适用于基元,对象和数组,你可以节省一些时间。