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

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

詳細はこちら
PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

4回答

3605閲覧

未入力項目があります、と表示されます。どこがおかしいのでしょうか

thetaphi509

総合スコア4

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

2クリップ

投稿2019/12/10 10:16

編集2019/12/10 11:52

データベースへの接続まではうまくいっています。
それ以下のどこがおかしいのかがわかりません。
教えてくださいよろしくお願いいたします。

<!— 部品1:書き込みフォーム —> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>Contact</title> <link href="css/common.css" rel="stylesheet" type="text/css"> <!-- スマートフォン --> <link href="css/smartphone.css" rel="stylesheet" type="text/css" media="only screen and (max-width:480px)"> <!-- タブレット --> <link href="css/tablet.css" rel="stylesheet" type="text/css" media="only screen and (min-width:481px) and (max-width:768px)"> <!-- デスクトップ --> <link href="css/desktop.css" rel="stylesheet" type="text/css" media="only screen and (min-width:769px)"> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <script src="SpryAssets/SpryValidationTextField.js" type="text/javascript"></script> <script src="SpryAssets/SpryValidationTextarea.js" type="text/javascript"></script> <link href="SpryAssets/SpryValidationTextField.css" rel="stylesheet" type="text/css"> <link href="SpryAssets/SpryValidationTextarea.css" rel="stylesheet" type="text/css"> </head> <body> <div id="wrapper"> <header> <h1>hoge</h1> <hgroup> <h2>hoge</h2> <h3>hoge</h3> </hgroup> <nav> <ul> <li><a href="index.html">Home</a></li> <li><a href="hoge.php">Login</a></li> <li><a href="contact.html">Contact</a></li> <li><a href="link.html">Link</a></li> </ul> </nav> </header> <div id="side_menu"> <nav> <h3>Navigation</h3> <ul> <li><a href="test.html">test</a></li> </ul> </nav> <aside> </aside> </div> <div id="contents"> <section> <article> <h2>お問い合わせ</h2> <center> <form action="contact.php" method="post" enctype="text/plain" name="mail" id="mail"> <table class="contact" width="600" border="0"> <tr class="contact gray_back"> <td class="contact">氏名</td> <td class="contact"><input name="yourname" type="text" id="yourname" size="20" maxlength="20"></td> </tr> <tr class="contact"> <td class="contact">ふりがな</td> <td class="contact"><input name="kana" type="text" id="kana" size="20" maxlength="20"></td> </tr> <tr class="contact gray_back"> <td class="contact">電話番号</td> <td class="contact"><input name="tel" type="text" id="tel" size="20" maxlength="20"></td> </tr> <tr class="contact"> <td class="contact">メールアドレス</td> <td class="contact"><span id="sprytextfield1"> <input name="email" type="text" id="email" size="20"> <span class="textfieldRequiredMsg">値を指定する必要があります。</span><span class="textfieldInvalidFormatMsg">無効な形式です。</span></span></td> </tr> <tr class="contact gray_back"> <td class="contact">サイトを知ったきっかけ</td> <td class="contact"> <label> <input type="checkbox" name="chance" value="search" id="chance_0"> 検索サイト</label> <br> <label> <input type="checkbox" name="chance" value="mouth" id="chance_1"> 口コミ</label> <br> <label> <input type="checkbox" name="chance" value="magazine" id="chance_2"> 雑誌</label> <br> <label> <input type="checkbox" name="chance" value="other" id="chance_3"> その他</label> </td> </tr> <tr class="contact"> <td class="contact">性別</td> <td class="contact"> <label> <input type="radio" name="sei" value="man" id="sei_0"> 男</label> <br> <label> <input type="radio" name="sei" value="woman" id="sei_1"> 女</label> </td> </tr> <tr class="contact gray_back"> <td class="contact">用件</td> <td class="contact"><select name="title" id="title"> <option value="web">WEBサイト制作について</option> <option value="manage">WEBマネジメントについて</option> <option value="recruit">採用について</option> <option value="site">このサイトについて</option> <option value="other">その他</option> </select></td> </tr> <tr class="contact"> <td class="contact">質問内容</td> <td class="contact"><span id="sprytextarea1"> <textarea name="content" id="content" cols="20" rows="5"></textarea> <span class="textareaRequiredMsg">値を指定する必要があります。</span></span></td> </tr> <tr class="contact gray_back"> <td colspan="2" class="contact btn"><input type="submit" name="button" id="button" value="送信"> <input type="reset" name="button2" id="button2" value="リセット"></td> </tr> </table> </form> <!-- 部品2から部品4 ここから↓ --> <!-- 部品2:データベースへの接続 --> <?php //接続設定(サーバー/データベース/ユーザー/パスワード) $sv = "localhost"; $dbname = "***"; $user = "***"; $pass = "***"; //データベースに接続する $conn = mysql_connect($sv, $user, $pass) or die("接続エラー"); mysql_select_db($dbname) or die("接続エラー"); ?> <!-- 部品3:メッセージ書き込みスクリプト --> <?php //POSTメソッドで送信された場合は書き込み処理を実行する if ($_SERVER["REQUEST_METHOD"] == "POST"){ //フォームからデータを受け取る $yourname = cnv_dbstr($_POST["yourname"]); $kana = cnv_dbstr($_POST["kana"]); $tel = cnv_dbstr($_POST["tel"]); $email = cnv_dbstr($_POST["email"]); $chance = cnv_dbstr($_POST["chance"]); $sei = cnv_dbstr($_POST["sei"]); $title = cnv_dbstr($_POST["title"]); $content = cnv_dbstr($_POST["content"]); //名前とメッセージが入力されていればデータの追加を実行する if (!empty($yourname) and !empty($kana) and !empty($tel) and !empty($chance) and !empty($sei) and !empty($title) and !empty($content)) { //データを追加する $sql = "INSERT INTO ***(yourname, kana, tel, email, chance, sei, title, content, date) "; $sql .= "VALUES("; $sql .= "'" . $yourname . "',"; $sql .= "'" . $kana . "',"; $sql .= "'" . $tel . "',"; $sql .= "'" . $email . "',"; $sql .= "'" . $chance . "',"; $sql .= "'" . $sei . "',"; $sql .= "'" . $title . "',"; $sql .= "'" . $content . "',"; $sql .= "'" . date("Y/m/d H:i:s") . "'"; $sql .= ")"; $res = mysql_query($sql, $conn) or die("データ追加エラー"); if ($res) { echo "<p>書き込みありがとうございました</p>"; } } //名前やメッセージが空白の場合はエラーメッセージを出力する else { echo "<p><b>未入力項目があります</b></p>"; } } //SQLコマンド用の文字列に変換する関数 function cnv_dbstr($string) { //タグを無効にする $string = htmlspecialchars($string); //magic_quotes_gpcがONの場合はエスケープを解除する if (get_magic_quotes_gpc()) { $string = stripslashes($string); } //SQLコマンド用の文字列にエスケープする $string = mysql_real_escape_string($string); return $string; } ?> <!-- 部品4:メッセージ表示スクリプト --> <?php //SELECTコマンドを実行してデータを取得する $sql = "SELECT * FROM contact_data ORDER BY id DESC"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); //取得したデータを1件ずつ表示する while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<hr>"; if (!is_null($row["email"])) { echo"<a href=\"mailto:" . $row["email"] . "\">" . $row["yourname"] . "</a>"; } else { echo $row["yourname"]; } echo "(" . date("Y/m/d H:i", strtotime($row["date"])) . ")"; echo "<p>" . nl2br($row["content"]) . "</p>"; } ?> <!-- 部品2から部品4 ここまで↑ --> </body> </html>

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

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

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

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

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

