0

現在、有効な変数とユーザー名変数の 2 つの変数を格納するログイン スクリプトがあります。名前変数を追加しようとしているので、データベースから名前を取得するように MySQL クエリを変更し、セッション変数に名前を保存しようとしましたが、何らかの理由でそれを保存していません。スクリプトをお見せするのが一番いいかもしれませんが、私は PHP を勉強してまだ 2 か月しか経っていないので、本当に助かります。

<?php
ob_start(); // Start output buffering

session_start(); //must call session_start before using any $_SESSION variables3
$_SESSION['username'] = $username;

function validateUser($username)
{

    session_regenerate_id (); //this is a security measure
    $_SESSION['valid'] = 1;
    $_SESSION['username'] = $username;
    $_SESSION['name'] = $userData['name'];
}

      $username = isset($_POST['username'])?$_POST['username']:'';
     $password = isset($_POST['password'])?$_POST['password']:'';

//connect to the database here

$hostname_Takeaway = "localhost";
$database_Takeaway = "diningtime";
$username_Takeaway = "root";
$password_Takeaway = "root";
$Takeaway = mysql_pconnect($hostname_Takeaway, $username_Takeaway, $password_Takeaway) or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_select_db($database_Takeaway, $Takeaway);

$username = mysql_real_escape_string($username);

$query = "SELECT name, password, salt FROM admin_users WHERE username = '$username';";

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

if(mysql_num_rows($result) < 1) //no such user exists
{
    header('Location: http://localhost/diningtime/admin-home.php?login=fail');

    die();
}
$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
if($hash != $userData['password']) //incorrect password


{
    header('Location: http://localhost/diningtime/admin-home.php?login=fail');

    die();
}
else
{

   validateUser($username); //sets the session data for this user
}
//redirect to another page or display "login success" message
header('Location: http://localhost/diningtime/main');
die();




//redirect to another page or display "login success" message


?>
4

3 に答える 3

1

関数のスコープに変数validateUser()がない$userDataため、$_SESSION['name'] に NULL を割り当てています。

$userData をグローバルにして関数のスコープ内で見えるようにするか、引数として渡します。

function validateUser($user, $userData) {
                             ^^^^^^^^^-- pass as arg
   global $userData;
   ^^^^^^^^^^^^^^^^^--- bring var in-scope
   ...
   $_SESSION['name'] = $GLOBALS['userData']['name'];
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^--- refer to global scope
}

これら 3 つのオプションのいずれかで問題を解決できます (3 つすべてを同時に実行しないでください)。

于 2012-11-08T20:05:36.847 に答える
1

あなたのvalidateUser関数は $userData 配列から値を取得しません。その中に別の引数が必要です。

function validateUser($username, $name)

コードからこれらの値を渡すか、mysql 認証をこの関数内に移動すると、機能します。通常、関数は、その関数の外で定義した変数を認識しません。

PS 5行目は何ですか

$_SESSION['username'] = $username;

行う?その場所ではまったく役に立たないのではないかと疑っています:-)

于 2012-11-08T20:06:22.767 に答える
0

ここはミスが多い。

<?php
ob_start(); // Start output buffering

session_start(); //must call session_start before using any $_SESSION variables3
$_SESSION['username'] = $username;

どこから$username来たの?

 $username = isset($_POST['username'])?$_POST['username']:'';
 $password = isset($_POST['password'])?$_POST['password']:'';

現在、その存在を確認しています。

    $Takeaway = mysql_pconnect($hostname_Takeaway, $username_Takeaway, $password_Takeaway) or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_select_db($database_Takeaway, $Takeaway);

mysql_*廃止手続きが開始されました。あなたの問題とは関係ありませんが、言及する価値があります

それから来るvalidateUser($username); //sets the session data for this user

これで、関数を呼び出しています。関数を見てみましょう。

function validateUser($username)
{

    session_regenerate_id (); //this is a security measure
    $_SESSION['valid'] = 1;
    $_SESSION['username'] = $username;
    $_SESSION['name'] = $userData['name'];
}

$usernameパラメータとして渡しましたが、どこから$userData['name']来るのでしょうか? (範囲については、MarcBs ソリューションを参照してください)

ですから、理解しなければならないことがたくさんあります。

于 2012-11-08T20:06:53.947 に答える