🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

2319閲覧

PHP7.0では動くコードが7.3で動かない

nosonosolife

総合スコア42

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/09/05 20:15

編集2019/09/06 01:44

現在チャットサイトを運営しているのですが、PHPの設定を7.0から7.3に変更したところ、メッセージを送信する(実際にはメッセージなどの情報をJSONファイルに保存する)プログラムだけが動かなくなりました。
コードを何回も見直してみましたが原因がわからず、困っています。
どうかご提示よろしくお願いいたします。

PHP

1<?php 2session_start(); 3ini_set('display_errors', 1); 4ini_set('error_reporting', E_ALL); 5ini_set('log_errors', 'On'); 6 7// ログの保存先 8ini_set('error_log', __DIR__ . '/error.log'); 9if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest')) { 10 if($_SERVER["REQUEST_METHOD"] == "POST"){ 11 if (isset($_POST["csrf_token"]) && $_POST["csrf_token"] === $_SESSION['csrf_token']) { 12 mb_language("uni"); 13 mb_internal_encoding("utf-8"); //内部文字コードを変更 14 mb_http_input("auto"); 15 mb_http_output("utf-8"); 16 17 date_default_timezone_set('Asia/Tokyo'); 18 19 if(isset($_POST["Message"]) && isset($_SESSION['user_name'])){ 20 if($_POST["Type"] == "normal"){ 21 $Type = "normal"; 22 } 23 $Name = htmlspecialchars($_SESSION['user_name']); 24 if(isset($_SESSION['user_trip'])){ 25 $Trip = htmlspecialchars($_SESSION['user_trip']); 26 } 27 $Message = htmlspecialchars($_POST["Message"]); 28 $Namecolor = htmlspecialchars($_SESSION['name_color']); 29 $Textcolor = htmlspecialchars($_SESSION['text_color']); 30 $Unixtime = htmlspecialchars($_SERVER['REQUEST_TIME']); 31 $IPaddress = htmlspecialchars($_SERVER["REMOTE_ADDR"]); 32 $Hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']); 33 34 $url = '../data/log/chatlog_'.$_SESSION['room_id'].'.json'; 35 $json = file_get_contents($url); 36 $records = json_decode($json, true); 37 $Num = count($records); 38 $Num++; 39 40 $records[] = [ 41 'num' => $Num, 42 'type' => $Type, 43 'unixtime' => $Unixtime, 44 'name' => $Name, 45 'trip' => $Trip, 46 'message' => $Message, 47 'namecolor' => $Namecolor, 48 'textcolor' => $Textcolor, 49 'ipaddress' => $IPaddress, 50 'hostname' => $Hostname, 51 ]; 52 53 $out_json = json_encode($records); 54 55 $result = file_put_contents($url, $out_json, LOCK_EX); 56 57 $url2 = '../data/roomlist.json'; 58 $json2 = file_get_contents($url2); 59 $array = json_decode($json2, true); 60 $result_index2 = array_keys(array_column($array, 'id'), $_SESSION['room_id']); 61 62 foreach ($result_index2 as $index) { 63 $array[$index]['updatetime'] = $Unixtime; 64 } 65 66 $out_json2 = json_encode($array); 67 $result2 = file_put_contents($url2, $out_json2, LOCK_EX); 68 session_write_close(); 69 70 header("Content-Type: application/json; charset=UTF-8"); 71 echo json_encode($_SESSION); 72 exit; 73 } 74 } 75 } 76} 77?>

【追記】
var_dump($_SESSION);した結果を記載します。
※「◆◆◆」は諸事情により伏字にしてあります

php

1array(11) { ["room_id"]=> string(8) "◆◆◆" ["user_name"]=> string(9) "◆◆◆" ["user_trip"]=> string(0) "" ["user_state"]=> string(0) "" ["last_log"]=> array(5) { ["num"]=> int(12) ["type"]=> string(4) "info" ["unixtime"]=> int(1567731477) ["name"]=> string(12) "◆◆◆" ["message"]=> string(43) "◆◆◆" } ["last_log_num"]=> int(12) ["name_color"]=> string(5) "black" ["text_color"]=> string(5) "black" ["csrf_token"]=> string(32) "0e82781dc1bc513c6118aa753eb94d14" ["username"]=> string(5) "◆◆◆" ["user_log"]=> string(0) "" }

【追記】
HTML(PHP)、javascriptも記載します。
//「room.php」HTML(PHP)
※文字数制限のため一部省略しています

PHP

