3

言語にかなり慣れていないので、簡単なログイン システムを作成し、ページを更新せずにフォームを送信しようとしています。ページを更新せずに登録システムを完全に作成し(動的なユーザー名チェックと組み合わせて)、実際のログインフォームも変換して、ページを更新せずにユーザーがログインしているように表示できるようにしています。

同じ方法を使用しようとしましたが、ユーザー名とパスワードの両方を検証スクリプトに渡す必要があり、何らかの理由でパスワード部分を機能させることができません...ユーザー名は正常に機能しますが。

パスワードが正常に検証された場合は 1 つのエラーを表示し、そうでない場合は別のエラーを表示するように設定しました。

PS最初にスタックを使用するため、フォーマットなどに関する提案があれば指摘してください

PHP

<?php
require_once('startsession.php');
$page_title = 'Log In';
require_once('header.php');
require_once('connectvars.php');
require_once('navmenu.php');
?>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="invisiblelogin.js"></script>

<script type="text/javascript">

$(document).ready(function() {
$('.error').hide(); 
$('#Info').hide();      
});

function check_login(){
var username = $("#username").val();
var password = $("#password").val();
if(username.length > 0 && password.length > 0){
    $.post("logincheck.php", {
        username: $('#username').val(),
        password: $('#password').val(),
    }, function(response){
        setTimeout("finishAjax('Info', '"+escape(response)+"')", 450);
    });
    return false;
}
  }

 function finishAjax(id, response){
 //showing of errors is just visually showing me whether or not the password validation      worked
$('#'+id).html(unescape(response));
var valid = $("#Info").html();
if( valid > 0) {
    $("label#username_error2").show();
}
else {
$("label#password_error").show();
}
} 

</script>


<div id="contact_form">
<form action="" name="contact">
<fieldset><legend>Log In Info</legend>

  <font color="red"><div id="Info"></div></font>

  <table>
  <tr><td><label for="username" id="username_label">Username:</label>
    <input type="text" id="username" name="username" value="" class="text-input" /></td>
  <td><label class="error" for="username" id="username_error2">Enter your username.    </label></td></tr>

  <tr><td><label for="password" id="password_label">Password:</label>
  <input type="password" id="password" name="password" value="" class="text-input" />    </td>
  <td><label class="error" for="password" id="password_error">Enter your password.    </label></td></tr></table>



  <input type="submit" name="submit" class="button" id="submit_btn" value="Sign Up"   onclick="return check_login();" />
</fieldset>
</form>
</div>

<?php
// Insert the page footer
require_once('footer.php');
?>

JS

$(function() {
$('.error').hide();
$(".button").click(function() {
  // validate and process form here

  $('.error').hide();
    var username = $("input#username").val();
    var password = $("input#password").val();       

    if (username == "" || password == "") { 
      if (username == "") {
        $("label#username_error2").show();
        $("input#username").focus();
      }
      if (password == "") {
        $("label#password_error").show();
        $("input#password").focus();
      }
      return false;
    }
 return false;
  });




 });

中級PHP

<?php
require_once('connectvars.php');
if($_REQUEST)
{
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die (mysqli_error());
$username   = mysqli_real_escape_string($dbc, trim($_REQUEST['username']));
$password   = mysqli_real_escape_string($dbc, trim($_REQUEST['password']));
$query = "SELECT * FROM login_info WHERE username = 'username' AND password =   SHA('$password')";

      //  ------------ THIS PASSWORD PART DOES NOT READ CORRECTLY


$data = mysqli_query($dbc, $query);

if (mysqli_num_rows($data) > 0) {
    echo '1';
}
else {
    echo '0';
}   
}
?>
4

1 に答える 1

1

わかりました..いくつかのこと...


実際に起こりうる2つのことをトラブルシューティングする必要があると思います... 1)正しい値がPHPページに渡されていますか?これは、firebug (すべての開発者が持つべき firefox の拡張機能) の CONSOLE で確認できます。2) 実際のパスワード検証は正常に機能していますか? パスワードをハードコードします。die() 関数を使用して、PHP ページにデータを出力します。結果はfirebugでも見られます。


JS 側で $.post() を使用している場合、PHP は $_REQUEST ではなく $_POST を使用する必要があります。特筆すべきものに影響を与えるべきではありませんが、それを追加すると思いました。


このコードは少し心配です...

if( valid > 0) {
    $("label#username_error2").show();
}else {
    $("label#password_error").show();
}

ほとんどの場合、validは文字列であり、'0' を 0 として解析しません。ログイン スクリプトは true/false (0/1) プロシージャですが、ajax 関数によって呼び出される PHP ページは常に何らかの構造を返す必要があります。例えば...

json応答を期待するように POST を変更します。

$.post("logincheck.php", {
    username: $('#username').val(),
    password: $('#password').val(),
}, function(response){
    setTimeout(function(){            //Note the change here. 
        finishAjax('Info', response); //Note the change here. 
    }, 450);                          //Note the change here. 
}, 'json');                            //Note the change here. 

次に、JS が使用する json パッケージを返す PHP 関数を作成します。

function SendJSONResponse($success, $msg=null, $additionalReturnData=null){
    $result = array('success'=>$success);
    if ($msg) $result['msg']=$msg;
    if ($additionalReturnData) $result=array_merge($reult, $additionalReturnData);
    die(json_encode($result));
}

それができたら、ログインスクリプトは次のようになります

if (mysqli_num_rows($data) > 0) {
    SendJSONResponse(
        true, 
        null, 
        array('data'=>$data) //Pass the logged in users info for use in JS
    );
}else {
    SendJSONResponse(false, 'Username or Password not found');
}  

あなたのJSは次のようになります...

function finishAjax(id, response){
    if( response.success) {
        alert('logged in as ' + response.data.full_name + ' (' + response.data.email + ')');
        $("label#username_error2").show();
    }else {
        alert(response.msg);
        $("label#password_error").show();
    }
} 
于 2013-05-25T10:31:45.247 に答える