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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

1308閲覧

入力内容をデータベースに登録し、表示したい。

hmdnntr

総合スコア6

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2019/11/27 19:06

編集2019/11/29 18:57

前提・実現したいこと

入力内容をデータベースに登録し、表示したいのですが、うまくいきません。

発生している問題・エラーメッセージ

Notice: Undefined variable: sql in C:\xampp\htdocs\graduate\M_class1.php on line 87 Warning: mysqli_query(): Empty query in C:\xampp\htdocs\graduate\M_class1.php on line 87

該当のソースコード

M_register.php(入力フォーム)

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset="UTF-8"> <title>課題登録</title> </head> <body> <h1>登録する課題を選択してください。</h1> <a href='M_index.php'>戻る</a> <form action="M_class1.php" method="POST"> <table border="1"> <tr> <th width="100" nowrap>年度</th> <th width="100" nowrap>クラス</th> <th width="100" nowrap>回次</th> <th width="100" nowrap>ファイル形式</th> <th width="100" nowrap>課題ジャンル</th> <th width="100" nowrap>難易度</th> </tr> <tr> <th width="100" nowrap> <select name="year"> <option value="">選択してください</option> <option value="2020">2020</option> <option value="2019">2019</option> </select> <th width="100" nowrap> <select name="class"> <option value="">選択してください</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> </select> <th width="100" nowrap> <select name="number"> <option value="">選択してください</option> <option value="第1回">第1回</option> <option value="第2-3回">第2-3回</option> <option value="第4-5回">第4-5回</option> <option value="第6-7回">第6-7回</option> <option value="第8-9回">第8-9回</option> <option value="第10回">第10回</option> <option value="第11-12回">第11-12回</option> <option value="第13-14回">第13-14回</option> <option value="第15回">第15回</option> </select> <th width="100" nowrap> <select name="mso"> <option value="">選択してください</option> <option value="Word">Word</option> <option value="Excel">Excel</option> <option value="PowerPoint">PowerPoint</option> <option value="その他">その他</option> </select> <th width="100" nowrap> <select name="genre"> <option value="">選択してください</option> <option value="出席課題">出席課題</option> <option value="基礎課題">基礎課題</option> <option value="発展課題">発展課題</option> </select> <th width="100" nowrap> <select name="level"> <option value="">選択してください</option> <option value="易しい">易しい</option> <option value="普通">普通</option> <option value="難しい">難しい</option> </select> </tr> </table> <br> <p>課題タイトル<br> <input type="text" name="practice" value="" size="50"> <p>期限<br> <input type="text" name="time" value="" size="50"> <p>含まれる内容(ねらい)<br> <input type="text" name="purpose" value="" size="200"> <p>サンプル・その他留意事項<br> <input type="text" name="other" value="" size="200"> <p>課題ファイル<br> <input type="text" name="file" value="" size="50"> <p><input type="submit" value="課題を登録する"></p> </form> </body> </html>

M_class1.php(表示画面)

