2014-12-18 5 views
0

От страницы входа Я захватывая значения пользователя и пароль:PHP Не удалось установить сеанс переменной

<?php 
session_start(); 
$error=''; 
$rows = 0; 
if (isset($_POST['submit'])) { 
    $username=$_POST['username']; 
    $password=$_POST['password']; 
    $mysqli = new mysqli("localhost","xxxxx","xxxxx","xxxxxxx"); 
    if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 
    $username = stripslashes($username); 
    $password = stripslashes($password); 
    $username = $mysqli->real_escape_string($username); 
    $password = $mysqli->real_escape_string($password); 
    $query = "select count(*) from login where password='$password' AND username='$username'"; 
    if ($stmt = $mysqli->prepare($query)) { 
     $stmt->execute(); 
     $stmt->store_result(); 
     $rows = $stmt->num_rows; 
     $stmt->close(); 
    } 
} 
$mysqli->close(); 
if ($rows == 1) { 
    $_SESSION['login_user']=$username; 
    header("location: profile.php"); 
} else { 
    header("location: login.php"); 
    $error = "Username or Password is invalid"; 
} 
?> 

Мой profile.php сценарий является то, как показано ниже:

<?php 
include('session.php'); 
?> 
<!DOCTYPE html> 
<html> 
<head> 
<title>Your Home Page</title> 
<link href="style.css" rel="stylesheet" type="text/css"> 
</head> 
<body> 
    <div id="profile"> 
    <b id="welcome">Welcome : <i><?php echo $login_session; ?></i></b> 
    <b id="logout"><a href="logout.php">Log Out</a></b> 
    </div> 
</body> 
</html> 

И сессии. PHP

<?php 
if(!isset($_SESSION['login_user'])){ 
    header('Location: login.php'); 
} 
?> 

Мой поток код подобен, когда форма Войти представлен исходный код validate_login.php проверит детали из пользователь. Если данные верны, страница profile.php будет отображаться или вернуться на страницу входа в систему.

У меня есть 3 трудности;

  1. Как отлаживать скрипты PHP?
  2. Почему мой код снова возвращается на страницу входа в систему - я проверял жесткую кодировку неправильной неопределенной переменной (форсирование дампа) - я обнаружил, что строка найдена, поскольку она входит в условие if, которое определяет переменную сеанса [if ($ rows == 1)]
  3. Есть ли другой способ проверки сеанса - в основном только зарегистрированный пользователь должен видеть дальнейшие страницы?
+6

Вы также должны 'session_start()' в 'session.php' – naththedeveloper

+0

Спасибо, что решает мою главную проблему ..но, пожалуйста, дайте мне знать, как мне отлаживать скрипт PHP и есть ли другой лучший способ проверки зарегистрированного пользователя. – Prakash

+1

«Как отлаживать PHP» слишком расплывчато из-за вопроса и это только то, чему вы можете научиться, языка или чтения, для этого нет «правильного» ответа. Установите такие программы, как [Xdebug] (http://xdebug.org/) и используйте [надлежащую IDE] (https://www.google.co.uk/?q=IDE+php). – naththedeveloper

ответ

1

у вас нет сессии сейчас в Youre session.php

<?php 
if(!isset($_SESSION['login_user'])){ 
header('Location: login.php'); 
} 
?> 

Вам нужно добавить session_start();

Так и будет получить

<?php 
session_start(); 
if(!isset($_SESSION['login_user'])){ 
header('Location: login.php'); 
} 
?> 

Для безопасности лучше, чтобы использовать подготовлен prepared statements. Для ошибок handelings, попробуйте сделать что-то есть действительно сеанс?.

if(session_id() == '' || !isset($_SESSION)) { 
    // session isn't started 
    echo "No session"; 
} 
0

Ваш session.php должен быть

empty(), по существу, кратким эквивалентно !isset($var) || $var == false.

<?php 
session_start(); 
if(empty($_SESSION['login_user'])){ 
header('Location: login.php'); 
} 
?> 

включает session.php к вашему сценарию и любой другой страницу, которая для зарегистрированных пользователей функции

<?php 
include_once('session.php'); 
$error=''; 
$rows = 0; 
if (isset($_POST['submit'])) { 
$username=$_POST['username']; 
$password=$_POST['password']; 
$mysqli = new mysqli("localhost","xxxxx","xxxxx","xxxxxxx"); 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 
$username = stripslashes($username); 
$password = stripslashes($password); 
$username = $mysqli->real_escape_string($username); 
$password = $mysqli->real_escape_string($password); 
$query = "select count(*) from login where password='$password' AND username='$username'"; 
if ($stmt = $mysqli->prepare($query)) { 
$stmt->execute(); 
$stmt->store_result(); 
$rows = $stmt->num_rows; 
$stmt->close(); 
} 
} 
$mysqli->close(); 
if ($rows == 1) { 
$_SESSION['login_user']=$username; 
header("location: profile.php"); 
} else { 
header("location: login.php"); 
$error = "Username or Password is invalid"; 
} 
?> 
0

вызова session_start(), перед использованием любого переменного сеанса.

Если вы получите предупреждение, такие как: Предупреждение: Не удается изменить информацию в заголовке - заголовки уже прислал (выход начался в сценарии: линии), а затем использовать @ оператора подавления

@session_start() //@ for error suppression 
+0

Как точно добавляется хорошая практика @ @ (подавления ошибок)? Это ужасная практика. – naththedeveloper

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