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

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

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

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

Q&A

2回答

392閲覧

php,テキストファイルの指定のデータを削除

hideman0831

総合スコア19

PHP

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

0グッド

0クリップ

投稿2018/08/24 08:08

お疲れ様です。php初心者のhideman0831と申します。
入力フォームから送られた下記のデータを削除依頼フォームから送られた削除依頼番号のデータを削除したいのですが、すべてのデータが削除されてしまいました。
ご指摘いただけると幸いです。

<>1<>manbyo1<>hello<>2018/08/24 13:02:14
<>2<>manbyo1<>hello<>2018/08/24 13:02:18
<>3<>manbyo1<>hello<>2018/08/24 13:02:20
<>4<>manbyo1<>hello<>2018/08/24 13:02:23
<>5<>manbyo1<>hello<>2018/08/24 13:02:24
<>6<>manbyo1<>hello<>2018/08/24 13:02:26

上記のテキストファイル(sample4.txt)

ソースコード

<?php //if文で$_POST[delete]から送信されたもののみ処理を開始 if(isset($_POST["delete"])){ $a = file("sample4.txt");} for($i = 1; $i <count($a); ++$i){ explode("<>",$i); } if($_POST["delete"] = $i){ $fp = fopen("sample4.txt","w+"); fwrite($fp,"削除されました。"); fclose($fp); }else{ $fh = fopen("sample4.txt","a"); fwrite($fh,"指定された番号は存在しません。"); fclose($fh); } ?>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/08/24 08:16 編集

fwrite()でエラーメッセージみたいなのをデータファイルに出力する意味がわからない。sample4.txtはあくまでデータファイルなので、そんなメッセージで上書きしてしまえば壊れてしまうよ?
hideman0831

2018/08/24 08:17

ご指摘いただきありがとうございます。
guest

回答2

0

explode("<>",$i); でどういう結果がほしいのかな、$iってただのループカウント用変数なんだけど。

if($_POST["delete"] = $i){ の箇所が比較でなく代入になっていて常に成立するので、
この内側のfwrite()などの処理が常に行われる感じ。
結果、ファイルが壊れる。

指定の番号の行データを削除して同じファイルに出力し直すってだけ、
といえば簡単ですが、
1)ファイルから読み取って一旦配列に行単位のデータとして格納する。
2)行単位のデータを一つずつ紐解いて
3)指定番号と一致するなら配列から該当要素を省く。
4)一連の行データを精査したら、ファイルに出力する。
みたいな流れになりますが、
全くそういう流れになってない。

$_POST[]を直に参照するのはやめましょう、
$del = filter_input(INPUT_POST, 'delete');などとして、
以後$delとの比較ですみます。

php

1if( isset($_POST["delete"]) ) { 2 $a = file("sample4.txt"); 3}

これ、$_POST["delete"]がある場合のみ$aを初期化しているのだけど、
そうじゃないときに続くコード
for($i = 1; $i <count($a); ++$i){
でいきなり$aを参照するので、呼ばれ方によっては
Notice: Undefined variable: a
なんてのが出そう。
それに、変数名$aとか変数名の重要さをなめてますね。
ループ用の変数はindexの意味から$iなんて使ったりしますが、
$aだけだと、あとあとこの変数に一体どういうデータが入っているのだろうってわからなくなります。
phpに限らず、使用する変数は必ず初期化すること。鉄則。
phpに限らず、変数名を安易につけないこと。鉄則。

何度かコード内でデータファイル名が出現しているのだけど、
これも
define("DATA_FILENAME", "sample4.txt");
などとして以後DATA_FILENAMEを使えば転記ミス記述ミスは防げる。

正解に近いものを机上デバッグレベルで示してもいいのだけど、
それじゃ学習にならないよね?

投稿2018/08/24 08:22

編集2018/08/24 09:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hideman0831

2018/08/24 09:22

ご指摘頂きありがとうございます。参考にして再度やり直してみます。
guest

0

if($_POST["delete"] = $i)
比較じゃなくて代入になってますよ。

投稿2018/08/24 08:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hideman0831

2018/08/24 08:28

ご指摘いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問