y_waiwai

2019/12/10 10:18

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
m.ts10806

2019/12/10 10:25

タイトルは要件を書いてください。 PHPなのはタグでわかりますし、何かがおかしいから質問しているわけですよね。 起きている問題、実現したいこと。 本文もコードだけで丸投げするのではなく、きちんと説明してください。これではデバッグ依頼です。
退会済みユーザー

退会済みユーザー

2019/12/10 10:27

こういう仕様、こういう設計に基づいてコードを書いてみたけど、こういう現象が発生している、っていう情報がないと的確に回答できません。
m.ts10806

2019/12/10 10:43

一通りおかしいので全部見直して って回答でよければしますよ。 全部書くのが面倒なくらい。 あとは自分が何を目指したコードを組んだのか次第です。
退会済みユーザー

退会済みユーザー

2019/12/10 10:57

(えっ、気づいたところ回答しちゃったし
thetaphi509

2019/12/10 11:03

phpのフォームをmariaDBに入力させたいだけなんですが難しいです。 古い書籍を参考にしてあまりわからずにコピペして作ったのですが甘かったです。 もっと勉強します。
退会済みユーザー

退会済みユーザー

2019/12/10 11:05

これから学習するところであれば、PHP7対応の書籍で学習するべきです。 過去の書籍で説明されている事柄がPHP言語の仕様変更によって多数変更されて改善されています。
thetaphi509

2019/12/10 11:07

ありがとうございます。 ご指摘の通りです。 最新の書籍で勉強します。
thetaphi509

2019/12/10 11:19

書籍の通りにコピペすれば正常に動作したので、自分流にアレンジしてみたらダメでした。 ひとまずお手上げです。
退会済みユーザー

退会済みユーザー

2019/12/10 11:37 編集

これはひどい。回答に費やした時間を返してくれ
m.ts10806

2019/12/10 12:15

>自分流にアレンジしてみたら そらそうだ。文法も何も基本的なところを理解せずに適当に書くから。 プログラムは書いた通りにしか動かない。「通り」は「プログラムの仕様通り」。思った通りに動かそうと思ったら仕様を理解する必要があるわけで。 その前に整理すべきことは幾らでもあるでしょう。 「要件」です。「何を目的としたプログラムなのか」「何を実現したいプログラムなのか」を「具体的に」まとめる作業が先です。 質問するのであればその「要件」をきちんと説明する必要があります。 書籍とか関係ありません。問題が起きているのはあなたが書いたコード。書籍をそのままうつしたものであっても、ネットで見つけたコードをコピペしただけであっても、責任は自分自身にしかないわけです。 「質問するな」というわけではありません。質問するということは解決するための責任が発生しますが、その責任は質問者にしかありません。 回答者は気まぐれで見て、回答できそうな内容なら回答し、できなさそうならスルーするか・ここに書かれているように質問への追記修正依頼をするだけです。 質問を見る人は全てが赤の他人です。でしたら、自分が持っている情報や想いはきちんと書かなければ伝わらないのは当然です。 どんな熟練の技術者であっても赤の他人の要件をくみ取るとか無理ですよ。 そういった齟齬やすれ違いをなるべくなくすための「質問するときのヒント https://teratail.com/help/question-tips 」であったり質問テンプレートがあるわけです。 https://teratail.com/help/question-tips#questionTips3-8 質問に追記修正依頼なり何かしらのコメントがあるということは質問や問題に関心が寄せられているということです。 つまり、アドバイスをもらえるチャンスであるわけです。 そのチャンスを拾えるかどうかは質問者次第です。 teratailのPHPを見たときに回答率は高い方です。 https://teratail.com/tags/PHP 質問数も多く、登録しているユーザーも多いです。 それだけ目につきやすく、解決しやすいとも言えますが、それも質問内容次第です。せっかく質問したのでしたらきちんと解決するまで対応しましょう。 それが「お手上げ状態」から脱するための唯一の前向きな手段です。
guest

回答4

0

仕様や構造設計について言及がない質問は
本来スルーされて然るべきですが、
あまりに拙いため、
気づいたところをザクザクと指摘するにとどめます。


function cnv_dbstr()にて文字列加工をしていますが、
データベースに格納する文字列に対してhtmlspecialchars()をかけるのは愚かです。
html上に文字化けなど起こさず出力するための関数なので、
例えばファイルに書き出すとかデータベースに格納するときは元の文字列で扱い、
html表示直前にhtmlspecialchars()で加工するものです。

ありがちな書き方として、こういう関数を定義して、
表示直前に使うものです:

php

1function h($s) { 2 return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); 3}

