• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:WordPressの質問(q10124692)の続)

WordPressの質問: mime_typeと拡張子の関係性について

このQ&Aのポイント
  • $mime_typeから$extを決めて、テンポラリファイルを$dataに読み込むと、PDFと動画にも適応できる。
  • mime_typeを返すために拡張子ではなくバイナリを読み込んでチェックする。
  • 画像形式はpngとjpgのみ。それ以外はエラーとする。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.61

・名前にも字数制限を50文字でメッセージと同じように設けたい場合1つの文にまとめることは可能でしょうか? まとめると言うのは、メッセージと共通の処理にしたいと言うことでしょうか。

php_learn
質問者

お礼

こちらが最新の質問になります。回答の期限が切れてしまったので、下記URLからアドバイスお願い致します。 https://okwave.jp/qa/q10145776.html

php_learn
質問者

補足

回答ありがとうございます、共通の処理にしたいと考えております。 名前は50文字でメッセージは500文字で字数制限を設けたいです。

その他の回答 (60)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.30

・3,single-regist.phpの30行目のfile_put_contents()が確認画面ありの場合に追加されており、その意図が分からないので教えてください。 質問の意味がわかりませんが、アップロードされたファイルを保存しているだけです。 確認画面なしでは別のタイミングで保存しているのかと。

php_learn
質問者

補足

A.回答ありがとうございます。なるほど保存しているのですね、確認画面なしではデータベースに保存するところで記述されておりました。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.29

先ほどの回答は勘違いでした。 ---- //文字列を文字または文字列で分割し、配列にして返す $type = explode('/', $_SESSION['attach']['type'][$i]); ---- 例えば、$_SESSION['attach']['type'][$i]の値が image/jpeg だった場合、スラッシュ'/'で分割した配列はこうなります。 $type[0] image $type[1] jpeg それで [1] を拡張子として使っています。  $ext = $type[1]; typeは他に以下のようなものなので、 image/png video/mp4 application/pdf 今のところ、スラッシュ以降が拡張子として使える、と言うものです。

php_learn
質問者

補足

Q.先ほどの回答は勘違いでした。 ---- //文字列を文字または文字列で分割し、配列にして返す $type = explode('/', $_SESSION['attach']['type'][$i]); ---- 例えば、$_SESSION['attach']['type'][$i]の値が image/jpeg だった場合、スラッシュ'/'で分割した配列はこうなります。 $type[0] image $type[1] jpeg それで [1] を拡張子として使っています。  $ext = $type[1]; A.回答ありがとうございます。画像の拡張子が2つあるので$type[1]の分を追加したという事でしょうか? 少し気になることがあるのですが、pngの画像をアップロードしようとした方がいた場合エラーになるのでしょうか?

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.28

2,single-regist.phpの24行目の配列を2個の要素にした理由は何でしょうか?2次配列という意味ではないと思いますのですが参考サイトを見ても分かりませんでした。 理由は、$_FILESに合わせた、です。 質問者さまのコードでは、contact-confirm.phpで、このように書かれていました。 ---- $_SESSION['attach_data'][$key] = $data; $_SESSION['attach_mime'][$key] = $mime_type; ---- 私のサンプルの同様の部分はこうです。 ---- $_SESSION['attach']['data'][$i] = $data; $_SESSION['attach']['type'][$i] = $_FILES['attach']['type'][$i]; ---- 質問者さまのコードに合わせるとこんな感じになります。 ---- $_SESSION['attach_data'][$i] = $data; $_SESSION['attach_type'][$i] = $_FILES['attach']['type'][$i]; ---- なぜこうしなかったのか。 $_FILESに合わせれば。 ['attach']['type'] をコピーして貼り付ければ入力ミスしない。 元の構成を引き継いだ方が、元がわかりやすく互換性がある。 と言ったところです。 ただ、これだと階層が深くなるので、質問者さまのコードの方がいいような気がします。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.27