<?php //変数初期化 $error = ""; $new_year = ""; $new_class = ""; $new_number = ""; $new_mso = ""; $new_genre = ""; $new_level = ""; $new_practice = ""; $new_time = ""; $new_purpose = ""; $new_other = ""; $new_file = ""; //POSTされたとき if($_SERVER["REQUEST_METHOD"] == "POST"){ $link = mysqli_connect("localhost", "root", "2019minato"); mysqli_query($link, "set names UTF8"); mysqli_select_db($link, "test"); // ■新規追加処理 if(isset($_POST["submit_add"])){ $new_year = htmlspecialchars($_POST["new_year"], ENT_QUOTES, 'UTF-8'); $new_class = htmlspecialchars($_POST["new_class"], ENT_QUOTES, 'UTF-8'); $new_number = htmlspecialchars($_POST["new_number"], ENT_QUOTES, 'UTF-8'); $new_mso = htmlspecialchars($_POST["new_mso"], ENT_QUOTES, 'UTF-8'); $new_genre = htmlspecialchars($_POST["new_genre"], ENT_QUOTES, 'UTF-8'); $new_level = htmlspecialchars($_POST["new_level"], ENT_QUOTES, 'UTF-8'); $new_practice = htmlspecialchars($_POST["new_practice"], ENT_QUOTES, 'UTF-8'); $new_time = htmlspecialchars($_POST["new_time"], ENT_QUOTES, 'UTF-8'); $new_purpose = htmlspecialchars($_POST["new_purpose"], ENT_QUOTES, 'UTF-8'); $new_other = htmlspecialchars($_POST["new_other"], ENT_QUOTES, 'UTF-8'); $new_file = htmlspecialchars($_POST["new_file"], ENT_QUOTES, 'UTF-8'); if($error==""){ $sql = "INSERT INTO class1 VALUES('$new_year','$new_class','$new_number','$new_mso','$new_genre','$new_level','$new_practice','$new_time','$new_purpose','$new_other','$new_file')"; } } // ■sql文処理 if($error==""){ mysqli_query($link, $sql); $new_year = ""; $new_class = ""; $new_number = ""; $new_mso = ""; $new_genre = ""; $new_level = ""; $new_practice = ""; $new_time = ""; $new_purpose = ""; $new_other = ""; $new_file = ""; } } ?> <html> <head> <meta http-equiv="Content-Type" charset="UTF-8"> <title>クラス1</title> </head> <body> <h1>クラス1</h1> <a href='M_index.php'>戻る</a> <h2>第1回講義</h2> <?php $link = mysqli_connect('localhost', 'root', '○○○○'); if (!$link) { die('接続失敗です。'.mysqli_error()); } $db_selected = mysqli_select_db($link,'test'); if (!$db_selected){ die('データベース選択失敗です。'.mysqli_error()); } mysqli_query($link,'SET NAMES utf8'); $result1 = mysqli_query($link,'SELECT id,year,class,number,mso,genre,level,practice,time,purpose,other,file FROM class1 WHERE class="1"'); while ($row = mysqli_fetch_assoc($result1)) { print ('<table border="1">'); print ('<tr>'); print ('<th width="100" nowrap>').('年度').('</th>'); print ('<th width="100" nowrap>').('クラス').('</th>'); print ('<th width="100" nowrap>').('回次').('</th>'); print ('<th width="100" nowrap>').('ファイル形式').('</th>'); print ('<th width="100" nowrap>').('課題ジャンル').('</th>'); print ('<th width="100" nowrap>').('難易度').('</th>'); print ('</tr>'); print ('<tr>'); print ('<td width="100" nowrap>').($row['year']).('</td>'); print ('<td width="100" nowrap>').($row['class']).('</td>'); print ('<td width="100" nowrap>').($row['number']).('</td>'); print ('<td width="100" nowrap>').($row['mso']).('</td>'); print ('<td width="100" nowrap>').($row['genre']).('</td>'); print ('<td width="100" nowrap>').($row['level']).('</td>'); print ('</tr>'); print ('</table>'); print ('<table border="1">'); print ('<tr>'); print ('<th width="100" nowrap>').('課題タイトル').('</th>'); print ('<th width="100" nowrap>').('期限').('</th>'); print ('<th width="250" nowrap>').('含まれる内容').('</th>'); print ('<th width="200" nowrap>').('その他留意事項').('</th>'); print ('<th width="180" nowrap>').('ファイル').('</th>'); print ('</tr>'); print ('<td width="200" nowrap>') .($row['practice']). ('</td>'); print ('<td width="100" nowrap>') .($row['time']). ('</td>'); print ('<td width="250" nowrap>') .($row['purpose']). ('</td>'); print ('<td width="200" nowrap>') .($row['other']). ('</td>'); print ('<td width="180" nowrap>') .($row['file']). ('</td>'); print ('</tr>'); print ('</table>'); print ('<br>'); } $close_flag = mysqli_close($link); ?> <h2>第2-3回講義</h2> <h2>第4-5回講義</h2> <h2>第6-7回講義</h2> <h2>第8-9回講義</h2> <h2>第10回講義</h2> <h2>第11-12回講義</h2> <h2>第13-14回講義</h2> <h2>第15回講義</h2> </body> </html>

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