詳しくは:htmlspecialchars

ところで、telとかemailって許容できる書き方ってものがあるはずですが、
いい加減な記号が含まれていても何の検証もせずDBに書き込もうとするのは大変危険です。
いわゆるバリデーションに関する知識や情報を集めて考え直してください。


mysql_*系関数はPHP7時代には削除されているため、
mysqli_*系関数にて書き換えるのが常識です。
(できれば、PDO経由で使うともっと良い。)

また、mysql_real_escape_string()にて文字列のエスケープ処理を期待しているようですが、
SQL文の実行をプリペアとバインドの仕組みを使えば
自前でエスケープする処理は不要となり脆弱性を招く心配が一つ減ります。

詳しくは:mysqli_stmt_bind_paramのコード例を参考にしてください。

テストしていないけど、こういう書き方:

php

1$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world'); 2 3/* 接続状況をチェックします */ 4if (!$link) { 5 printf("Connect failed: %s\n", mysqli_connect_error()); 6 exit(); 7} 8 9$sql = <<<EOT 10INSERT INTO contact_data(yourname, kana, tel, email, chance, sei, title, content, date) 11VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?); 12EOT; 13 14$stmt = mysqli_prepare($link, $sql); 15mysqli_stmt_bind_param($stmt, 'ssssssssss', $yourname, $kana, $tel, $email, $chance, $sei, $title, $content, date("Y/m/d H:i:s")); 16mysqli_stmt_execute($stmt);

