質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
JSON

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

258閲覧

PHPでつくったJSONを編集するでうまくできない

kofun

総合スコア12

JSON

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2024/04/01 10:15

実現したいこと

  • リスト新規ユーザー追加で、「,」の前に改行が入らないようにする
  • 新規ユーザー追加のIDフォームをフォームAに入力された内容+フォームBに入力された内容、フォームBには最初、自動的に8桁の数字を入力しておくようにする

前提

PHPでログインされたら処理内容選択画面(新規ユーザー追加とpswd.json直接編集)を表示し、新規ユーザー追加ではpswd.jsonの「]」の前の行の最後に「,」を追加し、改行して半角スペースを四個追加し、「{"id": "【IDフォームの内容】", "password": "【パスワード入力フォームの内容】", "content": "HTML入力フォームの内容"}」をフォームの内容に合わせて追加する、JSON直接編集ではJSONを直接編集する、というもの。

該当のソースコード

PHP

1<?php 2session_start(); 3 4// ログアウト 5if (isset($_GET['logout'])) { 6 $_SESSION['logged_in'] = false; 7 session_destroy(); 8 header("Location: {$_SERVER['PHP_SELF']}"); 9 exit; 10} 11 12// ログイン 13if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { 14 if (isset($_POST['id']) && isset($_POST['password']) && $_POST['id'] === '012' && $_POST['password'] === '234') { 15 $_SESSION['logged_in'] = true; 16 header("Location: {$_SERVER['PHP_SELF']}"); 17 exit; 18 } else { 19 if (isset($_POST['id']) || isset($_POST['password'])) { 20 $error_message = "ユーザー名またはパスワードが間違っています。"; 21 } 22 ?> 23 <!DOCTYPE html> 24 <html> 25 <head> 26 <title>ログイン</title> 27 </head> 28 <body> 29 <h1>ログイン</h1> 30 <?php if (isset($error_message)) { ?> 31 <p style="color: red;"><?php echo $error_message; ?></p> 32 <?php } ?> 33 <form method="post"> 34 ID: <input type="text" name="id"><br> 35 パスワード: <input type="password" name="password"><br> 36 <input type="submit" value="ログイン"> 37 </form> 38 </body> 39 </html> 40 <?php 41 exit; 42 } 43} 44 45// 更新処理 46if (isset($_POST['json_content'])) { 47 file_put_contents('pswd.json', $_POST['json_content']); 48 $message = '更新が完了しました。'; 49} 50 51// ユーザー追加処理 52if (isset($_POST['action'])) { 53 if ($_POST['action'] === 'edit_json') { 54 ?> 55 <!DOCTYPE html> 56 <html> 57 <head> 58 <title>JSONの編集</title> 59 </head> 60 <body> 61 <h1>JSONの編集</h1> 62 <form method="post"> 63 <textarea name="json_content" rows="10" cols="50"><?php echo htmlspecialchars(file_get_contents('pswd.json')); ?></textarea><br> 64 <input type="submit" value="更新"> 65 </form> 66 </body> 67 </html> 68 <?php 69 exit; 70 } elseif ($_POST['action'] === 'add_user') { 71 ?> 72 <!DOCTYPE html> 73 <html> 74 <head> 75 <title>新規ユーザー追加</title> 76 </head> 77 <body> 78 <h1>新規ユーザー追加</h1> 79 <form method="post"> 80 ID: <input type="text" name="new_id"><br> 81 パスワード: <input type="text" name="new_password"><br> 82 HTMLコンテンツ: <input type="text" name="new_content"><br> 83 <input type="submit" value="追加"> 84 </form> 85 </body> 86 </html> 87 <?php 88 exit; 89 } 90} 91if (isset($_POST['action']) && $_POST['action'] === 'add_user') { 92 ?> 93 <!DOCTYPE html> 94 <html> 95 <head> 96 <title>新規ユーザー追加</title> 97 </head> 98 <body> 99 <h1>新規ユーザー追加</h1> 100 <form method="post"> 101 ID: <input type="text" name="new_id"><br> 102 パスワード: <input type="text" name="new_password"><br> 103 HTMLコンテンツ: <textarea name="new_content"></textarea><br> 104 <input type="submit" name="action" value="追加"> 105 </form> 106 </body> 107 </html> 108 <?php 109 exit; 110} 111 112// ユーザー追加処理(フォーム送信後) 113if (isset($_POST['new_id']) && isset($_POST['new_password']) && isset($_POST['new_content'])) { 114 $new_data = array( 115 'id' => $_POST['new_id'], 116 'password' => $_POST['new_password'], 117 'content' => $_POST['new_content'] 118 ); 119 120 // pswd.jsonの最後の行に追加 121 $json = file_get_contents('pswd.json'); 122 $json = rtrim($json, "]\n") . ", " . json_encode($new_data) . "\n]"; 123 file_put_contents('pswd.json', $json); 124 $message = '新規ユーザーが追加されました。'; 125} 126?> 127<!DOCTYPE html> 128<html> 129<head> 130 <title>処理内容選択</title> 131</head> 132<body> 133<?php if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) { ?> 134 <p>ログイン中</p> 135 <a href="?logout=true">ログアウト</a> 136<?php } ?> 137 138<?php if (isset($message)) { ?> 139 <p><?php echo $message; ?></p> 140<?php } ?> 141 142<?php if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) { ?> 143 <h1>処理内容を選択してください</h1> 144 <form method="post"> 145 <input type="submit" name="action" value="edit_json"> pswd.jsonの編集<br> 146 <input type="submit" name="action" value="add_user"> 新規ユーザー追加 147 </form> 148<?php } ?> 149</body> 150</html>