1<?php 2session_start(); 3session_id(sha1(uniqid(microtime()))); 4if( !isset( $_SESSION['room_id'] ) ) { 5 $_SESSION['room_id'] = $_GET['id']; 6} 7$_SESSION['user_name'] = ""; 8$_SESSION['user_trip'] = ""; 9$_SESSION['user_state'] = ""; 10$_SESSION['last_log'] = ""; 11$_SESSION['last_log_num'] = ""; 12$_SESSION['name_color'] = ""; 13$_SESSION['text_color'] = ""; 14$_SESSION['csrf_token'] = ""; 15 $toke_byte = openssl_random_pseudo_bytes(16); 16 $csrf_token = bin2hex($toke_byte); 17 $_SESSION['csrf_token'] = $csrf_token; 18 19$json = file_get_contents('data/roomlist.json'); 20$array = json_decode($json, true); 21$result = array_keys(array_column($array, 'id'), $_GET["id"]); 22if(!isset($_GET["id"]) || empty($result)){ 23 header("HTTP/1.1 404 Not Found"); 24 header('Location: ./'); 25 exit; 26} 27foreach ($result as $index) { 28 $room_name = $array[$index]['name']; 29} 30?> 31<!DOCTYPE html> 32<html lang="ja"> 33<head> 34 <meta charset="utf-8"> 35 <title><?php echo $room_name ?> - チャット</title> 36 37 <link href="css/main.css" rel="stylesheet" type="text/css"> 38 <script src="js/jquery.js" type="text/javascript"></script> 39 40 <script src="js/lib/eventsource.js"></script> 41 <script type="text/javascript" src="js/script_room.js"></script> 42 <script type="text/javascript" src="js/jquery.cookie.js"></script> 43<script type="text/javascript"> 44<!-- 45$(document).ready(function(){ 46initScript(); 47}); 48--> 49</script> 50 </head> 51 <body> 52 <article id="mainbox" ontouchstart=""> 53 <h1><?php echo $room_name ?></h1> 54 <section id="userform" class="on"> 55 <form action="php/userinout.php" method="post"> 56 <input type="hidden" name="State" value="in"> 57 <input type="text" name="Name" maxlength="20" value="" placeholder="お名前(最大20文字)"/> 58 <input name="Passcode" size="40" type="text" maxlength="10" value="" placeholder="トリップ(最大10文字)"> 59 <script language="JavaScript" type="text/javascript"> 60 <!-- 61 document.write('<input type="submit" id="submit" name="submit" value="入室"/>'); 62 --> 63 </script> 64 <noscript>JavaScriptを有効にしてください</noscript> 65 </form> 66 </section> 67 <section id="sendform" class="on"> 68 <form action="php/send.php" method="post"> 69 <input type="hidden" name="csrf_token" value="<?php echo $csrf_token ?>"> 70 <input type="hidden" name="Type" value="normal"> 71 <input name="Message" placeholder="メッセージ(最大200文字)" maxlength="200"></textarea> 72 <script language="JavaScript" type="text/javascript"> 73 <!-- 74 document.write('<input type="submit" id="submit" name="submit" value="送信"/>'); 75 --> 76 </script> 77 <noscript>JavaScriptを有効にしてください</noscript> 78 </form> 79 <button id="chatout-btn" href="javascript:void(0);" onclick="chatOut();">退室する</a> 80 </section> 81 <p id="formerror"></p> 82 <span class="usercount">入室者 0人</span> 83 <span class="romcount">閲覧者 0人</span> 84 <hr> 85 <section id="log-frame"> 86 </section> 87 </article> 88 <footer> 89 <p><small>Copyright&copy; 2019 XXX</small></p> 90 </footer> 91 </body> 92</html> 93

//「script_room.js」javascript
※文字数制限のためajax通信部分のみ記載します

javascript

