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

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

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

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

Q&A

解決済

3回答

54895閲覧

SyntaxError: Unexpected token < in JSON at position 0 のエラー対策がわからない

Buretan

総合スコア33

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

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

0グッド

1クリップ

投稿2019/04/11 17:22

編集2019/04/12 04:08

解決済み追記
みなさま回答ありがとうございました!!
.ajax内のurl指定が間違えていました。
フォルダ構成も同じでやっていたので合っているものと思い込んでいました。
たくさんのアドバイスありがとうございました!!
m(_ _)m

現状

フォーム画面に3つ入力欄があり、そこに入力したテキストがデータベースへ登録され、削除、編集ができるプログラムのテストをしています。

フォーム外観
フォーム外観

index.phpファイル

php

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <title>サンプルテンプレート</title> 6 <meta name="description" content="サンプルテンプレート"> 7 <meta name="keywords" content="レストラン,フレンチ,原宿"> 8 <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"> 9 <link href="css/reset.css" rel="stylesheet" type="text/css"> 10 <script type="text/javascript" src="js/jquery.js"></script> 11</head> 12<body> 13 14 15<?php 16 require_once "functions/db.php"; 17 18 //URLパラメータを取得します。 19 //URLの後ろに?edit=123のような感じでつくのがURLパラメータです。 20 $editId = $_GET["edit"]; 21 //このパラメータをphpで取得することができます。 22 //urlを通じて編集するデータのidを受け取ります。 23 24 //受け取ったidに一致するデータをデータベースから呼び出して、、、 25 $userdataEdit = "select * from userdata where id = '".$editId."' order by id DESC"; 26 $userdataEdit = mysqli_query($mysqli,$userdataEdit); 27 28 //もしデータが存在していたら、変数に格納します。 29 while ($userdataEditArray = mysqli_fetch_assoc($userdataEdit)) { 30 $name = $userdataEditArray["name"]; 31 $age = $userdataEditArray["age"]; 32 $skill = $userdataEditArray["skill"]; 33 }; 34 35 //データの数を数えます。 36 //もしデータが存在していれば1になります。 37 //この変数は後で使います。 38 $userCount = $userdataEdit->num_rows; 39 40 //もし、フォームから投稿された(POSTされた)場合、、 41 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 42 43 //投稿されたデータを受け取ります。 44 $name = htmlspecialchars($_POST['name'], ENT_QUOTES); 45 $age = htmlspecialchars($_POST['age'], ENT_QUOTES); 46 $skill = htmlspecialchars($_POST['skill'], ENT_QUOTES); 47 48 //ここで、データの数をカウントした$userCountを使います。 49 //もしデータがデータベースの中に存在したら(数が0じゃなければ)、、、 50 if($userCount !== 0){ 51 //$editIdに一致したデータに上書きします。 52 $result = mysqli_query($mysqli,"update userdata set name = '".$name."',age = '".$age."',skill = '".$skill."' where id = '".$editId."'"); 53 }elseif (!empty($name)||!empty($age)||!empty($skill)){ 54 //もしデータが0だったら新規で追加します。 55 $result = mysqli_query($mysqli,"insert into userdata(name,age,skill) VALUES('$name','$age','$skill')"); 56 }; 57 58 }; 59 60?> 61 62<!--パラメータをつけたURLだと編集画面になるため、パラメータ無しのURLがそのまま新規追加--> 63<div style="padding-bottom:15px;"> 64 <a href="http://サーバー名/index.php/">新規追加</a> 65</div> 66 67<h1>登録フォーム</h1> 68<form method="post" action=""> 69 <!--$editIdがURLパラメータから取得された場合、該当のデータを予めvalueに入れておきます。--> 70 <input type="text" name="name" placeholder="お名前" value="<?php echo $name; ?>" /><br/> 71 <input type="text" name="age" placeholder="年齢" value="<?php echo $age; ?>" /><br/> 72 <input type="text" name="skill" placeholder="スキル" value="<?php echo $skill; ?>" /><br/> 73 <?php if($userCount == 0): ?> 74 <!--もしidに該当するデータが1つもなければ登録ボタン--> 75 <input type="submit" name="submitBtn" value="登録" /> 76 <?php else: ?> 77 <!--もしidに該当するデータが存在していれば更新ボタン--> 78 <input type="submit" name="submitBtn" value="更新" /> 79 <?php endif; ?> 80</form> 81 82 83<?php 84 85 $userdata = "select * from userdata order by id DESC"; 86 $userdata = mysqli_query($mysqli,$userdata); 87 88 while ($userdataArray = mysqli_fetch_assoc($userdata)) { 89 echo $id = $userdataArray["id"]; 90 echo ","; 91 echo $name = $userdataArray["name"]; 92 echo ","; 93 echo $age = $userdataArray["age"]; 94 echo ","; 95 echo $skill = $userdataArray["skill"]; 96 echo "|"; 97 echo "<button class='deleteBtn' data-id='".$id."'>削除する</button>"; 98 echo "|"; 99 echo "<button class='editBtn' data-id='".$id."'>編集する</button>"; 100 echo "<br>"; 101 }; 102 103?> 104 105 106<script> 107 108 $(".deleteBtn").click(function(){ 109 var btnid = $(this).data("id"); 110 deleteData(btnid); 111 }); 112 113 $(".editBtn").click(function(){ 114 var btnid = $(this).data("id"); 115 window.location.href = "./?edit="+btnid; 116 117 }); 118 119 function deleteData(btnid){ 120 $.ajax({ 121 type: 'POST', 122 dataType:'json', 123 url:'functions/delete_func.php', 124 data:{ 125 btnid:btnid, 126 }, 127 success:function(data) { 128 window.location.href = "./"; 129 }, 130 error:function(XMLHttpRequest, textStatus, errorThrown) { 131 alert(errorThrown); 132 } 133 }); 134 }; 135 136</script> 137 138</body> 139</html>

