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

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

詳細はこちら
PHP

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

Q&A

解決済

2回答

691閲覧

formの回答をtxtファイルとして出したい。

takotyan

総合スコア2

PHP

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

0グッド

0クリップ

投稿2021/03/04 11:09

前提・実現したいこと

phpを作っているときに、formの結果を出したいのですが、1時間近く調べてもわかりません。
何が違っているのか教えてくれませんか?
今書いているファイルは index.phpです。

該当のソースコード

php

1<?php 2session_start(); 3$error_message = ""; 4 5if (isset($_POST["booking"])) 6{ 7 $booking_success_url = "ok.html"; 8 header("Location: {$booking_success_url}"); 9 exit; 10$error_message = "エラーが発生しました。"; 11} 12?> 13<?php 14if (((isset($_POST["name"])) && ($_POST["name"] != "")) or ((isset($_POST["denwa"])) && ($_POST["denwa"] != ""))) { // 名前かEmailがPOSTされたときに、以下を実行する 15 16 if (isset($_POST["name"])) { //もしPOSTに [name] があれば 17 $name = $_POST["name"]; //POSTのデータを変数$nameに格納 18 if( get_magic_quotes_gpc() ) { $name = stripslashes("$name"); } //クォートをエスケープする 19 $name = htmlspecialchars ($name); //HTMLタグを禁止する 20 $name = mb_substr ($name, 0, 30, 'UTF-8'); //長いデータを30文字でカット 21 } 22 if (isset($_POST["name2"])) { 23 $denwa = $_POST["name2"]; //POSTのデータを変数$nameに格納 24 if( get_magic_quotes_gpc() ) { $name2 = stripslashes("$name2"); } //クォートをエスケープする 25 $denwa = htmlspecialchars ($name2); //HTMLタグ禁止 26 $name2 = mb_substr ($name2, 0, 30, 'UTF-8'); //長いデータを30文字でカット 27 } 28 if (isset($_POST["denwa"])) { 29 $denwa = $_POST["denwa"]; //POSTのデータを変数$nameに格納 30 if( get_magic_quotes_gpc() ) { $denwa = stripslashes("$denwa"); } //クォートをエスケープする 31 $denwa = htmlspecialchars ($denwa); //HTMLタグ禁止 32 $denwa = mb_substr ($denwa, 0, 30, 'UTF-8'); //長いデータを30文字でカット 33 } 34 if (isset($_POST["bu"])) { 35 $bu = $_POST["bu"]; //POSTのデータを変数$nameに格納 36 if( get_magic_quotes_gpc() ) { $bu = stripslashes("$bu"); } //クォートをエスケープする 37 $bu = htmlspecialchars ($bu); //HTMLタグ禁止 38 $bu = mb_substr ($bu, 0, 30, 'UTF-8'); //長いデータを30文字でカット 39 } 40 $time = date("Y/n/j G:i"); //日時の取得 41 $write = $time . ", ". $name . ", " . $email. ",". $yourID . "/"; //新しく書き込むデータを <> で区切って整形 42 $log = fopen ("log.txt","a"); //書き込み用モードでデータを開く 43 flock ($log, LOCK_EX); //ファイルロック開始 44 fputs ($log,$write); //書き込み処理 45 flock ($log, LOCK_UN); //ファイルロック解除 46 fclose ($log); //ファイルを閉じる 47} 48?> 49 50 51<p class="lead-form">ご予約はこちらから!</p> 52 53<head> 54 55<meta name="viewport" 56 content="width=320, 57 height=480, 58 initial-scale=1.0, 59 minimum-scale=1.0, 60 maximum-scale=2.0, 61 user-scalable=yes" /> 62 63</head> 64 65<form action="index.php" method="POST" class="booking_area" enctype="multipart/form-data"> 66 67 <div class="item"> 68 <label class="label">お名前</label><br> 69 70 <input class="inputs" type="text" name="name"><br> 71 72 <label class="label">2人目がいる場合は記入</label><br> 73 <input class="inputs" type="text" name="name2"> 74 </div> 75 76 <div class="item"> 77 <label class="label">電話番号</label><br> 78 <input class="inputs" type="denwa" name="denwa"> 79 </div> 80 81 <div class="item"> 82 <p class="bu"">ご希望の部をお選びください</p> 83 <select name="select-bu"> 84 85 <option value="1bu">第1部 1時30分~3時05分</option> 86 <option value="2bu">第2部 3時15分~4時45分</option> 87 </select> 88 </div> 89 90 91 92 <div class="btn-area"> 93 <input type="submit" value="予約する" name="booking"> 94 95 <input type="reset" value="リセット"> 96 </div> 97 98</form> 99</body> 100 101 102

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

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

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

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

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

m.ts10806

2021/03/04 11:13

何を参考に書いたのでしょう。 インデントめちゃくちゃ HTMLめちゃくちゃ コードで何が起きているのか不明(「できません」はあなたの主観。実行して何が起きているのか、問題点を書くべき) https://teratail.com/help/question-tips#questionTips3-4
m.ts10806

2021/03/04 11:33

>1時間近く調べてもわかりません。 時間だけ書かれても人によって違いますし、何も伝わりません。 「ふーん、で何をどう調べたの?」という逆質問を引き出すだけです。 具体的に記載してください。
guest

回答2

0

ベストアンサー

直接の回答

ボタン押したら絶対にリダイレクトされます。

php

1 2if (isset($_POST["booking"])) 3

ボタンがbookingなので、押したらおしまいです。ok.htmlとやらに遷移しておしまい。
exit()もしてますし、そこで終了。
その後のPOST受け取ってうにゃうにゃ、全部通りません。

$error_message = "エラーが発生しました。";

直前にexitがあるので意味がない定義です。


ひとまず処理ロジックがおかしいので「登録成功したら画面遷移」としたいのでしたら、fclose()の結果を以てにしましょう。

もちろん、そこを調整したからと、想定通り動くかは分かりません。
せめて、自分が書いたコードなので、自分で説明できるくらいにはなりましょう。
「なぜこう書いたか」意図を。

「なんでこうなってるか分からん」が多ければ多いほど、アプリケーションとして成り立ちません。

以下、長い蛇足

コードフォーマットしてください。
Eclipseの機能使った結果。

php

1<?php 2session_start(); 3$error_message = ""; 4 5if (isset($_POST["booking"])) { 6 $booking_success_url = "ok.html"; 7 header("Location: {$booking_success_url}"); 8 exit(); 9 $error_message = "エラーが発生しました。"; 10} 11?> 12<?php 13if (((isset($_POST["name"])) && ($_POST["name"] != "")) or ((isset($_POST["denwa"])) && ($_POST["denwa"] != ""))) { // 名前かEmailがPOSTされたときに、以下を実行する 14 15 if (isset($_POST["name"])) { // もしPOSTに [name] があれば 16 $name = $_POST["name"]; // POSTのデータを変数$nameに格納 17 if (get_magic_quotes_gpc()) { 18 $name = stripslashes("$name"); 19 } // クォートをエスケープする 20 $name = htmlspecialchars($name); // HTMLタグを禁止する 21 $name = mb_substr($name, 0, 30, 'UTF-8'); // 長いデータを30文字でカット 22 } 23 if (isset($_POST["name2"])) { 24 $denwa = $_POST["name2"]; // POSTのデータを変数$nameに格納 25 if (get_magic_quotes_gpc()) { 26 $name2 = stripslashes("$name2"); 27 } // クォートをエスケープする 28 $denwa = htmlspecialchars($name2); // HTMLタグ禁止 29 $name2 = mb_substr($name2, 0, 30, 'UTF-8'); // 長いデータを30文字でカット 30 } 31 if (isset($_POST["denwa"])) { 32 $denwa = $_POST["denwa"]; // POSTのデータを変数$nameに格納 33 if (get_magic_quotes_gpc()) { 34 $denwa = stripslashes("$denwa"); 35 } // クォートをエスケープする 36 $denwa = htmlspecialchars($denwa); // HTMLタグ禁止 37 $denwa = mb_substr($denwa, 0, 30, 'UTF-8'); // 長いデータを30文字でカット 38 } 39 if (isset($_POST["bu"])) { 40 $bu = $_POST["bu"]; // POSTのデータを変数$nameに格納 41 if (get_magic_quotes_gpc()) { 42 $bu = stripslashes("$bu"); 43 } // クォートをエスケープする 44 $bu = htmlspecialchars($bu); // HTMLタグ禁止 45 $bu = mb_substr($bu, 0, 30, 'UTF-8'); // 長いデータを30文字でカット 46 } 47 $time = date("Y/n/j G:i"); // 日時の取得 48 $write = $time . ", " . $name . ", " . $email . "," . $yourID . "/"; // 新しく書き込むデータを <> で区切って整形 49 $log = fopen("log.txt", "a"); // 書き込み用モードでデータを開く 50 flock($log, LOCK_EX); // ファイルロック開始 51 fputs($log, $write); // 書き込み処理 52 flock($log, LOCK_UN); // ファイルロック解除 53 fclose($log); // ファイルを閉じる 54} 55?> 56 57 58<p class="lead-form">ご予約はこちらから!</p> 59 60<head> 61 62<meta name="viewport" 63 content="width=320, 64 height=480, 65 initial-scale=1.0, 66 minimum-scale=1.0, 67 maximum-scale=2.0, 68 user-scalable=yes" /> 69 70</head> 71 72<form action="index.php" method="POST" class="booking_area" 73  enctype="multipart/form-data"> 74 75 <div class="item"> 76 <label class="label">お名前</label><br> <input class="inputs" type="text" 77 name="name"><br> <label class="label">2人目がいる場合は記入</label><br> <input 78 class="inputs" type="text" name="name2"> 79 </div> 80 81 <div class="item"> 82 <label class="label">電話番号</label><br> <input class="inputs" 83 type="denwa" name="denwa"> 84 </div> 85 86 <div class="item"> 87 <p class="bu"">ご希望の部をお選びください</p> 88 <select name="select-bu"> 89 90 <option value="1bu">第1部 1時30分~3時05分</option> 91 <option value="2bu">第2部 3時15分~4時45分</option> 92 </select> 93 </div> 94 95 96 97 <div class="btn-area"> 98 <input type="submit" value="予約する" name="booking"> <input type="reset" 99 value="リセット"> 100 </div> 101 102</form> 103</body>

多少は見やすくなったと思います。

HTMLもかなり滅茶苦茶です。

DOCTYPE宣言がない
HTMLタグがない

<p class="lead-form">ご予約はこちらから!</p>

head内に入ってる。

<form action="index.php" method="POST" class="booking_area" enctype="multipart/form-data">

全角スペースがある

<p class="bu"">ご希望の部をお選びください</p>

""

※HTMLがおかしいのはブラウザの「ソースを表示」でも分かります。構文チェックはかけてほしい。


PHP

htmlspecialchars

これは「画面出力時」に行うもので、情報保存時はバリデーションにかからない情報ならそのまま保存すべき

$write = $time . ", ". $name . ", " . $email. ",". $yourID . "/";

テキストに保存するときの弊害
入力値に,とかあった時の考慮はされているか。

設計どうなっているか分かりませんが、やはり、テキストにデータを保存する形式は幾ら頑張っても実用的ではないので、早いうちにデータベースに切り替えた方がいいです。

環境用意するのが面倒ならSQLiteでも十分です。

投稿2021/03/04 11:31

編集2021/03/04 11:32
m.ts10806

総合スコア80875

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

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

takotyan

2021/03/04 11:34

ありがとうございます。参考になります。
m.ts10806

2021/03/04 11:36

理解したうえで解決済み、としてくださいね。 情報が多いとそれだけ飲み込むのに時間かかるかもしれませんが、 今後起きうるであろう問題も含めて回答している人は多いので、 既に得られたアドバイスで解決可能なことを今後質問されたら非常にゲンナリします。
guest

0

postの処理と、ファイルI/Oの処理をわけて考えてみてください
ファイルの書き込みができることが確認できてからpostと絡めるとよいでしょう

投稿2021/03/04 11:28

yambejp

総合スコア116661

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問