class1というテーブルがあり、中身は空です。それが原因なのでしょうか

<追記>
具体的にどこをどのようにすればよいかを教えていただきたいです。よろしくお願いいたします。

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

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

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

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

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

takasima20

2019/11/28 00:01

POST で submit_add じゃないときに $sql は設定されないようにみえますが?
guest

回答3

0

ちなみにpostで受け取った値をhtmlspecialcharsしてDBにinsertするのは
一番やってはいけない処理の一つです。
DBには受け取ったデータをなるべくそのままの形で登録してください
(パスワードなどセキュリティ上非可逆に処理したい場合を除く)

そのためにはmysqliを利用する場合もprepareで処理する必要があります

投稿2019/11/28 00:50

yambejp

総合スコア114968

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

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

m.ts10806

2019/11/28 02:59

>postで受け取った値をhtmlspecialcharsしてDBに こういう実装の質問よく見ますね。どこの誰が推奨してるんだろう
okurasuta

2019/11/30 01:57

自分、よくやりますけどなぜダメなのですか?
m.ts10806

2019/11/30 02:09

入力された情報を変更することになるからです。「受け付けて保管するデータ」であれば、変更してはいけません。 画面表示時にXSS対策として行うべきです。 たまにいますよ。 保管時と出力時両方で掛けてしまってちゃんと入力した情報が出力されない人。
okurasuta

2019/11/30 02:13

POST時に変更し表示時にそのまま表示するスクリプトでは、技術的な問題ではなく倫理的問題等があるということですね!わかりました!
m.ts10806

2019/11/30 02:14

倫理的…どうしてそうなる。 セキュリティの話ですよね。
m.ts10806

2019/11/30 02:15

逆に「DB保存時に対応することを推奨している記事」を提示してください。 推奨しない記事しか読んだことないので。探せば幾らでもあるし、理由もたいてい書いてあります。
m.ts10806

2019/11/30 03:55

? どこに「DB保存時にhtmlspecialcharsすることを推奨する」旨がありますか?
guest

0

ベストアンサー

エラーメッセージの通りです。

Notice: Undefined variable: sql

Warning: mysqli_query(): Empty query

エラーメッセージの読み方と対処, 検索や質問の原則

$sqlという変数が定義されるための条件が満たされているか見直してください。

かなり冗長な記述になっている気もします。

class1というテーブルがあり、中身は空です。それが原因なのでしょうか

ちなみにこれは関係ありません。エラーの通り、必須の引数に定義されてない変数を使っているのが原因です。

というか、できればmysqliではなくPDOを利用してください。  

PHPでデータベースに接続するときのまとめ

投稿2019/11/27 21:35

編集2019/11/30 03:06
m.ts10806

総合スコア80854

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

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

hmdnntr

2019/11/29 17:49

どのように書けばエラーがなくなるのか教えていただきたいです。
m.ts10806

2019/11/29 20:02

回答読まれましたかね…
m.ts10806

2019/11/30 03:03

>$sqlという変数が定義されるための条件が満たされているか見直してください。 と書いて >エラーの通り、必須の引数に定義されてない変数を使っているのが原因です。 と書いています。 質問者さんがとれる行動ってそんなに広いですか? このヒントで対応できるようにならないと何一つ身につかないと思います。 ちょっとシンタックスエラーが出ただけで毎回質問するのは正直時間の無駄です。調べたり自分で試した方が早いのです。 >
hmdnntr

2019/12/01 13:49

PDOでやってみたところすんなり解決できました。ありがとうございました。自分で調べて解く力も身に着けます。
m.ts10806

2019/12/01 21:25

起きている問題と解決策が合致しません。 PDOにしたところでロジックに大きく変更があるわけではないので 今回のやり方をする限り同じ現象となるはずです。 解決方法をきちんと具体的にコメントしてください。 https://teratail.com/help/question-tips#questionTips4-2
guest

0

とりあえず、ボタンに submit_add という名前をつけましょう。

投稿2019/11/29 21:47

takasima20

総合スコア7460

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問