JSON

1[ 2 {"id": "ID-148975697", "password": "PSWD-8453427", "content": "これはHTML①です"}, 3 {"id": "ID-248975697", "password": "PSWD-4453427", "content": "これはHTML②です"}, 4 {"id": "ID-348975697", "password": "PSWD-7453427", "content": "これはHTML③です"} 5]

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

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

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

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

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

guest

回答2

0

以下のような流れでは?

  • JSONデータを取得したらjson_decodeで配列で保持
  • 新規データをarray_push
  • json_encodeしてJSONファイルに上書き

参考

PHP

1<?PHP 2$id =filter_input(INPUT_POST,"id"); 3$password=filter_input(INPUT_POST,"password"); 4$content =filter_input(INPUT_POST,"content"); 5if(!empty($id) and !empty($password) and !empty($content)){ 6 $json = file_get_contents('pswd.json'); 7 $json = preg_replace("/\A\xEF\xBB\xBF/","",$json); //念の為BOMを除去 8 $json = json_decode($json,JSON_OBJECT_AS_ARRAY); 9 array_push($json,["id"=>$id,"password"=>$password,"content"=>$content]); 10 print "<pre>"; 11 print json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT ); 12 exit; 13} 14?> 15<form method="post"> 16<dl> 17<dt>ID:</dt><dd><input name="id" value="1"></dd> 18<dt>PASS:</dt><dd><input name="password" value="2"></dd> 19<dt>CONTENT:</dt><dd><input name="content" value="3"></dd> 20</dl> 21<input type="submit" value="send"> 22</form>

投稿2024/04/01 10:28

編集2024/04/02 00:19
yambejp

総合スコア114845

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

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

0

PHP

1$new_data = array( 2'id' => 'newID', 3'password' => 'paswd', 4'content' => 'HTMLcontent' 5); 6

だとして、ご提示のスクリプトを実行すると

JSON

1[ 2 {"id": "ID-148975697", "password": "PSWD-8453427", "content": "これはHTML①です"}, 3 {"id": "ID-248975697", "password": "PSWD-4453427", "content": "これはHTML②です"}, 4 {"id": "ID-348975697", "password": "PSWD-7453427", "content": "これはHTML③です"}, {"id":"newID","password":"paswd","content":"HTMLcontent"} 5]

になります。
期待しているモノでは無いかもしれませんが、

「,」の前に改行が入らないようにする

を満たしています。
質問者さんのやりたい事が良く解りません。

新規ユーザー追加のIDフォームをフォームAに入力された内容+フォームBに入力された内容、フォームBには最初、自動的に8桁の数字を入力しておくようにする

「フォームA」「フォームB」とは何でしょうか?
確かに新規ユーザー追加のフォームは2つある様に見えますが、91行目からの if の条件が成り立つ場合は存在しない(71行目と同じ条件なので、88行目で exit している)ので、2つ目のフォームは存在しないのと同じなのでは?

また、フォーム要素に初期値を持たせるのは、value属性値を使えばできます。

PHP

1$presetID = 'ID-12345678'; 2?> 3ID: <input type="text" name="new_id" value="<?=$presetID;?>">

ですが、質問者さんがどの様なIDを設定したいのか不明なので、具体的には提案が出来ません。
そして、IDという事は重複が許されないのでしょうけど、自由入力にするのは危険すぎるでしょう。

そして、HTMLのコンテンツの直接入力を許す方式は成立しません。
ブラウザからの入力を手放しで信用するのはNGとされているのを理解されているから、63行目で htmlspecialchars() を利用されているのだと思います。
なので、どこかでこの入力されたHTMLコンテンツを「HTMLとして」表示する際も htmlspecialchars() を通す事になり、ただの「文字列として」の表示しかできません。
更に63行目で htmlspecialchars() を通して与えているので、47行目で取得したデータ($_POST['json_content'])は既にエスケープされたモノですから、HTMLとしての意味を持ちません。

投稿2024/04/02 08:53

tezcello

総合スコア176

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問