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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

JavaScript

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

Q&A

解決済

2回答

1040閲覧

<input type="file">とphpとmysql(phpmyadmin)で画像のデータを保存+表示したい

7p0e2r1u

総合スコア2

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

JavaScript

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

0グッド

0クリップ

投稿2022/11/13 04:47

 本の情報をデータベースに保存し、別ページで表示するシステムを製作中です。(使用言語:html,php,mysql)
その中で、データベースに画像のデータを保存し、別ページに表示する所で思ったようにいかず行き詰っているので質問させていただきます。
現状の大まかな流れは、
<input type="file">で画像を別ページへpostでデータを送る。
②前ページから受け取った画像データをphpでデータベースに保存($_FILES['shohin_img']['tmp_name']をfile_get_contents()し、データベースのMEDIUMBLOBの属性にINSERTする)。
③データベースにselect文で先ほど保存した画像のデータを取得し、html+phpで表示する。
となっています。この中で、①と②はデータベースにデータが登録されていることから実装出来ていると考えています。

問題は③の画像データを取得し、表示する所が実装できていません。
エラーメッセージが見当たらず、表示する部分のコードが
<img src="image.php?id=21?detailId=0" width="100" height="auto" class="mr-3">
となってaltいるので恐らくデータベースから引っ張ってきた後に何か問題があるのかと考えました。
しかし、そこから数日間解決することが出来なかったので質問させていただきます。

以下コードです。見苦しい点などあると思いますがどうぞよろしくお願いします。
shohinsテーブル(本の情報を登録するテーブル)

CREATE TABLE shohins( shohin_id BIGINT(10) NOT NULL AUTO_INCREMENT, shohin_ISBN BIGINT(13), shohin_bookcode BIGINT(13), shohin_mei VARCHAR(200) NOT NULL, shohin_bunrui VARCHAR(200) NOT NULL, hanbai_bi DATE NOT NULL, shohin_kakaku INT NOT NULL, shohin_writer VARCHAR(200), shohin_conpany VARCHAR(200), PRIMARY KEY(shohin_id) );

shohindetailテーブル(商品の画像を保存+表示するためのテーブル)

CREATE TABLE shohindetails( shohin_id BIGINT NOT NULL, shohindetail_id BIGINT NOT NULL AUTO_INCREMENT, shohin_img MEDIUMBLOB, image_name VARCHAR(256), image_type VARCHAR(64), image_size INT, created_at DATETIME, KEY(shohindetail_id), PRIMARY KEY(shohin_id,shohindetail_id), FOREIGN KEY(shohin_id) REFERENCES shohins(shohin_id) );