投稿2019/12/10 10:51

編集2019/12/10 10:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

thetaphi509

2019/12/10 10:56

ありがとうございます。 大変勉強になりました。
退会済みユーザー

退会済みユーザー

2019/12/10 11:02

アルゴリズム的なところは仕様や設計を示されないと第三者にはわからないので、 指摘どおり書き換えたとしても期待する動作になる保証はありません。 あしからず。
thetaphi509

2019/12/10 11:10

説明不足でした。 指摘どおりに書き換えないで、根本的に理解するところから始めます。
guest

0

PHPです。どこがおかしいのでしょうか?

PHPさん、初めまして。質問の仕方がおかしいので、Tipsをご確認ください。


そもそもmysql MySQL関数 (mysql_で始まるやつ) を使うのはやめましょう。やめましょうっていうかPHP7.0で削除されたので、環境次第では動きません。
せめてmysqli、できればPDOのほうが結果的に楽ができると思います。

if (!empty($yourname) and !empty($kana) and !empty($tel) and !empty($chance) and !empty($sei) and !empty($title) and !empty($content))
emptyは空文字、ゼロ、ゼロが入った文字列 ('', 0, '0') も空と判定するので、テスト用に適当な値で送信するとひっかかる可能性がありますね

!is_null($row["email"])
SQL側でどうなっているかわかりませんが、こちらはnullじゃなくて空文字だったときには通らないので要件を確認したほうがいいかもしれません

date("Y/m/d H:i", strtotime($row["date"]))
~~閉じかっこが多くないですか?~~→多くないですね、失礼しました


乗りかかった船 (思ってた数倍、大船でしたが) なので、回答しますが、、、
回答が付いた後に質問文のコードを「書き換える」のはお控えください。質問→指摘→質問修正の流れだと、あとから見た人からすると、「(修正されて) 問題ないコードに対する指摘」になって整合性がつかなくなります。
修正 (上書き) ではなく、追記してください。。

ご提示の、 2019/12/10 20:52編集時点のコードに対して、指摘します。

  • インデントをスペース2つで取るのか4つで取るのか統一してください。たぶん4でやりたいのだと思いますが、かなり右に長いコードになっているので後述の改善案では2つにしています。

html

1 <td class="contact">電話番号</td> 2 <td class="contact"><input name="tel" type="text" id="tel" size="20" maxlength="20"></td>

html

1 <td class="contact">メールアドレス</td> 2 <td class="contact"><span id="sprytextfield1"> 3 <input name="email" type="text" id="email" size="20"> 4 <span class="textfieldRequiredMsg">値を指定する必要があります。</span><span class="textfieldInvalidFormatMsg">無効な形式です。</span></span></td> 5 </tr>
  • <input type="email"><input type="tel"> を活用しましょう。バリデーションが楽になるだけではなく、スマートフォンで入力するときに (スマホのブラウザによりますが) 自動でテンキーモードになったり英数キーボード (+アットマーク) になったりしてユーザーフレンドリーです

html

1 <div id="contents"> 2 <section> 3 <article> 4 <h2>お問い合わせ</h2> 5 <center>
  • <div id="contents"><section><article> も閉じられてないです。必要なら末尾の </body> の直前に </article></section></div> を入れてください。不要ならこの2行は消してください。

