2009-12-04 3 views
0

Нужна помощь в работе с сеансами. Я использую методы ajax для реализации платформы групповой дискуссии, и многие из ее успехов зависят от того, могу ли я правильно обрабатывать сессии, уметь видеть, кто в сети и т. Д. Как я могу это сделать эффективно. Помните, что это типичное одноразовое приложение 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

Ввод кода в правильное форматирование помогает разборчивость. Попробуйте разместить четыре пробела в начале каждой строки кода. – Joe

+1

Лично у меня есть класс Session, который действует как API для модели сеанса. Например, если я хотел проверить, существует ли ключ, вместо вызова 'isset ($ _SESSION ['key']), я бы назвал' Session :: keyExists ('key'); ' Я думаю, что реализация абстракции a) поощрять повторное использование кода и b) легче управлять. –

ответ

0

Добавить кнопку «Выход» и щелкнуть на нем обработчик событий, который делает запрос ajax серверу на остановку сеанса, отключая сеансовые сеансы или полностью уничтожая сеанс, а при обратном вызове завершения ajax ставится функция обновления пользовательского интерфейса чтобы показать пользователя.

Процедура входа в систему может быть выполнена следующим образом: пользователь нажимает кнопку «Войти» и появляется какая-либо форма с запросом имени пользователя и пароля. Затем отправьте эту форму с помощью ajax на серверный скрипт, такой как ваш первый. Сценарий сервера проверяет правильность имени пользователя и пароля и возвращает информацию об аутентификации клиенту через обратный вызов: уведомление об ошибке при неудачном входе в систему или некоторая информация о пользователе, который в настоящее время зарегистрирован, например. имя пользователя, полное имя и все, что вам может понадобиться об этом пользователе на стороне клиента в js. Затем ваш клиентский скрипт переходит в соответствии с статусом входа, который возвращается с сервера.

Вы всегда должны помнить о безопасности.

Перед отправкой любых конфиденциальных данных на клиентскую сторону с помощью json, вы всегда проверяете, действительно ли сеанс действителен и запущен. Сценарии на стороне клиента можно легко модифицировать и выполнять без вашего контроля, и вы должны предотвращать нежелательную активность только на стороне сервера.

Вы должны применить некоторые экраны в полях POSTed пользователя перед их использованием в sql-запросах, чтобы избежать атак с SQL-инъекциями, например. используя mysql_escape_string().

И вместо того, чтобы создавать json-строки, вы можете использовать json_encode(), который хорошо работает для примитивов, объектов и массивов, вы сэкономите время.

Смежные вопросы