・テーブルごとの削除はおすすめ出来ないと教えて頂いたと記憶しているのですが、合ってますでしょうか? なんとなく覚えているのは。 なにか不自然なSQL文をみたような。 削除するのはテーブルやカラムやフィールドではなく、レコードだと説明したような。 https://26gram.com/database-terms こちらの「データベース用語まとめ」の画像から理解していただくようにお願いしたような。 なので、おすすめできないと言うより、そんなことはできない、あるいは、目的が違う、と言うことです。 ・1,データベースの削除部分で TS < %s というコードが出てくるのですが、調べてもよく分かりませんでした。こちらはどのような意味があるのでしょうか? まず TS とはなにか、から。 テーブル定義はこうです。 ---- CREATE TABLE `sortable` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `TS` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP (), `message` VARCHAR (255) NOT NULL, `namae` VARCHAR (255) NOT NULL, `stamp` INT (11) NOT NULL, `select` INT (11) NOT NULL, PRIMARY KEY (`ID`) ) ---- TS はこれです。 `TS` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP (), レコードが追加されるとその時点の日時が自動的に設定されます。 いわゆる、登録日時、です。 削除処理はこうです。 ---- // 削除対象日付 $delete_date = date('Y-m-d H:i:s', strtotime('-6 days')); // 古い雑談掲示板の取得 // データを取得した時点の日付と時刻を記録 < $wpdb を使って SELECT 結果取得 $sql = 'SELECT ID FROM sortable WHERE TS < %s'; $query = $wpdb->prepare($sql, $delete_date); ---- 削除対象日を「6日以前」と決めて「$delete_date」に設定します。 SQL文はこうで、置換される変数は「%s」がひとつです。  $sql = 'SELECT ID FROM sortable WHERE TS < %s'; 実行するクエリの準備はこうです。  $query = $wpdb->prepare($sql, $delete_date); 対象のSQL文は「$sql」で、置換する変数のひとつ目に「$delete_date」の値を設定します。 これを実行すると、 削除対象日付は「2023/05/19 16:38:00」とかになり、 実行するクエリの準備結果は、変数置換されこうなります。  SELECT ID FROM sortable WHERE TS < '2023/05/19 16:38:00' つまり「登録日時が2023/05/19 16:38:00よりも前のレコードのIDを取得する」と言うことになります。

php_learn
質問者

補足

Q.削除するのはテーブルやカラムやフィールドではなく、レコードだと説明したような。 A.回答ありがとうございます。過去の回答を見返してみたところレコードを削除するとフィールドがひとまとで削除できると教えて頂いていたようです。 Q.実行するクエリの準備はこうです。  $query = $wpdb->prepare($sql, $delete_date); 対象のSQL文は「$sql」で、置換する変数のひとつ目に「$delete_date」の値を設定します。 これを実行すると、 削除対象日付は「2023/05/19 16:38:00」とかになり、 実行するクエリの準備結果は、変数置換されこうなります。  SELECT ID FROM sortable WHERE TS < '2023/05/19 16:38:00' つまり「登録日時が2023/05/19 16:38:00よりも前のレコードのIDを取得する」と言うことになります。 A.説明ありがとうございます、$delete_dateの値を設定するということで理解できました。勉強になります。 ※dell_okさんの回答の引用 ・削除対象のIDを取得してというところが気になったのですが、名前・メッセージも同じように削除するのではないのでしょうか? 先日お願いしたデータベース用語のページは見てくださいましたか。https://26gram.com/database-terms 削除するのはレコード単位です。 レコードには複数のフィールドがあります。 フィールドがIDや名前やメッセージです。 レコードを削除するとこれらのフィールドがひとまとで削除されます。 取得するのは削除対象のIDだけで十分です。 これは主キーなので、これを指定して削除すればいいので、名前やメッセージを取得する必要はありません。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.26

