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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1075閲覧

phpで簡易掲示板を作成しましたが、メッセージの削除がうまくいきません。

chimo

総合スコア55

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/05 09:29

編集2020/05/05 11:10

【目的】
削除したいメッセージの番号をフォームから送信するとその番号と一致するメッセージがテキストファイルから削除され、ブラウザ上からも消える。

【コード】

php

1<?php 2 3// メッセージを保存するファイルのパス設定 4define( 'FILENAME', './kadai_2_02.txt'); 5 6// タイムゾーン設定 7date_default_timezone_set('Asia/Tokyo'); 8 9// 変数の初期化 10$now_date = null; 11$data = null; 12$file_handle = null; 13$split_data = null; 14$message = array(); 15$message_array = array(); 16$success_message = null; 17$error_message = array(); 18$delete = null; 19$del_con = null; 20$del_data = array(); 21 22//-------テキストファイルにデータを書き込む----------------------- 23 24if(file_exists(FILENAME)){ 25 $num = count(file(FILENAME)) + 1; //$num = count(file(FILENAME))でファイルの行数をカウントできる 26}else{ 27 $num = 1; 28} 29 30if( !empty($_POST['btn_submit']) ) { 31 32 //-----未入力のバリデーション--------- 33 if(empty($_POST['view_name'])){ 34 $error_message[] = '名前を入力してください!'; 35 } 36 37 if(empty($_POST['message'])){ 38 $error_message[] = 'メッセージを入力してください!'; 39 } 40 //------------------------------------- 41 42 if( $file_handle = fopen( FILENAME, "a") ) { //fopen関数で指定したファイルを開く 43 // タイムスタンプ 44 $now_date = date("Y-m-d H:i:s"); 45 46 // 書き込むデータを作成 47 $data = $num."<>".$_POST['view_name']."<>".$_POST['message']."<>".$now_date."\n"; 48 49 // 書き込み 50 fwrite( $file_handle, $data); //file_handleは書き込む対象となるファイル(●●.txt)を判別するためのパラメータ 51 52 // ファイルを閉じる 53 fclose( $file_handle); 54 55 //投稿が成功したことを示すメッセージ 56 $success_message = 'メッセージを送信しました'; 57 } 58} 59 60//-------テキストファイルのデータを掲示板のフォーム下に表示-------- 61 62if( $file_handle = fopen( FILENAME,'r') ) { 63 64 while( $data = fgets($file_handle) ){ //fgets関数でファイルからデータを一行ずつ全て取得 65 66 //preg_split関数で文字列を特定の文字で分割する: 67 $split_data = explode("<>",$data); 68 69 $message = array( 70 'view_name' => $split_data[1], 71 'message' => $split_data[2], 72 'post_date' => $split_data[3] 73 ); 74 array_unshift( $message_array, $message); 75 } 76 77 // ファイルを閉じる 78 fclose( $file_handle); 79} 80 81//--------指定されたメッセ―ジを削除する----------------------------- 82 83if(isset($_POST['delete'])){ 84 85 $delete = $_POST['deleteNo']; 86 $del_con = file(FILENAME); 87 88 for( $i=0; $i<count($del_con); $i++ ){ 89 $del_data = explode("<>", $del_con[$i]); 90 if($del_data[0] == $delete){ 91 array_splice($del_con,$i,1); //array_splice(配列、削除開始位置、削除する配列要素数←これ指定しないと削除開始位置から全部消える) 92 file_put_contents(FILENAME, implode("\n", $del_con)); 93 } 94 } 95} 96 97 98?> 99 100<!DOCTYPE html> 101<html lang="ja"> 102<head> 103<meta charset="utf-8"> 104<title>簡易掲示板</title> 105</head> 106 107<body> 108<h2>簡易掲示板(^-^*)</h2> 109 <?php if(!empty($success_message)):?> 110 <p class="success_message"><?php echo $success_message;?></p> 111 <?php endif; ?> 112 113 <?php if(!empty($error_message)):?> 114 <ul class="error_message"> 115 <?php foreach($error_message as $value):?> 116 <li><?php echo $value; ?></li> 117 <?php endforeach; ?> 118 </ul> 119 <?php endif; ?> 120 121 <form method="post"> 122 <div> 123 <label for="view_name">名前</label> 124 <input id="view_name" type="text" name="view_name" value=""> 125 </div> 126 <div> 127 <label for="message">メッセージ</label> 128 <textarea id="message" name="message"></textarea> 129 </div> 130 <input type="submit" name="btn_submit" value="書き込む"> 131 </form> 132 133 <form method="post"> 134 <div> 135 <label for="deleteNo">削除番号</label> 136 <input id="deleteNo" type="text" name="deleteNo" value=""> 137 </div> 138 <input type="submit" name="delete" value="削除する"> 139 </form> 140 141<hr> 142 143<section> 144 <?php if( !empty($message_array) ): ?> 145 <?php foreach( $message_array as $value ): ?> 146 <article> 147 <div class="info"> 148 <h2><?php echo $value['view_name']; ?></h2> 149 <time><?php echo date('Y年m月d日 H:i', strtotime($value['post_date'])); ?></time> 150 </div> 151 <p><?php echo $value['message']; ?></p> 152 </article> 153 <?php endforeach; ?> 154 <?php endif; ?> 155</section> 156 157</body> 158</html>