1 if($('#sendform')){ 2 $("#sendform form").submit(function(e){ 3 e.preventDefault(); 4 5 if ($("input[name='Message']").val() == '') { 6 $("#formerror").text("メッセージを入力してください"); 7 return false; 8 }else if (hasNGWords($("input[name='Message']").val(), ngwords)){ 9 $("#formerror").text("メッセージに禁止ワードが含まれています"); 10 return false; 11 }else if ($("input[name='Message']").val().length > 200) { 12 $("#formerror").text("メッセージが長すぎます(最大200文字)"); 13 return false; 14 }else{ 15 $("#formerror").text(""); 16 $.ajax({ 17 type: $(this).attr('method'), 18 url: $(this).attr('action'), 19 data: $(this).serialize(), 20 timeout: 10000, // 単位はミリ秒 21 22 // 送信前 23 beforeSend: function(xhr, settings) { 24 // ボタンを無効化し、二重送信を防止 25 $("#sendform #submit").val("送信中…").prop("disabled",true); 26 }, 27 // 応答後 28 complete: function(xhr, textStatus) { 29 // ボタンを有効化し、再送信を許可 30 //$.cookie("SendRegulation", "true", {expires: date, path: "/", domain: ""}); 31 }, 32 success: function(result, textStatus, xhr, data) { 33 console.log(result); 34 $("input[name = 'Message']").val(''); 35 $("#sendform #submit").val("送信").prop("disabled",false); 36 //logDataRead(); 37 }, 38 // 通信失敗時の処理 39 error: function(xhr, textStatus, error) { 40 $("#formerror").text("送信に失敗しました"); 41 } 42 }); 43 44 return false; 45 } 46 return false; 47 }); 48 } 49}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/09/05 20:42

エラーとか出てるのでは? ログ確認してみてください
nosonosolife

2019/09/05 21:54

何度も確認しましたが、なぜかエラーは出ませんでした。
m.ts10806

2019/09/05 21:58

エラーはどうやって確認していますか?では「動かない」とは何が起きてるのでしょう? 処理はどこまでいってますか?
nosonosolife

2019/09/05 22:41

訂正ですが、エラーが出なかったのはブラウザの表示上で、エラーをログファイルに記録するようにしたところ、 [06-Sep-2019 07:31:36 Asia/Tokyo] PHP Notice: Undefined variable: _SESSION in /virtual/■■■/public_html/test/php/send.php on line 11 のエラーが記録されていました。
nosonosolife

2019/09/05 22:43

エラーが出た個所はこの部分です。 if (isset($_POST["csrf_token"]) && $_POST["csrf_token"] === $_SESSION['csrf_token']) {
m.ts10806

2019/09/06 00:07

質問本文に追記してもらえたらと。こちらのコメント欄はデフォルト非表示ですので。
m.ts10806

2019/09/06 00:08

あとsend.php on line 11となっていますが11行目は mb_http_output("utf-8"); です。省略しているところがあるようですが、そこはどうなってますか?
guest

回答2

0

出ているNotice(PHP Notice: Undefined variable: _SESSION)の通りだと、
原因は$_SESSION['csrf_token']が存在しないからのように見えます。

$_SESSION['csrf_token']には値がちゃんと入っていますか?

投稿2019/09/05 23:37

nnahito

総合スコア2006

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nosonosolife

2019/09/05 23:57

>$_SESSION['csrf_token']には値がちゃんと入っていますか? はい。var_dump($_SESSION);で確認したところ正常に表示されました。
m.ts10806

2019/09/06 00:41

おかしいですね。 Undefined variable: _SESSION が出るなら「var_dump($_SESSION);で確認したところ正常に表示されました」となる理由がないです。 https://paiza.io/projects/eln6drJRfDPWRz5NlzbtYA ↑のようにvar_dump()でしても同じNoticeが出ます。 どう出るのでしょうか?質問本文に var_dump($_SESSION); の結果を提示してください。 もちろんsend.phpで出力確認したんですよね?
nosonosolife

2019/09/06 01:12

>もちろんsend.phpで出力確認したんですよね? 別途var_dump()を出力するPHPファイルを用意して確認しました。
m.ts10806

2019/09/06 01:16 編集

それだと問題が起きているファイルではないので意味がないですね。 テキストファイルなどで良いので 例えば json_encode($_SESSION); の結果をログ出力するようにして確認してください。
nosonosolife

2019/09/06 01:22

確認したところ、先ほどログファイルに記録されたものと同じエラーが返ってきました。
m.ts10806

2019/09/06 01:25 編集

人の回答に横やりし続けて申し訳ないですが・・・ もう質問に1点追記願います。 Ajaxを呼び出している記述。つまり、HTML,JavaScriptのコードも追記してもらえますか?
nnahito

2019/09/06 01:24

m.ts10806さんが記載されている、 var_dump($_SESSION); の結果をここに書いていただいても良いですか?
m.ts10806

2019/09/06 01:25

あと別途コメントで確認している、エラーで出ている行数と合わないのでsend.phpのコードを全て
guest

0

自己解決

「send.php」がBOMありで保存されていたことが原因だったようです。
BOMなしに変更したところ正常に動きました。

投稿2019/09/06 10:21

nosonosolife

総合スコア42

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問