実現したいこと
ajax通信を利用してフォームデータをPOSTで受け渡し、ログイン機構を実装する
発生している問題・エラーメッセージ
ajaxの戻り値がHTMLのソースコードで出力されてしまいます
該当のソースコード
フォルダ配置
ルートフォルダ | |--ucp | |--index.html | |--contents.php | |--login | |--login.php(入力フォーム等) | |--script-login.php(jsファイルとして) | |--server-login.php(DBとの通信,フォームの入力チェック) | |--assets
script-login.php
javascript
1<script type="text/javascript"> 2 $(function(){ 3 //ログインボタンを押した時の動作 4 $('#send').click(function(){ 5 //二重送信防止のためログインボタンの無効化 6 $('#send').prop('disabled', true); 7 8 //ajax通信するデータを作成 9 var userData = { 10 mail: $('#mail').val(), 11 pass: $('#pass').val(), 12 token: $('#token').val() 13 }; 14 15 //ajax通信 16 $.ajax({ 17 type: 'POST', 18 url: './login/server-login.php', 19 data: userData 20 }).done(function(data){ 21 if(data == 'xsrf'){ 22 alert('エラーが発生しました。もう一度やり直してください。'); 23 location.href="/index.html"; 24 return false; 25 } 26 $('.caution-words').addClass('hide'); 27 if(data.indexOf('no-mail')>-1){ 28 $('.no-mail').removeClass('hide'); 29 }else if(data.indexOf('not-address')>-1){ 30 $('.not-address').removeClass('hide'); 31 } 32 if(data.indexOf('no-pass')>-1){ 33 $('.no-pass').removeClass('hide'); 34 }else if(data.indexOf('different')>-1){ 35 $('.different').removeClass('hide'); 36 } 37 $('#send').prop('disabled', false); 38 }).fail(function(XMLHttpRequest, textStatus, errorThrown) { 39 alert('error!!!'); 40 console.log("XMLHttpRequest : " + XMLHttpRequest.status); 41 console.log("textStatus : " + textStatus); 42 console.log("errorThrown : " + errorThrown.message); 43 }).always(function(data) { 44 console.log(data); 45 }); 46 47 }) 48 }) 49</script>
server-login.php
php
1<?php 2 3session_start(); 4if($_SESSION['token'] != $_POST['token']): 5 print('xsrf'); 6 return; 7endif; 8header('X-FRAME-OPTIONS: SAMEORIGIN'); 9$webroot = $_SERVER['DOCUMENT_ROOT']; 10include_once($webroot."/src/common/function.php"); 11$dbh = getDbh(); 12 13$mail = $_POST['mail']; 14$pass = $_POST['pass']; 15 16//入力データチェック 17$check = 'check'; 18if($mail == ''): 19 $check .= 'no-mail'; 20elseif(!filter_var($mail, FILTER_VALIDATE_EMAIL)): 21 $check .= 'not-address'; 22endif; 23if($pass == ''): 24 $check .= 'no-pass'; 25endif; 26if($check != 'check'): 27 p($check); 28 return; 29endif; 30 31$sql = "SELECT * FROM users WHERE mail = :mail"; 32$stmt = $dbh->prepare($sql); 33$stmt->bindValue(':mail', $mail); 34$stmt->execute(); 35$result = $stmt->fetch(PDO::FETCH_ASSOC); 36 37if(empty($result)): 38 $check .= 'different'; 39endif; 40if($check != 'check'): 41 p($check); 42 return; 43endif; 44//指定したハッシュがパスワードにマッチしているかチェック 45if(password_verify($pass, $result['pass'])): 46 //DBのユーザー情報をセッションに保存 47 $_SESSION['userID'] = $result['userID']; 48 $_SESSION['username'] = $result['username']; 49 p('success'); 50else: 51 p('different'); 52endif; 53?>
自己推測
ajaxのurlパラメータが取得できてない?
別階層のフォルダ(assets)にserver-login.phpを移動し、移動先をajaxのurlで指定するとうまく動作した。
同じフォルダに置いておきたいのですが、ajaxの仕様的に問題がある?ボールドテキスト
バージョン
php v8.2.4
jquery v3.2.1 min
コンソールログ表示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>タイトル</title> {head} <div class="body"> <form class="sign-body"> <div class="sign-heading">ログイン</div> <table class="sign-table"> <tbody> <!-- メールアドレス --> <tr> <td class="table-cap"><i class="fa-regular fa-envelope"></i>メールアドレス</td> <td><input type="text" id="mail"></td> </tr> <tr> <td class="caution-words no-mail hide" colspan="2">メールアドレスが入力されていません</td> <td class="caution-words different-mail hide" colspan="2">メールアドレスが違います</td> <td class="caution-words not-address hide" colspan="2">正しいメールアドレスを入力してください</td> </tr> <!-- パスワード --> <tr> <td><i class="fa-solid fa-key"></i>パスワード</td> <td><input type="password" id="pass"></td> </tr> <tr> <td class="caution-words no-pass hide" colspan="2">パスワードを入力してください</td> <td class="caution-words different hide" colspan="2">メールアドレスまたはパスワードが違います</td> </tr> <tr> <td class="table-cap"></td> <td> <a href="">パスワードをお忘れですか?</a> </td> </tr> <!-- トークン --> <input type="hidden" id="token" value="vTHSGG1eBUVwrF+EK5OoPBcUr+Wa+pRd0safZ1LAL/k="> <tr> <td class="table-cap"></td> <td> <input type="submit" id="send" value="ログイン"> </td> </tr> </tbody> </table> </form><script type="text/javascript"> $(function(){ //ログインボタンを押した時の動作 $('#send').click(function(){ //二重送信防止のためログインボタンの無効化 $('#send').prop('disabled', true); //ajax通信するデータを作成 var userData = { mail: $('#mail').val(), pass: $('#pass').val(), token: $('#token').val() }; //ajax通信 $.ajax({ type: 'POST', url: './login/server-login.php', data: userData }).done(function(data){ if(data == 'xsrf'){ alert('エラーが発生しました。もう一度やり直してください。'); location.href="/index.html"; return false; } $('.caution-words').addClass('hide'); if(data.indexOf('no-mail')>-1){ $('.no-mail').removeClass('hide'); }else if(data.indexOf('not-address')>-1){ $('.not-address').removeClass('hide'); } if(data.indexOf('no-pass')>-1){ $('.no-pass').removeClass('hide'); }else if(data.indexOf('different')>-1){ $('.different').removeClass('hide'); } $('#send').prop('disabled', false); }).fail(function(XMLHttpRequest, textStatus, errorThrown) { alert('error!!!'); console.log("XMLHttpRequest : " + XMLHttpRequest.status); console.log("textStatus : " + textStatus); console.log("errorThrown : " + errorThrown.message); }).always(function(data) { console.log(data); }); }) }) </script> </div> {footer} </body></html>

回答2件
あなたの回答
tips
プレビュー