【やったこと】
★似たような投稿が(https://teratail.com/questions/137315)にいくつか紹介されていましたので全て確認してみました。
★初め、 if('del_data[0]' == $delete) のdel_data部分にクオートを付けずに実行すると、クオートを付けないとエラーになりますという旨のエラーメッセージが出てきたのでクオートを付けましたところエラーはでなくなりました。が、メッセージはブラウザからもテキストファイルからも削除されません。

【頂いた解答をもとに$del_data[0]にコードを変更した後のエラー】

Notice: Undefined offset: 1 in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_04.php on line 70 Notice: Undefined offset: 2 in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_04.php on line 71 Notice: Undefined offset: 3 in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_04.php on line 72

このエラーがくりかえし表示され、テキストファイルからは該当のメッセージが削除されますがブラウザには削除したメッセ―ジも残りませんし、

Emily 2020年05月04日 13:21 Yes,please 1970年01月01日 09:00 1970年01月01日 09:00 1970年01月01日 09:00

↑のように名前や投稿日時、メッセージの他にも「1970年01月01日 09:00 」と関係ない日時が各投稿に対して三回ずつ繰り返されます。

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

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

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

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

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

m.ts10806

2020/05/05 09:44 編集

>似たような投稿がたくさんあることは知っております。手当たり次第に確認しましたが、上手くいきませんでした。 こういう但し書きをするのではなく、実際に確認した記事や試したことを書いてもらった方が助かります。 本当に調べたかどうか誰にも伝わりません。
chimo

2020/05/05 09:55

失礼いたしました。確認事項について追記致しました。
m.ts10806

2020/05/05 10:33

ええ、ですから、但し書きは削りましょう。 「こういうことを調べて」「こういうことを試して」「こうなっている」 だけあれば十分です。 要件と関係のない文章はノイズにもなりますし、要件が見えづらくなります。
退会済みユーザー

退会済みユーザー

2020/05/05 10:39 編集

回答をもらって、すぐ質問文のコードを直してしまうと、回答の意味がずれてしまって、あとから駆けつけた人に意味が伝わらなくなってしまう。早くちゃんと動くコードにしたいのはわかるけど、もうちょっとじっくり落ち着いて一晩くらいは手を付けず、いろんなアドバイスをもらってからでも遅くはないのではないかと。(じゃないと、ただの無償デバッグ依頼とみなされて心証悪くするよ。)
chimo

2020/05/05 10:47

>m6uさん なるほどです。私的にはレスポンスが遅いと回答してくださった方に失礼になってしまうのではないかと思っての行動でした。以降は一日ほど待ってから頂いた回答にレスポンスを行ったり、追記や編集をするように致します。ご指摘ありがとうございます。
chimo

2020/05/05 10:50

>m.ts10806さん 一応私的には必要なことを但し書きに書いたつもりです。二度手間になるのを防ぐためにあえて書きました。ただそれを考えるとやはり試した内容は最初から参考にした記事のurlなどを一緒に記載しとくべきであったと反省しております。
m.ts10806

2020/05/05 11:03

なるほど。 もう少しストレートに表現しましょう。 「言い訳が長い。読む気がしない。”ここを確認した”というURLだけあれば分かる。」 質問テンプレート使った方がいいですよ。端的にまとめられて読みやすくなる。それだけteratailの質問テンプレートはよくできてます。
chimo

2020/05/05 11:06

わかりました。ご指摘ありがとうございます。
m.ts10806

2020/05/05 11:22

強制したいわけではないので誤解させていたらごめんなさい。 なのでこれだけは認識しておいてもらいたいということだけ書いて最後にします。問題は少しでも早く解決に至った方が良いので、そのための「質問するために考慮すること」として認識してください(「質問するときのヒント」のガイドラインも熟読してください) --- 回答者、見る人は赤の他人です。質問者の前提や背景は知りません。というのもあるから色々書きたくなってしまうのは分かりますが、力量はコードや要件の説明など読めば分かりますし、「初心者」であることを伝えたいなら「初心者アイコン」があれば伝わります。 回答者としても少しでも早い問題解決の手助けをと思って見ている人が大半だと思うので、個人的な事情や変な配慮は無駄に感じてしまうことがあります。 「その文章を書く量で要件具体的に書いたり試したことを深堀してほしい」と感じています。その方がアドバイスもしやすいからです。 なので、「これを読んでどう反応してほしいのか」が見えない文章、挨拶などは極力削った方が解決に繋がります。 「質問テンプレート」はその辺りが考慮された「必要な情報だけを盛り込める項目」になっているわけですね。 ---- 以上です。
chimo

2020/05/05 11:25

なるほどです。自分目線の質問をしてしまっていたということですね。今後はテンプレートに従って、回答してくれる方々の目線になって質問していくよう心がけます。ご指摘ありがとうございました。
m.ts10806

2020/05/05 12:02

「問題は少しでも早く解決に至った方が良い」というのももしかしたら誤解を与えるかもしれませんので補足しておきますと、「自分で解決で来たらそれが一番早い」という意味も込めてます。 答えそのままもらっても問題解決能力は育ちませんし、必ず誰かを頼って時間を浪費することしかできなくなりますからね。 そういうことに慣れてしまった人は、見透かされてそのうち誰も手を差し伸べなくなります。
guest

回答2

0

ベストアンサー

過去質問のコメントから「インターンで出ている課題」とのことで、
「テキストに保存する」という実務での有効性が何もないとはいえ、
やはりここは自力で解かなければ本当に何の役にも立たない課題になる

という前提で、
現在出ている「Notice: Undefined offset」にだけ言及します。

下記だけで再現できます。

php

1<?php 2$hoge = []; 3echo $hoge[0];

なぜそうなるか分かりますか?
これを調べるのがvar_dump()です。

「index」や「offset」は確かに用語ではありますが、訳してみるとなんのこともない、身近な単語です(ここは調べてみてください)

PHPに限らず、初心者・入門者段階で直面する問題の多くは下記を習慣化すれば解決できます。

  1. エラーメッセージをよく読むこと

原因そのまま書いてあります。特にPHPのエラーメッセージは結構親切です。
0. デバッグをすること
本来はデバッグを覚えることが初心者がHello Worldの次にやるべきことですが、なぜか「書くことだけ」に言及した講座や書籍が多く、「初心者から抜けれない初心者」を量産しているのが現状です
0. ドキュメントを読むこと(公式またはそれに類するもの)
PHPならPHPマニュアルです。これが活用できるようになることが初心者から抜け出す最も最短ルートです。でもこれをしない人は永遠に初心者から抜け出せていない

teratailの質問者を見ていると、初心者から抜け出せてない人はいずれもしてません。逆に、やっている人はすぐに成長し、人にアドバイスできるまでになっている印象です(稀な例)

自身がどうなりたいかで決めてください。
エンジニアとしてやっていきたい気があるなら明白だと思います。

「エラーメッセージを読むこと」については、下記のような記事は読んでおいた方が良いでしょう。
「考え方」です。

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

※元々質問に書いてあった文言に呼応するわけではないですが、この手の回答を書くのは1度や2度ではありません。それだけ「ちゃんとした指導を受けてない初心者が駆け込んでいる」と言えるかもしれません。

でも、この問題、あなたが世界で初めてぶちあたったものでしょうか?
考えてみてください。

調べ方を知っているのも技術のうちです。
考え方次第で調べ方も変わります。検索するときのキーワードも変わってきます。

それが質問の時に「必要な情報を提供する」ことにも繋がってきます。

投稿2020/05/05 11:43

m.ts10806

総合スコア80859

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

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

chimo

2020/05/05 11:56

ご回答ありがとうございます。たしかに、これは自分で考えて解決しなければいけませんね。甘えすぎていました。よく考えてみれば、javaのときからずっとデバッグ苦手なまま、ずっと逃げてきたようなもんです。このインターンでは、phpやhtmlを習得することよりもまず、ドキュメントを読み、一人でエラーメッセージを解読し、一人でデバックすることを目標にしてみたいと思います。また、同じ過ちをしてしまう気もしますが...それでもこれまでよりかは粘り強くエラーの解読とデバッグをやっていくようにしたいです。いつも、できるだけ本人に考えさせるような回答をして下さり、ありがとうございます。
m.ts10806

2020/05/05 11:58

「Javaやってたっぽいのになぜデバッグしないんだろう」というのが当初からの疑問です。
chimo

2020/05/05 12:07

うう…刺さる言葉です(笑) 情けない限りですね…^-^;;; 質問とは関係ないのですが、m.ts10806さんは、いつ頃からなぜプログラミングを始めてどのように勉強してこられたのですか? もし答えたくなければ大丈夫です。ただ、周りにあまりプログラミングしている人がいないので、経緯が気になってしまいました。
m.ts10806

2020/05/05 12:17

別に隠すほどのことでもないのでざっと答えます。 「プログラミング」をどこからと捉えるか、ですね。 大学の授業でやるような「自己紹介ホームページ、我が町紹介ホームページ」レベルで「プログラミング」と言えるなら「大学から」と言えるでしょうし、「本格的に業務を目指した」と言うなら、就職してからです。 大学も文系の学部出てますし、就職活動もプログラミングをやろうと探したところのほうが少ないくらい。 まぁ、年齢も四捨五入したら40になるくらいの年齢なので、歴としては12,3年といったところでしょうか。PHPに限れば10年くらいですかね。 でも「プログラミングで仕事ができ始めた」と言えるのはここ7,8年くらいでしょうか。 基礎がなかったもので、苦労しました。 基本は「作りまくった」ですかね。失敗した分だけ上手になれるのはスポーツとかと通じるものがあります。その失敗を積極的にできるかどうかでしょう。
chimo

2020/05/05 12:40

なるほどです…。では大学時代から独学でプログラミングを触り始めた…という感じでしょうか?なぜ始めようとおもったのですか??今はフリーランスとかでしょうか
m.ts10806

2020/05/05 12:43

独学というか授業でホームページ作ったくらいですよ。 やはり「プログラミング始めた」とは言えないですね。 ちなみにフリーランスになったことは一度もありません。
chimo

2020/05/05 13:49

文系の大学でもホームページを作成することってあるんですね。いろいろお話聞けて良かったです、ありがとうございました^-^
chimo

2020/05/05 13:52

あ、削除機能ついにできました!!ありがとうございます!!ですが、デバッグとかコードの問題というより、私がブラウザとかFFFTPの使用方法についての知識が浅かったために起きたミスのような気もしました…うまく説明できませんが^^;;
guest

0

if('del_data[0]' == $delete) のdel_data部分にクオートを付けずに実行すると、クオートを付けないとエラーになりますという旨のエラーメッセージが出てきたのでクオートを付けましたところエラーはでなくなりました。

少なくともこうでは。

PHP

1// if('del_data[0]' == $delete) 2// ↓ 3 if( $del_data[0] == $delete)

投稿2020/05/05 09:33

kei344

総合スコア69458

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

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

chimo

2020/05/05 09:34

クオートつけないとエラー出るんです
kei344

2020/05/05 09:36

「$」がないことを指摘していますが、それについてはわかっていますか? $del_data[0]でエラーが出るなら var_dump($del_data);でご自身の想定しているデータが入っているかを確認してください。
chimo

2020/05/05 09:38

あ!!ごめんなさい!!よく見たつもりでしたが気が付きませんでした。やってみます!!
kei344

2020/05/05 09:51

回答が付いた質問の編集は慎重に行ってください。質問文のコードについて回答にて指摘があった場合は「追記」し、元のコードを編集する場合も「直したこと」がわかるようにしてください。後から見た人から見て、現在の回答が「無いコードに対しての指摘」になり、意味がわからなくなります。
chimo

2020/05/05 09:54

失礼いたしました。コードの編集を行いました。追記として新たなエラーが出てきてしまったので、確認して頂けると幸いです。
m.ts10806

2020/05/05 10:35

既にkei344さんがコメントで書かれたアドバイスで十分解決に繋がると思います。 > var_dump($del_data);でご自身の想定しているデータが入っているかを確認してください。
chimo

2020/05/05 11:23

やってみましたが、できません。というよりか、削除機能追加する前のコードすらきちんと実行されなくなってしまいました……
m.ts10806

2020/05/05 11:26

直接の解決策ではないですよ。「デバッグ」です。 コメントにあるように「ご自身の想定しているデータが入っているかを確認してください。 」です。 提示のエラーが出る原因が分かるはずです。エラーをちゃんと読んでいればね。 そこからがスタートなので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問