xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
alert("送れました"); //これも毎回表示されます
- location.href="../experiment/";
+ console.log(xhr.response);
}
}
このような感じでxhr.response
のデータを確認することはできますか?
①window.prompt
を利用し、ユーザーに希望ユーザー名を入力してもらう(実装済み)
②XMLHttpRequestを使用して、希望ユーザー名を別ページのPHPファイルに送りたい(ここで困っています)
③PDOを使用し、SQLのデータベースに希望ユーザー名を登録(②が解決すればできます)
送れているはずの変数を、別ページで参照できません。
▼localhost/hoge/account/index.php
<?php
/*中略*/
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$.ajax({
success : function(response){
alert('ajaxの接続は成功');
//ページを開くと毎回「ajaxの接続は成功」と出ています。
},
error: function(){
alert('ajaxの通信失敗');
}
});
</script>
</head>
<body>
<main class="main">
<?php /* JavaScript用の関数定義 */ ?>
<script type="text/javascript">
function changeName(){
var newName = window.prompt("新しい名前を入力してください","");
//ajaxでphpにデータを送る
let xhr = new XMLHttpRequest();
xhr.open('POST','../experiment/',true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
xhr.send('text='+newName);
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
alert("送れました"); //これも毎回表示されます
location.href="../experiment/";
}
}
};
<?php /* 中略 */ ?>
<ul>旧アカウント名が入ります<input type="button" onClick="changeName()" value="変更する"></ul>
<?php /* 後略 */ ?>
▼localhost/hoge/experiment/index.php ※実験用のphpファイル
<?php
/* 中略 */
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$.ajax({
success : function(response){
alert('ajaxの接続は成功');
//ページを開くと毎回「ajaxの接続は成功」と出ています。
},
error: function(){
alert('ajaxの通信失敗');
}
});
</script>
</head>
<body>
echo var_dump($_POST);
//出力結果は「array(0) { }」になってしまう
?>
</body>
<?php /* 後略 */ ?>
$.post
でも同じシステムを実装しようとしましたが、うまくいきませんでした。window.prompt
の入力内容をPHPのPDO経由でSQLに登録」が実装できるようなら、そのアイデアをご教示いただければ幸いです。 ※input
タグから$_POST
にデータを格納して……という方法のほうが楽なのは承知しておりますが、技術練習のため今回はこの方法をあえて避けています。xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
alert("送れました"); //これも毎回表示されます
- location.href="../experiment/";
+ console.log(xhr.response);
}
}
このような感じでxhr.response
のデータを確認することはできますか?
@I-know-way
Questioner@I-know-way
QuestionerFidder などのキャプチャツールを使って要求・応答を見てください。
@I-know-way
Questioner先に、
Fidder などのキャプチャツールを使って要求・応答を見てください。
・・・と書きましたが無反応なので少し詳しく書いておきます。
例えば、以下のように jQuery Ajax を使って JSON 文字列を data に設定して POST 送信したとします。
function apiHeroesPost() {
var j = { Id: 6, Name: "Batman" };
var jsonString = JSON.stringify(j);
$.ajax({
type: "POST",
url: "/values",
data: jsonString,
contentType: "application/json; charset=utf-8",
success: function (data) {
$('#heroes').empty();
$.each(data, function (key, val) {
var str = val.id + ': ' + val.name;
$('<li/>', { html: str }).appendTo($('#heroes'));
});
},
error: function (jqXHR, textStatus, errorThrown) {
$('#heroes').empty();
$('#heroes').text('textStatus: ' + textStatus +
', errorThrown: ' + errorThrown);
}
});
}
その要求・応答を Fiddler で見ると以下の画像のようになります。
期待通り要求が出ているのが分かります。送信した JSON 文字列は赤枠で囲ったとおり正しくフォームデータとして送信されています。
応答も期待通り返ってきています。コンテンツは JSON 文字列を期待していますが、青枠で囲ったように期待通りです。
応答の JSON 文字列は JavaScript オブジェクト(連想配列)にデシリアライズされて上のコードの success に設定した function の引数 data に渡されます。それを function 内のコードで html に書きだすと以下のようになります。
Fiddler でなくてもブラウザの開発者ツールを使って要求・応答をキャプチャできるのでやってみてください。それをしないで議論しても「闇夜に鉄砲」という感じです。
@I-know-way
Questioner@I-know-way
Questioner@I-know-way
QuestionerAjax理解に対する根本的な解決ではないですが、「ほしい機能」はGET通信で実装できましたので、セルフコメントを残しておきます。
experiment/index.php側でも表示されることはチェック済みです。
▼localhost/hoge/account/index.php
//前略
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
alert("送れました");
location.href="../experiment/index.php?newname="+encodeURIComponent(newName);
//後略
▼localhost/hoge/exmeriment/index.php
//前略
echo $_GET['newname'];
//後略