<center> も閉じられていないですが、そんなタグはHTML5には存在しないので消してください。センタリングが必要なら別途CSSで制御してください。

  • <tr class="contact gray_back"> のあと、すべての <tr><td> にcontactクラスが付いていますが、親の <table> にクラス (例えば、contact_table) を付けて、css側では .contact_table tr { ... } で制御したほうが楽 (変更に強い) です

  • $sql = "INSERT INTO ***(yourname, kana, tel, email, chance, sei, title, content, date) ";

カラム名に指定されているdateは環境によっては予約語だった気がしますので、特別な配慮が必要なケースがあります。
INSERTしたときの日時を取りたいのであればSQL側で入れさせても良い気がします。

php

1 $sql .= "VALUES("; 2 $sql .= "'" . $yourname . "',"; 3 $sql .= "'" . $kana . "',"; 4 $sql .= "'" . $tel . "',"; 5 $sql .= "'" . $email . "',"; 6 $sql .= "'" . $chance . "',"; 7 $sql .= "'" . $sei . "',"; 8 $sql .= "'" . $title . "',"; 9 $sql .= "'" . $content . "',"; 10 $sql .= "'" . date("Y/m/d H:i:s") . "'"; 11 $sql .= ")";
  • これはめちゃんこ危険なのでやめましょう。プリペアドステートメントでググってください。

動くかどうかまで検証してませんが、指摘した箇所を直したコードがこちらです。

php