insertShohin.php(本の情報をformに入れて渡すページ)

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>商品登録</title> <style> body{ background-color: #e9e9e9; } .inputs{ width:80%; } .fixText{ padding-left:10%; } .card{ border: 3px solid #000000; border-radius: 15px; } #preview img { width: 200px; margin: 10px; border: solid 1px silver; } </style> <script> </script> </head> <body> <button onclick="location.href='./top.php'">トップページ</button> <button onclick="location.href='./newMember.php'">会員登録</button> <button onclick="location.href='./login.php'">ログイン</button> <button onclick="location.href='./insertShohin.php'">本の登録</button> <button onclick="location.href='./insertTweet.php'">つぶやき投稿</button> <br> <div class="row"> </div> <div class="card offset-3 col-6" style="padding-bottom:10%; "> <h1 class="mt-5 mb-5 text-center">本の情報登録</h1> <form action="insertShohinCheck.php" name="insertBookForm" method="post" enctype="multipart/form-data"> <div class="fixText"> <h6>商品名:<font color="#ff0000">必須</font></h6> <input type="text" name="shohin_mei" class="inputs"><br/> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="fixText"> <h6>バーコード一段目(ISBNコード):</h6> <input type="text" name="isbn" class="inputs" required><br/> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="fixText"> <h6>バーコード二段目(日本図書コード):</h6> <input type="text" name="tosyo" class="inputs"><br/> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="fixText"> <h6>ジャンル:<font color="#ff0000">必須</font></h6> <label for="b1"><input type="radio" name="bunrui" value="文芸" id="b1"checked>文芸</label><br/> <label for="b2"><input type="radio" name="bunrui" value="実用書" id="b2">実用書</label><br/> <label for="b3"><input type="radio" name="bunrui" value="ビジネス書" id="b3">ビジネス書</label><br/> <label for="b4"><input type="radio" name="bunrui" value="経済・経営" id="b4">経済・経営</label><br/> <label for="b5"><input type="radio" name="bunrui" value="絵本" id="b5">絵本</label><br/> <label for="b6"><input type="radio" name="bunrui" value="児童書" id="b6">児童書</label><br/> <label for="b7"><input type="radio" name="bunrui" value="学習参考書" id="b7">学習参考書</label><br/> <label for="b8"><input type="radio" name="bunrui" value="専門書" id="b8">専門書</label><br/> <label for="b9"><input type="radio" name="bunrui" value="コミック" id="b9">コミック</label><br/> <label for="b10"><input type="radio" name="bunrui" value="雑誌" id="b10">雑誌</label><br/> <label for="b11"><input type="radio" name="bunrui" value="その他" id="b11">その他</label><br/><br/> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="fixText"> <h6>販売日:<font color="#ff0000">必須</font></h6> <input type="date" name="hanbai_bi" id="days" value="" class="inputs"><br/> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="fixText"> <h6>価格:<font color="#ff0000">必須</font></h6> <input type="number" name="shohin_kakaku" class="inputs"><br/> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="fixText"> <h6>画像<font color="#ff0000"></font></h6> <input type="file" name="shohin_img[]" class="inputs" id="example" multiple><br/> <!-- 👇ここにプレビュー画像を追加する --> <div id="preview"></div> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="fixText"> <h6>著者:</h6> <input type="text" name="shohin_writer" class="inputs"><br/> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="fixText"> <h6>出版社:</h6> <input type="text" name="shohin_conpany" class="inputs"><br/> <h6><font color="#ff0000">エラーメッセージをここに表示</font></h6> <hr width="80%"><br/> </div> <div class="text-center"> <input type="submit" value="登録" class="btn"> </div> </form> </div> <script> function previewFile(file) { // プレビュー画像を追加する要素 const preview = document.getElementById('preview'); // FileReaderオブジェクトを作成 const reader = new FileReader(); // ファイルが読み込まれたときに実行する reader.onload = function (e) { const imageUrl = e.target.result; // 画像のURLはevent.target.resultで呼び出せる const img = document.createElement("img"); // img要素を作成 img.src = imageUrl; // 画像のURLをimg要素にセット preview.appendChild(img); // #previewの中に追加 } // いざファイルを読み込む reader.readAsDataURL(file); } // <input>でファイルが選択されたときの処理 const fileInput = document.getElementById('example'); const handleFileSelect = () => { const files = fileInput.files; for (let i = 0; i < files.length; i++) { previewFile(files[i]); } } fileInput.addEventListener('change', handleFileSelect); </script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.3/font/bootstrap-icons.css"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> <script src="./script/script.js"></script> <link rel="stylesheet" href="css/style.css?v=2"> </body> </html>

文字数制限にひっかかってしまったので、続きは返信で投稿します。

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

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

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

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

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

7p0e2r1u

2022/11/13 04:48

insertShohinCheck.php(渡された情報をデータベースに登録し、登録できたかを表示して確認するページ) ``` <?php session_start(); require_once "DBManager.php"; $db = new DBManager; try { $id=$db->INSERTShohin($_POST['shohin_mei'],$_POST['bunrui'],$_POST['hanbai_bi'],$_POST['shohin_kakaku'],$_POST['shohin_writer'],$_POST['shohin_conpany'],$_POST['isbn'],$_POST['tosyo']); if(!empty($_FILES['shohin_img'])){ $db->INSERTShohinImg($id,$_FILES['shohin_img']['tmp_name'],$_FILES['shohin_img']['name'],$_FILES['shohin_img']['type'],$_FILES['shohin_img']['size']); } $shohin = $db->getShohin($id); foreach ($shohin as $shohinData) { echo "<p>書籍名:$shohinData[shohin_mei]<br>著者:$shohinData[shohin_writer]<br>出版社:$shohinData[shohin_conpany]<br>価格:$shohinData[shohin_kakaku]<br>ISBNコード:$shohinData[shohin_ISBN]<br>書籍コード:$shohinData[shohin_bookcode]<br>ジャンル:$shohinData[shohin_bunrui]<br>販売日:$shohinData[hanbai_bi]<br></p>"; } $images = $db->getShohinImg($id); } catch (Exception $e) { echo $e.getMessage(); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <title>商品登録の確認</title> </head> <body> <div class="row"> <div class="col-md-8 border-right"> <ul class="list-unstyled"> <?php for($i = 0; $i < count($images); $i++): ?> <li class="media mt-5"> <img src="image.php?id=<?= $id; ?>?detailId=<?=$i;?>" width="100" height="auto" class="mr-3" alt="画像が表示されていません"> </li> <?php endfor; ?> </ul> </div> </div> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> </body> </html> ``` DBManager.php(データベースに関するphp関数を可能な限りまとめたファイル) ``` <?php class DBManager{ private function dbConnect(){ $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'username','password');//都合上別のものに置き換えています。 return $pdo; } function INSERTMember($nickname,$familyname,$firstname,$mail,$pass){ $pdo = $this->dbConnect(); $in = $pdo->prepare("INSERT INTO members(mem_name,mem_familyname,mem_firstname,mem_mail,mem_pass) VALUES(?,?,?,?,?)"); $in->bindValue(1,$nickname,PDO::PARAM_STR); $in->bindValue(2,$familyname,PDO::PARAM_STR); $in->bindValue(3,$firstname,PDO::PARAM_STR); $in->bindValue(4,$mail,PDO::PARAM_STR); $in->bindValue(5,password_hash($pass,PASSWORD_DEFAULT),PDO::PARAM_STR); $in->execute(); } function shohinIdSearch($name,$bunrui,$day,$kakaku){ $pdo = $this->dbConnect(); $search = $pdo->prepare("SELECT shohin_id FROM shohins WHERE shohin_mei=? AND shohin_bunrui=? AND hanbai_bi=? AND shohin_kakaku=?"); $search->bindValue(1,$name,PDO::PARAM_STR); $search->bindValue(2,$bunrui,PDO::PARAM_STR); $search->bindValue(3,$day,PDO::PARAM_STR); $search->bindValue(4,$kakaku,PDO::PARAM_INT); $search->execute(); $id=0; foreach($search as $key){ $id=$key['shohin_id']; } return $id; } function INSERTShohin($name,$bunrui,$day,$kakaku,$writer,$conpany,$isbn,$tosyo){ $pdo = $this->dbConnect(); $inS = $pdo->prepare("INSERT INTO shohins(shohin_mei,shohin_bunrui,hanbai_bi,shohin_kakaku) VALUES(?,?,?,?)"); $inS->bindValue(1,$name,PDO::PARAM_STR); $inS->bindValue(2,$bunrui,PDO::PARAM_STR); $inS->bindValue(3,$day,PDO::PARAM_STR); $inS->bindValue(4,$kakaku,PDO::PARAM_INT); $inS->execute(); $id = $this->shohinIdSearch($name,$bunrui,$day,$kakaku); if(!empty($writer)){ $upwri = $pdo->prepare("UPDATE shohins set shohin_writer = ? WHERE shohin_id = ?"); $upwri ->bindValue(1,$writer,PDO::PARAM_STR); $upwri ->bindValue(2,$id,PDO::PARAM_INT); $upwri ->execute(); } if(!empty($conpany)){ $upcon = $pdo->prepare("UPDATE shohins set shohin_conpany = ? WHERE shohin_id = ?"); $upcon ->bindValue(1,$conpany,PDO::PARAM_STR); $upcon ->bindValue(2,$id,PDO::PARAM_INT); $upcon ->execute(); } if(!empty($isbn)){ $upisb = $pdo->prepare("UPDATE shohins set shohin_ISBN = ? WHERE shohin_id = ?"); $upisb->bindValue(1,$isbn,PDO::PARAM_INT); $upisb ->bindValue(2,$id,PDO::PARAM_INT); $upisb ->execute(); } if(!empty($tosyo)){ $upcod = $pdo->prepare("UPDATE shohins set shohin_bookcode = ? WHERE shohin_id = ?"); $upcod ->bindValue(1,$tosyo,PDO::PARAM_INT); $upcod ->bindValue(2,$id,PDO::PARAM_INT); $upcod ->execute(); } return $id; } function getShohin($id){ $pdo = $this->dbConnect(); $getShohin = $pdo->prepare("SELECT * FROM shohins WHERE shohin_id = ?"); $getShohin->bindValue(1,$id,PDO::PARAM_INT); $getShohin->execute(); return $getShohin->fetchAll(); } function INSERTShohinImg($id,$content,$name,$type,$size){ $pdo = $this->dbConnect(); for ($i=0; $i<count($name); $i++) { $inImg = $pdo->prepare("INSERT INTO shohindetails(shohin_id,shohin_img,image_name,image_type,image_size,created_at) VALUES(?,?,?,?,?,now())"); $inImg ->bindValue(1,$id,PDO::PARAM_INT); $inImg ->bindValue(2,file_get_contents($content[$i]),PDO::PARAM_STR); $inImg ->bindValue(3,$name[$i],PDO::PARAM_STR); $inImg ->bindValue(4,$type[$i],PDO::PARAM_STR); $inImg ->bindValue(5,$size[$i],PDO::PARAM_STR); $inImg ->execute(); } } function getShohinImg($id){ $pdo = $this->dbConnect(); $getSImage = $pdo->prepare("SELECT * FROM shohindetails WHERE shohin_id = ?"); $getSImage ->bindValue(1,$id,PDO::PARAM_STR); $getSImage ->execute(); return $getSImage->fetch(); exit(); } } ?> ``` ------------------------------------------------------------------------------------------------------------------- image.php(外部サイトより引用+改変。shohindetailsに登録されている画像データを取得する) ``` <?php require_once 'functions.php'; $pdo = connectDB(); $sql = 'SELECT * FROM shohindetails WHERE shohin_id = :shohin_id AND shohindetail_id = :shohindetail_id LIMIT 1'; $stmt = $pdo->prepare($sql); $stmt->bindValue(':shohin_id', (int)$_GET['id'], PDO::PARAM_INT); $stmt->bindValue(':shohindetail_id', (int)$_GET['detailId'], PDO::PARAM_INT); $stmt->execute(); $image = $stmt->fetch(); header('Content-type: ' . $image['image_type']); echo $image['shohin_img']; exit(); ?> ``` -------------------------------------------------------------------------------------------------------------------- function.php(外部サイトより引用+改変。image.phpで使用されるページ。データベースへ接続している。) ``` <?php // データベースに接続 function connectDB() { $param = 'mysql:dbname=my_image;host=localhost'; try { $pdo = new PDO($param, 'username', 'password');//都合上別の物に置き換えています。 return $pdo; } catch (PDOException $e) { exit($e->getMessage()); } } ?> ```
m.ts10806

2022/11/13 05:08

コードが長すぎるのであれば、最小構成で再現できるコードに再編するか、GithubなどのサービスにアップロードしてURL提示してください。
guest

回答2

0

ベストアンサー

全部コード読んだわけではないですが、

image.php?id=21?detailId=0

クエリストリングの項目同士をつなぐのは「&」です。
image.php?id=21&detailId=0

現在だとおそらく[id]を参照すると21&detailId=0という情報が取得されているのでは。
なので、データはおそらく取得できていませんが、画像表示はブラウザの仕様次第で、
×がでたり何も出なかったり様々だと思います。
もしかしたらブラウザ開発ツールのコンソールに何か出てるかもしれません。

エラーメッセージが見当たらず

ブラウザから直接image.phpにアクセスして見てはどうでしょう。
HTMLからいきなりアクセスするより、先に確認すべき手順と思います。
画像はファイルですがアクセスの考え方は「URLリクエスト」でその結果画像がレスポンスとして返ってきているので、
URL直アクセスで正しく処理されないリクエスト・レスポンスは、HTMLから呼び出しても当然正しく表示されません。

今回は、エラーハンドリング含めて何か対応した方が良いと思います。

DBから正しくデータ取得できなかった時、
取得は出来たが画像データが正しく表示できないとき
などなどのときにどう対応するか。
よくあるのは「NO IMAGE画像」を出すことですが、
この手のことは「異常系」として対応方針を決めた方が良いですね。

投稿2022/11/13 05:15

編集2022/11/13 05:19
m.ts10806

総合スコア80850

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

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

7p0e2r1u

2022/11/13 05:46

ありがとうございます。ご指導を参考にしてimage.phpに直接データを渡してみた所、Trying to access array offset on value of type boolといったエラーなどが出ましたが、修正していく内に無事画像を表示することが出来ました。 コードも載せておきます。 imageappend.php <form action="image.php" method="post"> <input type="text" name="id"> <input type="text" name="detailId"> <input type="submit" value="送信"> </form> ------------------------------------------------- image.php <?php require_once 'functions.php'; $pdo = connectDB(); $sql = 'SELECT * FROM shohindetails WHERE shohin_id = :shohin_id AND shohindetail_id = :shohindetail_id LIMIT 1'; $stmt = $pdo->prepare($sql); $stmt->bindValue(':shohin_id', $_POST['id'], PDO::PARAM_INT); $stmt->bindValue(':shohindetail_id', (int)$_POST['detailId'], PDO::PARAM_INT); $stmt->execute(); $image = $stmt->fetch(); header('Content-type: ' . $image['image_type']); echo $image['shohin_img']; ?>
m.ts10806

2022/11/13 07:10 編集

>ご指導を参考にしてimage.phpに直接データを渡してみた所 今回はそこまでやる必要ないです。 ブラウザのアドレスバーに http://example.com/image.php? ・・・・ (example.comは自身のホストで) と打ってアクセスするということです。フォームを作ってimage.phpもそれにあった内容に修正する必要はありません。 GETリクエストは、ブラウザでURLを打ってアクセスするときのリクエストメソッドです。 あとGoogleChromeのプラグインで「PostMan」というのがあるので、 例えばWebAPIの動作確認したいときなど有用です。 HTMLでわざわざform作るのはちょっと手間ですしね(練習にはなりますが、効率は悪い)
guest

0

diff

1- <img src="image.php?id=<?= $id; ?>?detailId=<?=$i;?>" width="100" height="auto" class="mr-3"> 2+ <img src="image.php?id=<?= $id; ?>&detailId=<?=$i;?>" width="100" height="auto" class="mr-3">

投稿2022/11/13 05:13

phper.k

総合スコア3923

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

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

7p0e2r1u

2022/11/13 05:24

ありがとうございます、修正させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問