2009-08-20 6 views
0

Я создаю скрипт входа, который хранит значение переменной с именем $userid до $_SESSION["userid"], а затем перенаправляет пользователя на главную страницу (вопрос в том, как отправить их туда, где они были?).

Однако, когда я возвращаюсь к этой странице, я повторяю session_id() и значение $_SESSION["userid"] и появляется только идентификатор сеанса. Мне пришло в голову, что, может быть, моя страница перенаправления должна быть наверху, но если это так, то session_id, я эхо, будет меняться каждый раз, когда я окажусь на странице, которая вторит ему. Вот сценарий:

<?php 
session_start(); 
include_once("db_include.php5"); 
doDB(); 
//check for required fields from the form 
if ((empty($_POST['username']) && empty($_POST['email'])) || empty($_POST['password'])) { 
header("Location: loginform.php5"); 
exit; 
} else if($_POST["username"] && $_POST["password"]){ 

    //create and issue the query 
    $sql = "SELECT id FROM aromaMaster WHERE username='".$_POST["username"]."' AND password=PASSWORD('".$_POST["password"]."')"; 
    $sql_res =mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli)); 

    //get the number of rows in the result set; should be 1 if a match 
    if(mysqli_num_rows($sql_res) != 0) { 
     //if authorized, get the userid 
     while($info = mysqli_fetch_array($sql_res)) { 
     $userid = $_info["id"]; 
     } 
     //set session variables 
     $_SESSION['userid'] = $userid; 

     mysqli_free_result($sql_res); 
     //redirect to main page 
     header("Location: loginredirect.php5"); 
     exit; } 
    } else if($_POST["email"] && $_POST["password"]) { 

      //create and issue the query 
    $sql = "SELECT id FROM aromaMaster WHERE email='".$_POST["email"]."' AND password=PASSWORD('".$_POST["password"]."')"; 
    $sql_res =mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli)); 

    //get the number of rows in the result set; should be 1 if a match 
    if(mysqli_num_rows($sql_res) != 0) { 

     //if authorized, get the userid 
     while($info = mysqli_fetch_array($sql_res)) { 
     $userid = $_info["id"]; 
     } 
     //set session variables 
     $_SESSION['userid'] = $userid; 

     mysqli_free_result($sql_res); 

     //redirect to main page 
     header("Location: loginredirect.php5"); 
     exit;} 
     } else { 
     //redirect back to login form 
     header("Location: loginform.php5"); 
     exit; 
    } 
    mysqli_close($mysqli); 
?> 
+0

Следует отметить, что то, что вы делаете, дает вам широкое распространение для атаки SQL-инъекций. Это не то, как вы используете mysqli. Привяжите свои параметры вместо использования конкатенации строк. См. Http://au.php.net/manual/en/mysqli-stmt.bind-param.php. – cletus

+0

Хм, я прочитаю об этом. Дело в том, что при вводе полей в моих формах, onkeyup выполняется сценарий, который санирует вход, позволяя только 0-9a-zA-z _-. @ (В зависимости от того, для чего это поле, но это самый либеральный он получает). Таким образом, без <>() - + "';: & | $, что может делать кто-нибудь? – user97410

+0

Этот скрипт запускается на клиенте. Его можно отключить или запросы могут быть подделаны. Проверка клиента - это только удобство **. Никогда не полагайтесь на проверку клиента. Вы всегда должны проверять сервер. ** – cletus

ответ

3

Вы делаете это:

while($info = mysqli_fetch_array($sql_res)) { 
    $userid = $_info["id"]; 
} 

Где вы должны сделать это:

while($info = mysqli_fetch_array($sql_res)) { 
    $userid = $info["id"]; 
} 
+0

О, вы сделали такую ​​же опечатку дважды в своем коде, кстати, поэтому убедитесь, что вы изменили ее в обоих точках! – Ropstah

+0

не совпадают ли эти петли? –

+0

Нет, обратите внимание на изменение от $ _info ['id'] до $ info ['id'] – Ropstah

1

Вам нужно позвонить session_write_close(), чтобы сохранить изменения данных сеанса.

Side Ответ: Вы можете использовать $SERVER["HTTP REFERER"] перенаправить обратно, если он был заполнен браузером

+0

спасибо, я загляну в реферирующую вещь. Я также могу спросить, что вы имеете в виду, «если она была заполнена браузером»? – user97410

+0

session_write_close() should вызывается для вас –

+0

В некоторых (наиболее?) браузерах вы можете сообщить браузеру не отправлять заголовок реферера. Например, в firefox set network.http.sendRefererHeader значение 0, чтобы отключить отправку рефереров. – Zed

1

Убедитесь, что:

<?php 
    session_start(); 

В верхней части каждой страницы.

Кроме того, вы можете протестировать, комментируя свои переадресации и повторяя значение, которое вы устанавливаете, чтобы убедиться, что вы берете/сохраняете правильное значение для начала.