1<body> 2<div id="wrapper"> 3 <header> 4 <h1>hoge</h1> 5 <hgroup> 6 <h2>hoge</h2> 7 <h3>hoge</h3> 8 </hgroup> 9 <nav> 10 <ul> 11 <li><a href="index.html">Home</a></li> 12 <li><a href="hoge.php">Login</a></li> 13 <li><a href="contact.html">Contact</a></li> 14 <li><a href="link.html">Link</a></li> 15 </ul> 16 </nav> 17 </header> 18 19 <div id="side_menu"> 20 <nav> 21 <h3>Navigation</h3> 22 <ul> 23 <li><a href="test.html">test</a></li> 24 </ul> 25 </nav> 26 <aside> 27 28 </aside> 29</div> 30 31<div id="contents"> 32 <section> 33 <article> 34 <h2>お問い合わせ</h2> 35 <form action="contact.php" method="post" enctype="text/plain" name="mail" id="mail"> 36 <table class="contact" width="600" border="0"> 37 <tr class="contact gray_back"> 38 <td class="contact">氏名</td> 39 <td class="contact"><input name="yourname" type="text" id="yourname" size="20" maxlength="20"></td> 40 </tr> 41 <tr class="contact"> 42 <td class="contact">ふりがな</td> 43 <td class="contact"><input name="kana" type="text" id="kana" size="20" maxlength="20"></td> 44 </tr> 45 <tr class="contact gray_back"> 46 <td class="contact">電話番号</td> 47 <td class="contact"><input name="tel" type="text" id="tel" size="20" maxlength="20"></td> 48 </tr> 49 <tr class="contact"> 50 <td class="contact">メールアドレス</td> 51 <td class="contact"><span id="sprytextfield1"> 52 <input name="email" type="text" id="email" size="20"> 53 <span class="textfieldRequiredMsg">値を指定する必要があります。</span><span class="textfieldInvalidFormatMsg">無効な形式です。</span> 54 </span></td> 55 </tr> 56 <tr class="contact gray_back"> 57 <td class="contact">サイトを知ったきっかけ</td> 58 <td class="contact"> 59 <label> 60 <input type="checkbox" name="chance" value="search" id="chance_0"> 61 検索サイト 62 </label> 63 <br> 64 <label> 65 <input type="checkbox" name="chance" value="mouth" id="chance_1"> 66 口コミ 67 </label> 68 <br> 69 <label> 70 <input type="checkbox" name="chance" value="magazine" id="chance_2"> 71 雑誌 72 </label> 73 <br> 74 <label> 75 <input type="checkbox" name="chance" value="other" id="chance_3"> 76 その他 77 </label> 78 </td> 79 </tr> 80 <tr class="contact"> 81 <td class="contact">性別</td> 82 <td class="contact"> 83 <label> 84 <input type="radio" name="sei" value="man" id="sei_0"> 8586 </label> 87 <br> 88 <label> 89 <input type="radio" name="sei" value="woman" id="sei_1"> 9091 </label> 92 </td> 93 </tr> 94 <tr class="contact gray_back"> 95 <td class="contact">用件</td> 96 <td class="contact"><select name="title" id="title"> 97 <option value="web">WEBサイト制作について</option> 98 <option value="manage">WEBマネジメントについて</option> 99 <option value="recruit">採用について</option> 100 <option value="site">このサイトについて</option> 101 <option value="other">その他</option> 102 </select></td> 103 </tr> 104 <tr class="contact"> 105 <td class="contact">質問内容</td> 106 <td class="contact"><span id="sprytextarea1"> 107 <textarea name="content" id="content" cols="20" rows="5"></textarea> 108 <span class="textareaRequiredMsg">値を指定する必要があります。</span> 109 </span></td> 110 </tr> 111 <tr class="contact gray_back"> 112 <td colspan="2" class="contact btn"><input type="submit" name="button" id="button" value="送信"> 113 <input type="reset" name="button2" id="button2" value="リセット"></td> 114 </tr> 115 </table> 116 </form> 117<!-- 部品2から部品4 ここから↓ --> 118<!-- 部品2:データベースへの接続 --> 119 120<?php 121//接続設定(サーバー/データベース/ユーザー/パスワード) 122$sql_hostname = "localhost"; 123$sql_username = "***"; 124$sql_userpass = "***"; 125$dbname = "***"; 126$tablename = "contact_data"; 127 128//データベースに接続する 129$conn = mysqli_connect($sql_hostname, $sql_username, $sql_userpass, $dbname) or die("接続エラー"); 130?> 131<!-- 部品3:メッセージ書き込みスクリプト --> 132<?php 133 134/** 135 * SQLコマンド用の文字列に変換する関数 136 * @param string $post_key POSTで渡されたデータ中に期待されるキー 137 * @param mysqli $link mysqli_connect で生成した mysqliオブジェクト 138 * @return string $_POST[$key] でアクセスした string の値。変な値が来ていたときは空文字を返す 139 */ 140function cnv_dbstr($post_key, $link) { 141 return mysqli_real_escape_string( 142 filter_input(INPUT_POST, $post_key), 143 $link 144 ); 145} 146 147//POSTメソッドで送信された場合は書き込み処理を実行する 148if ($_SERVER["REQUEST_METHOD"] == "POST"){ 149 //フォームからデータを受け取る 150 $yourname = cnv_dbstr("yourname"); 151 $kana = cnv_dbstr("kana"); 152 $tel = cnv_dbstr("tel"); 153 $email = cnv_dbstr("email"); 154 $chance = cnv_dbstr("chance"); 155 $sei = cnv_dbstr("sei"); 156 $title = cnv_dbstr("title"); 157 $content = cnv_dbstr("content"); 158 159 if(in_array('', [ 160 $yourname, $kana, $tel, $chance, $sei, $title, $content 161 ], true)) { 162 //名前やメッセージが空白の場合はエラーメッセージを出力する 163 echo "<p><b>未入力項目があります</b></p>"; 164 } else { 165 //データを追加する 166 $query = "INSERT INTO {$tablename} (yourname, kana, tel, email, chance, sei, title, content, date) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; 167 $stmt = mysqli_prepare($conn, $query); 168 169 mysqli_stmt_bind_param( 170 $stmt, 171 $yourname, 172 $kana, 173 $tel, 174 $email, 175 $chance, 176 $sei, 177 $title, 178 $content, 179 date("Y/m/d H:i:s") 180 ); 181 182 mysqli_stmt_execute($stmt); 183 mysqli_stmt_close($stmt); 184 } 185} 186 187?> 188 189<!-- 部品4:メッセージ表示スクリプト --> 190<?php 191//SELECTコマンドを実行してデータを取得する 192$query = "SELECT * FROM {$tablename} ORDER BY id DESC"; 193$result = mysqli_query($conn, $sql) or die("データ抽出エラー"); 194 195//取得したデータを1件ずつ表示する 196while ($row = mysqli_fetch_assoc($result)) { 197 echo "<hr>"; 198 if (!empty($row["email"])) { 199 echo "<a href=\"mailto:{$row["email"]}\">{$row["yourname"]}</a>"; 200 } 201 else { 202 echo $row["yourname"]; 203 } 204 echo "(" . date("Y/m/d H:i", strtotime($row["date"])) . ")"; 205 echo "<p>" . nl2br(htmlspecialchars($row["content"])) . "</p>"; 206} 207mysqli_free_result($result); 208mysqli_close($conn); 209?> 210<!-- 部品2から部品4 ここまで↑ --> 211 </article> 212 </section> 213</div> 214</body>