db.phpファイル

php

1<?php 2 $mysqli = new mysqli("サーバー名", "ユーザー名", "パスワード", "データベース名"); 3 if ($mysqli->connect_errno) { 4 printf("接続失敗: %s\n", $mysqli->connect_error); 5 exit(); 6 } 7?>

delete_func.phpファイル

php

1<?php 2 3 require_once "db.php"; 4 5 $jsondata = $_POST['btnid']; 6 $resultcontents = mysqli_query($mysqli,"delete from userdata where id = '".$jsondata."'"); 7 header('Content-type: application/json'); 8 echo json_encode( $jsondata ); 9?>

問題点

削除ボタンを押すと
SyntaxError: Unexpected token < in JSON at position 0
のエラーが出て削除ボタンが機能しません。


やったこと
問題集にある文法をそのままコピペ

変更した箇所
サーバー名やデータベース名、パスワード、トップページ(新規追加用のリンク)のurlなど


このエラー文についてググったところ構文エラーと出ており、エラー文内の”<”はindex.phpファイルの先頭にある<!DOCKTYPE>の<であるようです。コンソール画面に出ていました。
ためしにこの<!DOCKTYPE>の<を消すと今度は!が該当する記号としてエラー文とともに出てきます。

教材の回答ページではエラーも出ずに機能してるのですが、自分の環境で再現するとエラーを吐いているため教材自体が間違ってはいないと思うのですが、どこをどういじったらいいかわからず困っています。

ご教授のほど、よろしくおねがいします。


追記:console.log(btnid)を追加

javascript

