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

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

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

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

Q&A

解決済

2回答

614閲覧

テキスト保存の簡易掲示板で削除したい

MakotoIshizawa

総合スコア32

PHP

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

0グッド

0クリップ

投稿2020/01/08 07:49

編集2020/01/08 08:08

PHP5.2.4(指定による)
掲示板を作る課題に取り組んでいます。
#本題
一度、投稿、削除、編集機能をパスワードもつけた状態で動作させられましたが、何か余計なタイプをしてしまったのか動作しなくなってしまいました。
そこで、削除機能だけ取り出し、シンプルな形にして試していますが動作しません。
##構造
ファイルを配列として読み込み、送信番号と投稿番号を比較し、
違った場合はwモードで上書きという形で削除しています。(課題として指定されています)

##エラー
エラーは解消して現在エラーはない状態です
##試したこと
フォームの送信が出来ています。var_dumpしている$deleteで確認。
スペルミスや、;はチェック。スペースは可視化して全角がないことを確認しました。
テキストファィルの中身は正常であることを確認しました。

###削除機能だけ取り出したコード

php

1<?php 2ini_set( 'display_errors', 1 ); 3//削除機 4$file_name = "keijiban_text.txt"; 5$delete = ( int )filter_input( INPUT_POST, "delete" ); //削除番号の変数定義 6$delimiter = "<>"; //区切り文字 7if ( !empty( $delete ) ) { //削除番号が空でなかったら 8 $rows = file( $file_name ); //ファイルを配列として読み込む 9 $fp = fopen( $file_name, "wb" ); //wbモードで開く 10 if ( flock( $fp, LOCK_EX ) ) { //もし排他ロックかけたら 11 foreach ( $rows as $row ) { //すべての行で繰り返す 12 $select = explode( $delimiter, trim( $row ) ); //<>で分割し投稿番号取り出す 13 if ( $delete !== $select[ 0 ] ) { //削除番号が一致しない場合 14 fwrite( $fp, $row ); //上書き保存 15 } 16 } 17 } 18 flock( $fp, LOCK_UN ); //ロック開放 19 fclose( $fp ); 20} 21?> 22<!doctype html> 23<html lang="ja"> 24<head> 25<meta charset="utf-8"> 26<title>削除機能</title> 27</head> 28 29<body> 30 <?php 31echo "delete:"; 32var_dump( $delete ); 33echo "<br>"; 34 35?> 36<hr> 37 <!--削除フォーム--> 38<form method="post"> 39 <div id="delete_show"> 40 <label for="delete">削除対象番号</label> 41 <br> 42 <input type="number" name="delete" > 43 <br> 44 </div> 45 <input type="submit" value="削除" id="delete_button"> 46</form> 47<?php 48$search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;", ); //置き換え時の検索文字 49$replace = array( "\r\n", "\r", "\n", "<>", ); //置き換える文字 50//XSS対策 51function h( $str ) { 52 return nl2br( htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ) ); 53} 54//投稿一覧 55if ( !empty( $file_name ) ) { 56 $rows = file( $file_name ); 57 foreach ( $rows as $row ) { 58 $select = explode( $delimiter, $row ); 59 $select = str_replace( $search, $replace, $select ); 60 echo h( $select[ 0 ] ) . "<br>"; 61 echo h( $select[ 1 ] ) . "<br>"; 62 echo h( $select[ 2 ] ) . "<br>"; 63 echo h( $select[ 3 ] ) . "<br>"; 64 } 65} else { 66 echo "<p>投稿はまだありません</p>"; 67} 68?> 69</body> 70</html>

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

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

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

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

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

MakotoIshizawa

2020/01/08 08:02

それに関しては、テキストファイルを変えることで機能は動作しているので、その状態で進めています。 それとは別に時間をとって並行して調べて解決したいと思っています。
退会済みユーザー

退会済みユーザー

2020/01/08 08:04

keijiban_text.txt の中身はチェックした?
退会済みユーザー

退会済みユーザー

2020/01/08 08:05

この質問にあるコードだけ再現しようにも、そもそもデータがないので、過去の質問全部を洗い出させる負担を回答者に強いるの?
MakotoIshizawa

2020/01/08 08:05

しました。投稿機能で投稿し、期待通りに記録されています。 質問文に追記しておきます。
MakotoIshizawa

2020/01/08 08:10

すみません。 質問文書き直します。
退会済みユーザー

退会済みユーザー

2020/01/08 08:11

全機能をデバッグするほど暇じゃない人に向けて、すぐテストしてもらえるように、テスト用の掲示板データを掲載するくらいやってもいいんじゃない?
MakotoIshizawa

2020/01/08 08:14

掲示板データとは、保存したテキストファイルのことでしょうか?
m.ts10806

2020/01/08 08:15

前にもしかしたら書いたかもしれませんが、PHP5.2という時点で回答したい人がほぼいないようにも思います。このためだけにわざわざ環境作る必要がありますしね。
MakotoIshizawa

2020/01/08 08:21

すみません、負担をかけすぎているんですね。 もっと単純化して自力で頑張ってみようと思います。
退会済みユーザー

退会済みユーザー

2020/01/08 08:27

投稿削除機能を抜粋しただけのコード「しか」ないのに、どーやって試すのか、教えてほしいわ
退会済みユーザー

退会済みユーザー

2020/01/08 08:35 編集

動かくなってるとか言うなら、まず掲示板データファイルを削除してカラにして、投稿するところから順に機能を点検していくもんでしょ。効率よくテストできるように、テスト仕様書を起こすこともおすすめしたいです。(その前に、データファイルがどうなるか細部まで表したシステム機能仕様書の類も必要になりますが。)
MakotoIshizawa

2020/01/08 08:43

色々ありがとうございます。 それぞれ調べて実行したいと思います。
papinianus

2020/01/08 09:07

この<>で区切った掲示版何回もみるんですが、この課題は一体どこで出されているか伺えませんかね。
guest

回答2

0

ベストアンサー

動作しなくなってしまいました

エスパーを試みて。。。

$deleteint$select[ 0 ]Stringだから!==では常にTrueになってるんだと思う。

PHP

1// if ( $delete !== $select[ 0 ] ) { //削除番号が一致しない場合 2 if ( $delete != $select[ 0 ] ) { //削除番号が一致しない場合 3

投稿2020/01/08 09:01

編集2020/01/08 09:20
Y.H.

総合スコア7914

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

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

MakotoIshizawa

2020/01/08 09:11

ありがとうございます。 おっしゃる通りでした。 皆様のコメント勉強になり大変助かります。
guest

0

$deleteは(int)で型キャストしているんだから !== で文字列である $select[0]とは型が違うからそもそも成立しない、って話だから、ちゃんと型を意識して使うには

php

1if ( $delete !== (int)$select[ 0 ] ) { //削除番号が一致しない場合

するべきかもよ。

投稿2020/01/08 09:44

編集2020/01/08 09:45
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/01/08 09:46

後出しジャンケンでスマンな
MakotoIshizawa

2020/01/08 11:23 編集

なるほど。 そういうやり方が出来るわけですね。 いつも勉強になります。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問