現在チャットサイトを運営しているのですが、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© 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}
回答2件
あなたの回答
tips
プレビュー