・参考サイトの1から今回何故tokenを実装するのか考えてみたのですが、single-input.phpで名前とメッセージをユーザーが送信しようとしたときに、悪意のある攻撃者があらかじめ作成したコードが実行されてしまうという認識で合ってますでしょうか? たぶんそうだと思います。 教えていただいたサイトなどを見ながら勉強したのですが、理解しきれずにいます。 理解はともかく、実装する前と後で不正アクセスのテストをすると、実装後は回避できているようなので、あった方がよさそうです。 質問者さまには不要ですが、私のサンプルにテスト用のトークンなしを残しました。 ・表示画面でも確かめているのは念のためという感じでしょうか? 念のためのような、必須のような感じです。 登録結果画面へは、入力画面や確認画面を経由せず不正アクセスできるので実装しておきました。 不安になったので、確認画面からもトークンを送信するようにしておきました。 実際のところ、入力画面から確認画面へは$_POSTで送信しますが、確認画面から登録結果画面へはデータは送信していませんでした。 確認画面でデータが安全であることが確認された上で$_SESSIONを経由して画面遷移するだけなので、問題ないような気がしていたからです。 トークンを送信するようにしたので、トークンのチェックを追加しました。 ・表示画面(single-regist.php)を表示する前にエラー処理をいれる必要はないでしょうか? エラー処理と言うかcheck()はもともと呼んでいます。 single-index.php ---- switch ($mode) { case 'regist': $namae = $_SESSION['namae']; $message = $_SESSION['message']; $stamp = $_SESSION['stamp']; check(); break; ----

php_learn
質問者

補足

Q.理解はともかく、実装する前と後で不正アクセスのテストをすると、実装後は回避できているようなので、あった方がよさそうです。 A.回答ありがとうございます、実装するという事にしておきます。 Q.登録結果画面へは、入力画面や確認画面を経由せず不正アクセスできるので実装しておきました。 実際のところ、入力画面から確認画面へは$_POSTで送信しますが、確認画面から登録結果画面へはデータは送信していませんでした。 確認画面でデータが安全であることが確認された上で$_SESSIONを経由して画面遷移するだけなので、問題ないような気がしていたからです。 A.回答ありがとうございます。なるほど、登録結果画面へは不正アクセスできるので実装したということなんですね。 確認画面でチェックしているのに登録結果画面でチェックすることに違和感があったのですが、理解することができました。 Q.エラー処理と言うかcheck()はもともと呼んでいます。 single-index.php ---- switch ($mode) { case 'regist': $namae = $_SESSION['namae']; $message = $_SESSION['message']; $stamp = $_SESSION['stamp']; check(); break; ---- A.回答ありがとうございます。申し訳ありません、チェックがされているのを見落としておりました。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.25

・single-input.phpの84行目からのコードはjavaScriptでファイルをバイナリで取得するように書いているんでしょうか? そうです。 もともと質問者さまのコードをもとにしています。 ---- const viewer = document.querySelectorAll('.viewer'); for (let i = 0; i < attach.length; i++) { attach[i].addEventListener('change', () => { if (attach[i].files[0].size > 15 * 1024 * 1024) alert('ファイルサイズが 15MBバイトを超えています'); else { viewer[i].file = attach[i].files[0]; const reader = new FileReader(); reader.onload = (e) => { viewer[i].src = e.target.result; }; reader.readAsDataURL(viewer[i].file); } }); ---- 主に変わったのは、<img>がHTMLで最初から用意されていたのを、子要素として追加するようになっただけです。 動的に要素を追加するため、  const viewer = document.querySelectorAll('.viewer'); の部分が、  child = document.createElement("img"); になった感じです。 ・トークンについて参考にしていたサイトの1つがサービス提供サイトに変わってしまっていたので、その他に参考にしていたサイトを提示致します。 ありがとうございます。 確認してみます。 ・ファイルをアップロードする部分にあらかじめカメラの画像を設置されるように組む方法が分からないのですが、inputを使うか$SESSIONが必要なのでしょうか? inputは使いますが$_SESSIONは使いません。 参考サイトを参考に、そのままではありませんが、サンプルに簡易的にカメラ画像を表示するようにしてみました。 カメラ画像は wp-content\uploads に camera.png で配置する必要があります。 ・ファイルの種類を限定しておくように変更しても問題ないでしょうか? 問題ありません。

php_learn
質問者

お礼

channel-chat.phpは確認画面がない場合のデータベースの削除とアップロードファイルの削除コード single-chat.php1はデータベースの削除部分のみのコード single-chat.php2はアップロードファイルの削除部分のみのコード single-regist.phpは確認画面がある場合のデータベースの登録部分のみのコードです。 ※該当ファイル https://wandbox.org/permlink/i7NWpUMYtKOucUMg ※確認ページがない場合のファイル一覧 https://wandbox.org/permlink/AkJSaWcaG5HCuOi5 データベースの削除とアップロードファイルの削除について考えているのですが、以前dell_okさんに教えて頂いた際はカラムを指定せずともIDですべて削除できるとのことだったと思います。 テーブルごとの削除はおすすめ出来ないと教えて頂いたと記憶しているのですが、合ってますでしょうか? 確認画面がない場合に作成したデータベースとアップロードファイルの削除コードを見直してみて、そのまま代用できるのではないかと考えております。 いくつか疑問点があり、dell_okさんにお聞きしたいです。 ※single-regist.phpのデータ登録部分と確認画面がない場合に作成したデータ登録部分を見比べてみて、コードの意味を理解するためにコメントアウトを入れております。 1,データベースの削除部分で TS < %s というコードが出てくるのですが、調べてもよく分かりませんでした。こちらはどのような意味があるのでしょうか? // データを取得した時点の日付と時刻を記録 < $wpdb を使って SELECT 結果取得 $sql = 'SELECT ID FROM sortable WHERE TS < %s'; 2,single-regist.phpの24行目の配列を2個の要素にした理由は何でしょうか?2次配列という意味ではないと思いますのですが参考サイトを見ても分かりませんでした。 ※参考サイト https://www.cc.kyoto-su.ac.jp/~yamada/programming/array.html //MIME_TYPE = 2個の要素の配列 $ext = $type[1]; 3,single-regist.phpの30行目のfile_put_contents()が確認画面ありの場合に追加されており、その意図が分からないので教えてください。 //文字列をファイルに書き込む file_put_contents($attach_path, $data); 4,single-regist.phpの37行目の7日前のファイルを削除というコードで気になったのですが、ディレクトリに存在するファイルもデータベースで削除するというところに違和感を感じました。これはデータベースにアップロードファイルが登録されているから削除可能という認識で良いのでしょうか? foreach ($delete_items as $delete_item) {// 7日前のファイルを削除 // アップロードファイル一覧取得 glob($dir . '*'); $files = glob($dir.$delete_item->ID.'_*'); // アップロードファイル削除 foreach ($files as $file) { unlink($file); }

php_learn
質問者

補足

Q.主に変わったのは、<img>がHTMLで最初から用意されていたのを、子要素として追加するようになっただけです。 動的に要素を追加するため、  const viewer = document.querySelectorAll('.viewer'); の部分が、  child = document.createElement("img"); になった感じです。 A.解説ありがとうございます、理解することができました。 Q.inputは使いますが$_SESSIONは使いません。 参考サイトを参考に、そのままではありませんが、サンプルに簡易的にカメラ画像を表示するようにしてみました。 カメラ画像は wp-content\uploads に camera.png で配置する必要があります。 A.修正ありがとうございます。参考サイトの1から今回何故tokenを実装するのか考えてみたのですが、single-input.phpで名前とメッセージをユーザーが送信しようとしたときに、悪意のある攻撃者があらかじめ作成したコードが実行されてしまうという認識で合ってますでしょうか? <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>"> single-input.phpの入力フォームでランダムなハッシュ関数を送信してそれをsingle-confirm.php(確認画面)で確かめるまでは理解できたのですが、表示画面でも確かめているのは念のためという感じでしょうか? if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(16)); } ※参考サイト 1,https://magazine.techacademy.jp/magazine/19300 2,https://webukatu.com/wordpress/blog/11993/ 差し支えなければ教えて頂きたいのですが…表示画面(single-regist.php)を表示する前にエラー処理をいれる必要はないでしょうか? 確認画面がないときは要れていたので気になりました。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.24

・参考サイトを見て必要なのではと思ったのですが、そうでもないようですね… 確かに、どちらもWordPressで単一テンプレートのパターンにもかかわらず、$noindexaccessを使っていますね。 その真意がわからないため不正アクセス方法が不明でテストできませんが、同じようにしておきますかね。

php_learn
質問者

補足

回答ありがとうございます、今のところは同じようにしておきます。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.23

・$paramを使わない場合dell_okさんが書いたsingle-index.phpの63行目から変更する必要はない気がするのですが、どうでしょうか? あれからサンプルのコードにいくつか修正したので行数が変わってしまいましたが、新しいサンプルのコードを確認してみてください。 修正点は以下の通りです。 PNG対応 クリックジャッキング対策 ファイルサイズチェック 2重送信防止 ・Q.9,h() 関数の定義名前、メッセージの表示の際に~ ・特殊文字の変換は必要な気がするのですが名前やメッセージの表示に影響はないのでしょうか? それは、  function Chk_StrMode($str) の中で、  $str = htmlspecialchars($str); しているので大丈夫です。 ここを、  $str = h($str); にするのなら必要になってきますが、 ---- function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } ---- クォートを変換しているため、表示するところで、クォートに戻す必要がでてきます。 今のところ、h()は使わなくてよさそうな気がしています。

php_learn
質問者

補足

Q.修正点は以下の通りです。 PNG対応 クリックジャッキング対策 ファイルサイズチェック 2重送信防止 A.修正ありがとうございます。PNG対応で追加されたコード(single-input.php)の$type = $_SESSION['attach']['type'][$i];(single-confirm.php)$type = $_SESSION['attach']['type'][$i];と、(single-input.php)のswitch ($type) {と合わせて変更したんですね。 single-input.phpの84行目からのコードはjavaScriptでファイルをバイナリで取得するように書いているんでしょうか? ※該当コード reader.onload = () => { var child = null; if (reader.result.indexOf("data:image/jpeg;base64,") === 0 || reader.result.indexOf("data:image/png;base64,") === 0) { child = document.createElement("img"); } else if (reader.result.indexOf("data:video/mp4;base64,") === 0) { child = document.createElement("video"); child.setAttribute("controls", null); } else if (reader.result.indexOf("data:application/pdf;base64,") === 0) { child = document.createElement("iframe"); } Q.クォートを変換しているため、表示するところで、クォートに戻す必要がでてきます。 今のところ、h()は使わなくてよさそうな気がしています。 A.アドバイスありがとうございます。確かにfunction Chk_StrMode($str){}で変換しているので問題なさそうです。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.22

・14,トークン生成は入力フォームに必要なので、single-input.phpに書くように考えております。 ・15,トークン確認は名前、メッセージの表示の際に変換が必要なので外部から読み込むように考えています。 いまさらですが、トークンが必要のかどうなのかわからなくなりました。 参考にされたサイトを覚えていたらどこか教えてください。 ・入力フォームの送信ボタンを連打することを防止するコードは必要でしょうか? あってもなくてもいい気がします。 確認画面がなくて登録されてしまうようなものでしたら、重複登録になるのであった方がよさそうです。 確認画面があるので複数回送信されてもあまり問題はないような気がします。 ・トークンを送信するように変更してみたのですが、コードに間違えはないでしょうか? トークンとアップロードファイルは無関係ですので、ひとつあれば十分ですので、添付ファイルとは別のところに設置してください。

php_learn
質問者

補足

Q.いまさらですが、トークンが必要のかどうなのかわからなくなりました。 参考にされたサイトを覚えていたらどこか教えてください。 A.回答ありがとうございます。トークンについて参考にしていたサイトの1つがサービス提供サイトに変わってしまっていたので、その他に参考にしていたサイトを提示致します。 ※参考サイト https://blog.tokumaru.org/2018/11/csrf.html https://teratail.com/questions/92554 ※変わってしまったサイト https://369code.tokyo/304/ ※新たに見つけたサイト https://tech-lab.sios.jp/archives/22952 https://turningp.jp/network_and_security/csrf-laravel Q.入力フォームの送信ボタンを連打することを防止するコードは必要でしょうか? あってもなくてもいい気がします。 確認画面がなくて登録されてしまうようなものでしたら、重複登録になるのであった方がよさそうです。 確認画面があるので複数回送信されてもあまり問題はないような気がします。 A.アドバイスありがとうございます。確かにデータベースに登録することを考えると重複は防げるのでボタンで対策する必要はなさそうですね。 Q.トークンとアップロードファイルは無関係ですので、ひとつあれば十分ですので、添付ファイルとは別のところに設置してください。 A.回答ありがとうございます。確認画面がない場合のコードでファイルアップロードする場所にカメラの画像を設置するようにしていたので、その関係もあり本来のアップロードコード(cssで見えなくする)の上にトークンについて書いていたようです。 ファイルをアップロードする部分にあらかじめカメラの画像を設置されるように組む方法が分からないのですが、inputを使うか$SESSIONが必要なのでしょうか? <div class="viewer"><img src="<?= isset(echo $attach[1]) . echo $attach[1]; : ''?>" </div> ※contact-input.phpの24行目から32行目まで https://wandbox.org/permlink/uo6PxpCBrsDH5JZp ※inputを使う方法 https://www.nishishi.com/css/input-type-file-icon.html ※enter information.phpの84行目から https://wandbox.org/permlink/AkJSaWcaG5HCuOi5 ※ファイルアップロードする場所に設置したいカメラの画像 https://imgur.com/j9SiyRg _____________________________________________ 下記の質問についてアドバイスお願い致します。データベースに格納後、表示の際にエラーメッセージが表示されるようにしておきたいと思ったのですがswitch文で書く場合はどうすれば良いでしょうか?(single-index.phpの52行目について) 1,single-index.phpの42行目で表示の際にエラーが出た場合にメッセージが表示されるように考えてみました。 エラーメッセージと不正アクセスフラグ $error_mes = ''; $noindexaccess = true; switch ($mode) { case NULL: echo '$error_mes'; case 'regist': include 'single-regist.php'; break; case 'confirm': include 'single-confirm.php'; break; default: include 'single-input.php'; break; } 上記と別にもう1点お聞きしておきたいことがあったのですが、ファイルアップロードの際にaccept=".png, .jpg, .jpeg, .pdf, .mp4"を追加してファイルの種類を限定しておくように変更しても問題ないでしょうか?(single-input.phpの45~58行目について) <div> <label>添付ファイル#1</label> <input type="file" class="attach" name="attach[]" accept=".png, .jpg, .jpeg, .pdf, .mp4"> <input type="hidden" class="attachdel" name="attachdel[]"> <button type="button" class="attachclear">clear</button> <div class="viewer"><?php echo $attach[0]; ?></div> </div> <div> <label>添付ファイル#2</label> <input type="file" class="attach" name="attach[]" accept=".png, .jpg, .jpeg, .pdf, .mp4"> <input type="hidden" class="attachdel" name="attachdel[]"> <button type="button" class="attachclear">clear</button> <div class="viewer"><?php echo $attach[1]; ?></div> </div>

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.21

・5,危険文字列置換ファンクションは名前、メッセージの表示の際に変換が必要なので外部から読み込むように考えています。 ・6,未入力チェックファンクションは名前、メッセージの表示の際に変換が必要なので外部から読み込むように考えています。 外部から読み込むと言うのは、functions.phpに入れると言う意味でしょうか。 それならそれがいいです。 理由は、どこでも使うから、と言うのが妥当です。 ・7,データの受け取りと危険文字列置換 ※Chk_StrMode(文字列);についてはどうすれば良いか分からないため これはややこしいのでうまく説明できません。 $paramを使わないでいいような気がします。 サンプルのように直接$namaeと$messageに適用すればいいと思います。 ・8,アップロードファイルが指定されているか,アップロードに成功しているか←こちらはsingle-regist.phpの15~25行目までのコードの中にif (empty($data)で中の値をチェックしているため必要ないのではと考えております。 そうですね。 それでいいと思います。 ・9,h() 関数の定義名前、メッセージの表示の際に変換が必要なので外部から読み込むように考えています。 これは、この掲示板のためには使わないと思うので、いらない気がします。 他の場面で使うようなことがあればあったでいいと思います。 ・10,ファイルサイズの制限でファイルサイズが 15MBで制限していたのですが、こちらのコードは変更しているためどのように代用すべきでしょうか? 同じように組み込んでいいと思います。 >追加行 attach[i].addEventListener('change', () => { > if (attach[i].files[0].size > 15 * 1024 * 1024) { > alert('ファイルサイズが 15MBバイトを超えています'); > return; > } del[i].value = ""; if ($mode === 'back') { // confirm.phpで戻るボタンのJavaScriptが動作しなかったケースを捕捉 header('Location: contact-input.php'); exit; } ・11,12,戻るボタンが動作しなかった場合の補足になるのですが、こちらはJavascriptを使用した際にphpで捕捉するように考えられているものなのですが 私のサンプルでは不要です。 どのような操作をした場合、あるいは、サーバーやクライアントが処理した場合、そうなるのかが想定できないので、今のところ不要です。 もしどのようかにして必要となった場合でも、PHPファイルは指定できないので、以下のような書き方にはなりません。 header('Location: index.php'); header('Location: contact-input.php'); このheader()を使うのがあまりよくないと思って、~index.php自分自身に送信する構成にしました。 なので、入力エラーがあった時と同じで、 $mode = ''; としておいて、 default: include 'single-input.php'; に流れる仕組みになると思います。

php_learn
質問者

補足

Q.外部から読み込むと言うのは、functions.phpに入れると言う意味でしょうか。 それならそれがいいです。 理由は、どこでも使うから、と言うのが妥当です。 A.アドバイスありがとうございます。function.phpを読み込ませるとすでに記述済みの関係のないコードまで読み込まれてしまうので、 single-rerification.phpというファイルを新たに作成してそちらから読み込む予定です。 Q.$paramを使わないでいいような気がします。 サンプルのように直接$namaeと$messageに適用すればいいと思います。 A.回答ありがとうございます。$paramを使わない場合dell_okさんが書いたsingle-index.phpの63行目から変更する必要はない気がするのですが、どうでしょうか? //エラーチェック処理 function check() { global $errors; global $namae; global $message; if (empty($namae)) { $errors[] = '名前エラー'; } if (empty($message)) { $errors[] = 'メッセージエラー'; } Q.9,h() 関数の定義名前、メッセージの表示の際に変換が必要なので外部から読み込むように考えています。 これは、この掲示板のためには使わないと思うので、いらない気がします。 他の場面で使うようなことがあればあったでいいと思います。 A.アドバイスありがとうございます。特殊文字の変換は必要な気がするのですが名前やメッセージの表示に影響はないのでしょうか? Q.10,ファイルサイズの制限でファイルサイズが 15MBで制限していたのですが、こちらのコードは変更しているためどのように代用すべきでしょうか? A.修正いたしました、ありがとうございます。 Q.このheader()を使うのがあまりよくないと思って、~index.php自分自身に送信する構成にしました。 なので、入力エラーがあった時と同じで、 $mode = ''; としておいて、 default: include 'single-input.php'; に流れる仕組みになると思います。 A.説明ありがとうございます、なるほど何故header()を使わなかったのか疑問だったのですが、対応して考えてくださったんですね理解できました。