1 2 $(".deleteBtn").click(function(){ 3 var btnid = $(this).data("id"); 4 console.log(btnid);              //<-----追加した文言 5 deleteData(btnid); 6 }); 7 8 //編集ボタンをeditBtnをクリックすると、、 9 $(".editBtn").click(function(){ 10 //ボタンにセットされたdata-idを取得。 11 var btnid = $(this).data("id"); 12 console.log(btnid);              //<-----追加した文言 13 //URLにパラメータ./?edit={id}をつけて再読み込み。 14 window.location.href = "./?edit="+btnid; 15 //次の画面でURLパラメータをphpが受け取り、処理。 16 //冒頭から読み返してみてください。 17 }); 18 19 function deleteData(btnid){ 20 $.ajax({ 21 type: 'POST', 22 dataType:'json', 23 url:'functions/delete_func.php', 24 data:{ 25 btnid:btnid, 26 }, 27 success:function(data) { 28 window.location.href = "./"; 29 }, 30 error:function(XMLHttpRequest, textStatus, errorThrown) { 31 alert(errorThrown); 32 } 33 }); 34 };

コンソール画面に押したボタンのidが表示されました。
イメージ説明

keiさんのアドバイスに対しての追記
レスポンス画面
イメージ説明

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

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

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

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

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

guest

回答3

0

SyntaxError: Unexpected token < in JSON at position 0

これが出ている場合は、たいてい変数の値を取得できていません。変数に対し
undefined variable …
だとか、エラーが発されている場合で、それによってエスケープしないといけない値が
表示されてしまい、json化できなくてアラートが表示されます。

まず、順番に

  1. フォーム上で削除したいデータのidの値は正しく取得しているのか?
  2. PHPプログラム上できちんとidの値は送られているのか?

変数の流れを順番に見ていった方がいいです。

あとPHPはたいていhtml構文の先頭に記述した方がトラブルが少なくなります。html構文はあくまでPHPの出力変数を埋め込む場所と認識した方がいいでしょう。

投稿2019/04/12 01:02

FKM

総合スコア3647

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

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

Buretan

2019/04/12 02:39

回答ありがとうございます。 先のアドバイスに基づいてコンソール画面に出す試行をしてみたところ、btnid自体は編集ボタンを押したときのものと同じため、一致しているのではないかと思われます。(文法が同じなので当然ですが) 補足に試行時の画面を追記させていただきましたので、ご確認ください。 >>html構文の先頭に記述した方がトラブルが少なくなります 登録フォームのhtml文より前にphpの記述をもっていくということでしょうか? 試しにechoで登録内容を出力する部分のphpを上に持っていったところ、最下部の出力内容がフォーム入力欄に固定で出力されるようになり、どの編集ボタンを押してもすべて最下部の出力内容が固定表示されるようになりました。 すみません、文章だけだとちょっとわかりにくいかもしれませんが、折角のアドバイスだったので試行結果を報告させていただきます。
FKM

2019/04/12 02:49 編集

そこは、分岐処理などが必要になるでしょうから、今回では保留しときましょうか。 本題ですが、一致しているかどうかは推測ではなく、スクリプトの中で実際にconsole.log(btnid)やalert(btnid)を打ち込んで確かめてみた方がいいです。 そうやって、なぜプログラムがエラーを吐いているのかチェックを行うためには、面倒でもひとつひとつルートを追跡していくのがモアベターなので。
Buretan

2019/04/12 03:03

わかりました。 確認するよう気をつけます。 ありがとうございます!!
guest

0

ベストアンサー

headerでContent-typeをjsonとしているときなど、出力しようとしている情報がjson形式として正しくない場合に出るエラーです。
ざっと見た感じ変なところがないようには見えますが、もしかしたら$_POST['btnid']が単なる文字列からなのかな、、、、とかいう感じです。
以下、試してみてください。

php

1echo json_encode([$jsondata]);

配列にします。

もちろんJSON形式として正しくない、というのがエラーの原因なので、JSONデータ以外に何かしら出力があればそれも「JSON形式として正しくない」と認識されます。
例えばPHPのエラー出力されてたり、とか。

あと、後に何も出力がないのでしたら?>は不要です。

不要な?>を書いてはいけない理由は明確で、<?php … ?>の外にあるコードは出力されてしまうからだ。つまり、誰かが?>の直後に余分な改行を入れてしまったら、わかりにくいタイミングで意図しない改行が出力されることになる

試してみてほしいこと2(※根本的な解決方法ではありません)

php

1<?php 2ob_start(); //追加 3 4 require_once "db.php"; 5 6 $jsondata = $_POST['btnid']; 7 $resultcontents = mysqli_query($mysqli,"delete from userdata where id = '".$jsondata."'"); 8ob_end_clean(); //追加 9 header('Content-type: application/json'); 10 echo json_encode( $jsondata );

試してみてほしいこと3(※データベースに影響を及ぼす処理にはtry-catchは必須です)

php

1try{ 2 require_once "db.php"; 3 4 $jsondata = $_POST['btnid']; 5 $resultcontents = mysqli_query($mysqli,"delete from userdata where id = '".$jsondata."'"); 6 header('Content-type: application/json'); 7 echo json_encode( $jsondata ); 8}catch(mysqli_sql_exception $e){ 9 echo json_encode( $e ); 10}

ミニマムコード

画面側

html

1<button type="button" class="deleteBtn" data-id="1">1削除</button> 2<button type="button" class="deleteBtn" data-id="2">2削除</button> 3<button type="button" class="deleteBtn" data-id="3">3削除</button> 4<button type="button" class="deleteBtn" data-id="4">4削除</button> 5<script 6 src="https://code.jquery.com/jquery-3.3.1.min.js" 7 integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" 8 crossorigin="anonymous"></script> 9 <script> 10 $(".deleteBtn").on('click',function(){ 11 console.log($(this).data('id')); 12 $.ajax({ 13 type: 'POST', 14 dataType:'json', 15 url:'a.php', 16 data:{ 17 btnid:$(this).data('id'), 18 }, 19 success:function(data) { 20 console.log('success'); 21 console.log(data); 22 }, 23 error:function(XMLHttpRequest, textStatus, errorThrown) { 24 console.log(XMLHttpRequest); 25 console.log(textStatus); 26 console.log(errorThrown); 27 } 28 }); 29 }); 30 </script>

ajaxで呼び出される側

php

1<?php 2echo json_encode( $_POST['btnid'] );

console.log結果:

1 success 1 2 success 2 3 success 3

※ちなみにheader()つけても同じでした

php

1<?php 2header('Content-type: application/json'); 3echo json_encode( $_POST['btnid'] );

ちなみに存在しないphp、URLをurlに指定した場合は下記のようなエラーが出た
SyntaxError: Unexpected token s in JSON at position 0

URL間違ってるかも?

投稿2019/04/11 21:17

編集2019/04/12 03:49
m.ts10806

総合スコア80875

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

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

Buretan

2019/04/12 00:59

回答ありがとうございます。 上記3点を試してみましたが、いずれも同様に SyntaxError: Unexpected token < in JSON at position 0 のエラーが出てしまいました。
m.ts10806

2019/04/12 01:13 編集

で、あれば正しくbtnidが渡っていないと思います。 var btnidの宣言をclickイベント内ではなくグローバルスコープに出してください。イベント内のvar宣言は取ってくださいね
Buretan

2019/04/12 02:26

>>グローバルスコープに出してください。 コンソール画面に出すという認識でいいのでしょうか? 試してみたところ編集ボタン、削除ボタンともに押した際に出てくるidは一致していましたが、削除ボタンを押したときのみエラーがまた出ました。 試行画面を補足として追記しましたので、ご確認ください。
m.ts10806

2019/04/12 02:34 編集

ごめんなさいちょっと勘違いしてました。 引数で渡してたんですね。 私がしてほしかったのは下記、 var btnid = ''; $(".deleteBtn").click(function(){ btnid = $(this).data("id"); deleteData(); }); $(".editBtn").click(function(){ btnid = $(this).data("id"); window.location.href = "./?edit="+btnid; }); function deleteData(){ $.ajax({ type: 'POST', dataType:'json', url:'functions/delete_func.php', data:{ btnid:btnid, }, success:function(data) { window.location.href = "./"; }, error:function(XMLHttpRequest, textStatus, errorThrown) { alert(errorThrown); } }); };
m.ts10806

2019/04/12 02:35

あ、もちろんbtnidが想定した値かどうかを確認するのは必要です。
m.ts10806

2019/04/12 02:43

delete_func.phpのほうで下記だけ書いた場合は何が返ってきますか? <?php header('Content-type: application/json'); echo json_encode( $_POST['btnid'] );
Buretan

2019/04/12 03:01

追記ありがとうございます。 delete_func.phpの分も含めて追記分を試行してみました。 結果は同じエラーが返って来ました。
m.ts10806

2019/04/12 03:07

header()をコメントアウトするとどうですか?
Buretan

2019/04/12 03:15

コメントアウトしてみましたがだめでした。 同じエラーが出ました。
m.ts10806

2019/04/12 03:19

下記2パターンではどうでしょうか 1つ目 <?php echo json_encode( $_POST['btnid'] ); 2つ目 <?php echo json_encode( ['a'] );
m.ts10806

2019/04/12 03:28

もし2つ目でも同じエラーなら<?php ?>の外に空白があったりするのではと
Buretan

2019/04/12 03:30 編集

いろいろ試してくれてありがとうございます。 2点試してみましたが同じエラーが出ました汗 了解です。 確認してみます!!
m.ts10806

2019/04/12 03:50

ミニマムコード追記しました。 全て正しく指定されているのであれば押したdata-idの値がちゃんと返ってきます。 最後に仮説で書きましたが、 'functions/delete_func.php' ←この指定が間違っているのでは?
Buretan

2019/04/12 04:02

解決しました!! url間違ってました。 httpからすべて手入力でurlに入れたところエラーも出ず、削除ボタンも機能しました。 たくさんの試行錯誤ありがとうございました!! m(_ _)m
m.ts10806

2019/04/12 04:05

あぁ。やっぱり、ですね。 たぶん最初に<!・・・と出てたのはサーバー側のエラー画面のhtmlかもしれませんね。 解決されたようで何よりです。 functions/delete_func.php だと相対パスになるので /functions/delete_func.php のような絶対パスにされると良いかもしれません。 httpから全て打つと環境変わるたびに打ち換えなきゃいけませんので。 問題切り分け、問題解決までに確認できるヒントがたくさん今回出たと思うので、 まず確認してみてください。自己解決できるようになると成長を実感できます。
Buretan

2019/04/12 04:28

実はjQueryを読み込む際にも読み込めていないエラーが出ていてhttpから入力して解決していたのですが、その時点で他のurl指定箇所を調べるべきでした。 いつも丁寧なアドバイスと試行錯誤をしていただき、感謝いたします。
m.ts10806

2019/04/12 04:29

jQuery本体という話でしたら私のミニマムコードにあるようにCDN使ったほうが確実ですね。 他のプラグインとかもそうですが、本体のコードをいじることがないのでしたら自分のところに置いておく必要はないと思います。
Buretan

2019/04/12 04:31

了解です!! ありがとうございます!!
guest

0

デベロッパーツール の Networkタブ のResponse部分を確認してみてください。

【Chrome デベロッパーツール Networkパネルの使い方 | Web Tips】
https://weback.net/utility/1491/#contents-6

投稿2019/04/12 02:33

kei344

総合スコア69596

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

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

Buretan

2019/04/12 03:09

回答有り難うございます。 確認してみましたが、赤文字のエラーなどはなかったです。 初めて使ってみたのでそういう見方であってるかちょっとわかりませんが、ありがとうございます。
kei344

2019/04/12 03:13

エラーではなくResponseにJSONが来ているかを確認してください。
Buretan

2019/04/12 03:25

追記にresponseの確認画面を追加いたしました。 エラー時は空白になっているのでJSONが来ていないということでしょうか?
kei344

2019/04/12 03:29

PHPのエラーメッセージを表示するようにしてから、もう一度確認してみてください。 特に設定していない場合、PHPでエラーが起こると中身なしで返ってくることがあります。 【PHPのエラーメッセージを出力する | mawatari.jphttps://mawatari.jp/archives/how-to-display-php-errors
Buretan

2019/04/12 04:05

解決しました! .ajaxのurlが間違えていました。 httpから省略せずに入力したところエラーも出ずに削除ボタンも機能しました。 アドバイスありがとうございました!! ちなみにこの確認機能はdelete_func.php内で入力するのでしょうか? それともindex.php内?
kei344

2019/04/12 04:48

httpでアクセスする全PHPファイルの先頭。requireでしか呼ばれないファイルの場合は不要。
Buretan

2019/04/12 06:11

わかりました。 ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問