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

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

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

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

Q&A

解決済

1回答

1923閲覧

削除フォームと入力フォームの送信を別にしたい

takakuni

総合スコア19

PHP

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

0グッド

0クリップ

投稿2019/02/23 04:03

前提・実現したいこと

PHPで簡易掲示板を作っています。
投稿番号を入力すると削除できる機能を実装したいと思っていて、作ったところ投稿フォームも送信されるような仕様になっています。

削除した番号は欠番にしたいです。
それぞれ別々でのPOSTができるようなシステムを作りたいです。
また、空欄で投稿されているみたいなので、空欄の際はPOSTできないような機能も実装したいです。

エラーメッセージ Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /home/000.com/public_html/mission_2-3.php on line 63

該当のソースコード

PHP

1<?php 2 $filename = 'keiziban.txt'; 3 ini_set('display_errors', "On"); 4 function h($s) { 5 return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); 6 }; 7 if ($_SERVER['REQUEST_METHOD'] == 'POST') { 8 $name = $_POST['name']; 9 $comment = $_POST['comment']; 10 $time = date('Y年m月d日 H時i分s秒'); 11 if (file_exists($filename)) { 12 $number = count(file($filename))+1; 13 } else { 14 $number = 1; 15 } // ファイルがあれば、番号は+1した値を代入、なかったら、番号は1 16 17 $datalist = $number."<>"."\t".$name."<>"."\t".$comment."<>"."\t".$time."\n"; 18 $fp = fopen($filename, 'a'); 19 fwrite($fp, $datalist); 20 fclose($fp); 21 } 22?> 23<!DOCTYPE html> 24<html lang="ja"> 25 <head> 26 <meta charset="utf-8"> 27 <title>keiziban</title> 28 </head> 29 <body> 30 <form action="" method="post"> 31 名前: <input type="text" name="name"> 32 コメント: <input type="text" name="comment"> 33 <input type="submit" value="送信"> 34 35 </form> 36 <form action="" method="post"> 37 削除対象番号:<input type="text" name="delete"> 38 <input type="submit"value="送信"> 39 </form> 40 <?php 41 if (file_exists($filename)) { 42 $datalists = file($filename); 43 foreach ($datalists as $value) { 44 list($number, $name, $comment, $time) = explode("<>", $value); 45 echo h($number); 46 echo h($name); 47 echo h($comment); 48 echo h($time); 49 echo nl2br("\n"); 50 } 51 }else{ 52 echo "コメントが1件もありません"; 53 } 54 if (isset($_POST["delete"])) { 55 $delete = $_POST["delete"]; 56 $delCon = file($filename); 57 $fp = fopen($filename, "w"); 58 for ($j = 0; $j < count($delCon); $j++) { 59 $delDate = explode("<>", $delCon[$j]); 60 if ($delDate[0] != $delete) { 61 fwrite($fp, $delCon[$j]); 62 } else { 63 fwrite($fp, "消去しました。\n");\ 64 } 65 } 66 fclose($fp); 67 } 68 ?> 69 </body> 70</html> 71

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

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

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

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

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

guest

回答1

0

ベストアンサー

かなりソースコードに誤りがあるのはまあおいといて…回答についてですが

同じファイルに転送するならformタグを2つに分ける必要はありません、一つのタグに
まとめてしまい、<input type="submit">において、value関数の値で分岐します。

PHP

1if ($_SERVER['REQUEST_METHOD'] == 'POST') { 2 $value = $_POST['mode']; 3 switch( $value ){ 4 case "insrt": 5 //登録処理 6 break; 7 case "delete": 8 //削除処理 9 break; 10 } 11}

また、なるべく<input type="submit">タグは使わずに<button type="submit"></button>タグを使うように心がけましょう。なぜなら、postで転送されたnameプロパティをvalueで設定できるので、分岐フラグに使えるからです

HTML

1<!-- こっちだとnameの値とラベルが一緒になってしまうので使いづらい場面がある --> 2<input type="submit" name="mode" value="登録する"> 3<input type="submit" name="mode" value="削除する"> 4 5<!-- こっちだと、nameの値とラベルを使い分けることができる --> 6<button type="submit" name="mode" value="insert">登録する</button> 7<button type="submit" name="mode" value="delete">削除する</button> 8

あとの質問は漠然としすぎているので自力でやってみましょう。空白の場合を転送させない制御はPHPだけだと無理なので、htmlのバリデーション制御で可能です。

※書き方がかなり古いのが気になります。また、極力noticeとwarningは表示されるようにして勉強した方が後々のためになります。

投稿2019/02/23 06:35

編集2019/02/23 06:41
FKM

総合スコア3624

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

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

takakuni

2019/02/24 05:07

ありがとうございました!書き方が古いとのことで、参考にしてよかったサイトを教えていただけると幸いです!
FKM

2019/02/24 05:42

この記事などにもあるように、スーパーグローバル関数は色々セキュリティ的に問題があるので、近年は使わない(といっても、この記事も4年前ですが…)のがセオリーですね。 https://qiita.com/mgng/items/901cf7f50a224b19335b
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問