投稿2019/12/10 10:20

編集2019/12/10 13:47
thyda.eiqau

総合スコア2982

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

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

m.ts10806

2019/12/10 10:26

さすがにこれは追記修正依頼に書くべきでは。
thyda.eiqau

2019/12/10 10:36

ごもっともですね。追記しようと思って並行してコードを読んでいましたが、乗り換え駅に着いてしまって端末を閉じてしまったので、追記する前にどなたかが回答して頂けそうな気がしますね、、
m.ts10806

2019/12/10 10:39

どういう想定しているか書かれてないので答えようがないのが現状ですね。 それにそれなりの量なのにマークダウンされてないコードはちょっと。
thetaphi509

2019/12/10 10:48

気軽に初めて質問してみました。 Tipsも読まずに申し訳ないです。
kyoya0819

2019/12/10 11:53 編集

to m.ts10806さん 時と場合によってはいいのでは? ここがその「時」と「場合」に当てはまるのかは微妙ですが
kyoya0819

2019/12/10 11:57

to thyda.eiqauさん 「mysql」と書くと変な誤解を招く可能性があるので関数と書いた方がよろしいとは思います。 (質問者さんの技量を鑑みて)
thyda.eiqau

2019/12/10 12:21

asuchi0819さん、すばらしい着眼点ですね、私にはまったくその発想が欠けていました。恐れ入ります
m.ts10806

2019/12/10 12:27

asuchi0819さん 難しいところですね。ただ本日入会初質問という質問者の状態だと 来た回答が「質問の仕方がおかしい」だとどうかなと思いました。 ※何度も同じようなやり方繰り返してたら良いツッコミなんですけど thyda.eiqauさん 的確なアドバイスも回答に追記されましたので低評価→高評価に切り替えました。 細かい指摘失礼しました。
thyda.eiqau

2019/12/10 13:48

文字数制限で怒られた (初めての経験、、、) ので<body>の中だけですがコードの指摘をいれています。ちゃんと動くかどうかの検証はしていないので、これが正解かどうかはわかりませんし、正解だったとしてもこれを見て移すのではなくちゃんと身につけてほしいですが、参考になれば幸いです
guest

0

おかしいところがあるからおかしいのです。

投稿2019/12/10 10:19

semagya

総合スコア38

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

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

thetaphi509

2019/12/10 10:48

それはわかってます。
thetaphi509

2019/12/10 10:50

勉強不足でした。すいません。
guest

0

全部おかしいです。
適当に羅列します。

・バリデーションが無い
・使用している関数(mysql_query 系)が古い
・エスケープ箇所がおかしい
・SQL の組み立て方が連結
等々

PDO のテンプレートを貼っておきます。
PHP で MySQL 接続時に必要な知識(最小限版)

投稿2019/12/10 10:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

thetaphi509

2019/12/10 10:52

くわしくご指摘していただきましてありがとうございます。 気軽に質問してしまい申し訳無いです。 こんなに反響があるとは思いませんでした。 気をつけます。
退会済みユーザー

退会済みユーザー

2019/12/10 10:56 編集

気軽に質問してイイと思うけど、フォーマット無視すると回答しにくいです。 POST/GET、DB 接続/操作、出力は php の基本なのでちゃんと体系的に学んだほうが良いです。多分、教本が古すぎます。
thetaphi509

2019/12/10 11:05

ありがとうございます。 教本はおっしゃる通り古いです。 もっと勉強します。
退会済みユーザー

退会済みユーザー

2019/12/10 11:14

今の質問は編集可能なので、編集しておいてください。 教本は php7 系に対応したものに変えたほうが良いです。 教本が終わったら https://qiita.com/mpyw/items/b2a2b0e8e60ed4680f06 で、POST/GET、DB 接続/操作、出力に対しての理解を深めると良いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問