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

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

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

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

Q&A

解決済

4回答

2843閲覧

掲示板で1のスレがつく前に変なのがついてしまう。

toutou

総合スコア2050

PHP

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

1グッド

0クリップ

投稿2016/08/22 15:58

編集2016/08/22 17:06

###前提・実現したいこと
サイトのコードを信用していいものか
投稿したときのNo1の下の空欄が出来てしまうのでどうにかしたい。

###発生している問題・エラーメッセージ
掲示板を作るサイトを見つけまして ポンクソフト やってみてたんですがどうやら最初おかしいらしくエラーがでまくります。少しずつ直して後は一番下のprintエラーだけになりました。これがどうも直らないので対処法を教えてください。また最初からおかしいのでこのサイトは信用してはいけないのでしょうか?
イメージ説明
画像は最初の場面で
画像の上の部分は全部クリアしました。
残ってるエラーは下のやつだけです。
Undefined offsetなので調べてみた結果配列がありませんとか言うエラーだと思います。
一番最初なのでテキストが空白なのでありませんって言われてエラー文がPRINTされてしまうものだという予想。

###該当のソースコード

<?php $lines = file('bbs2.txt'); if ($_POST['write']) { $items = explode("\t", $lines[0]); $no = $items[0] + 1; $name = htmlspecialchars($_POST['name']); if (!$name) $name = "名無しさん"; $mail = htmlspecialchars($_POST['mail']); $title = htmlspecialchars($_POST['title']); if (!$title) $title = "無題"; $contents = htmlspecialchars($_POST['contents']); $contents = str_replace("\r\n", "<br>", $contents); $contents = str_replace("\r", "<br>", $contents); $contents = str_replace("\n", "<br>", $contents); $delkey = htmlspecialchars($_POST['delkey']); $time = date("Y/m/d H:i:s"); $expire = time() + 3600 * 24 * 30; setcookie("name", $name, $expire); setcookie("mail", $mail, $expire); setcookie("delkey", $delkey, $expire); $data = "$no\t$name\t$mail\t$title\t$contents\t$delkey\t$time\n"; array_unshift($lines, $data); } else { $name = $_COOKIE['name']; $mail = $_COOKIE['mail']; $delkey = $_COOKIE['delkey']; } if ($_POST['delete']) { for ($i = 0; $i < count($lines); $i++) { $items = explode("\t", $lines[$i]); if ($items[0] == $_POST['delno'] && $items[5] == $_POST['delkey2']) { array_splice($lines, $i, 1); } } } if ($_POST['write'] || $_POST['delete']) { $fp = fopen('bbs2.txt', 'w'); foreach($lines as $line) fputs($fp, $line); fclose($fp); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>掲示板2</title> </head> <body> <form method="post" action="bbs2.php"> お名前:<input type="text" name="name" value="<?php print $name ?>"><br> メール:<input type="text" name="mail" value="<?php print $mail ?>"><br> 題 名:<input type="text" name="title"><br> 削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"><br> <textarea name="contents" cols="60" rows="5"></textarea><br> <input type="submit" name="write" value="送信"> <hr> 記事番号:<input type="text" name="delno"> 削除キー: <input type="password" name="delkey2"> <input type="submit" name="delete" value="記事削除"> </form> <hr> <?php foreach($lines as $line) { $line = rtrim($line); $items = explode("\t", $line); print "No.{$items[0]} "; print "<b>{$items[3]}</b> 投稿者:"; if ($items[2]) print "<a href='mailto:{$items[2]}'>"; print $items[1]; if ($items[2]) print "</a>"; print " 投稿時間:{$items[6]}"; print "<p>{$items[4]}</p><hr>\n"; } ?> </body> </html>

自分がやったのとさほどかわらないのでサイトのまま乗せてます。

自分の修正版一応エラーは消えてる

<?php $lines = file('bbs2.txt'); if(!isset($_POST['write'])){ $name = $_COOKIE['name']; }else{ if($_POST['write']){ $items = explode("\t", $lines[0]); $no = $items[0] + 1; $name = htmlspecialchars($_POST['name']); if (!$name) $name = "名無しさん"; $mail = htmlspecialchars($_POST['mail']); $title = htmlspecialchars($_POST['title']); if (!$title) $title = "無題"; $contents = htmlspecialchars($_POST['contents']); $contents = str_replace("\r\n", "<br>", $contents); $contents = str_replace("\r", "<br>", $contents); $contents = str_replace("\n", "<br>", $contents); $delkey = htmlspecialchars($_POST['delkey']); $time = date("Y/m/d H:i:s"); $expire = time() + 3600 * 24 * 30; setcookie("name", $name, $expire); setcookie("mail", $mail, $expire); setcookie("delkey", $delkey, $expire); $data = "$no\t$name\t$mail\t$title\t$contents\t$delkey\t$time\n"; array_unshift($lines, $data); } } if(isset($_POST['delete'])) { for ($i = 0; $i < count($lines); $i++) { $items = explode("\t", $lines[$i]); if ($items[0] == $_POST['delno'] && $items[5] == $_POST['delkey2']) { array_splice($lines, $i, 1); } } } if(isset($_POST['write'])){ $fp = fopen('bbs2.txt', 'w'); foreach($lines as $line) fputs($fp, $line); fclose($fp); } if(isset($_POST['delete'])){ $fp = fopen('bbs2.txt', 'w'); foreach($lines as $line) fputs($fp, $line); fclose($fp); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>掲示板2</title> </head> <body> <form method="post" action="tes.php"> お名前:<input type="text" name="name" value="<?php print $name ?>"><br> メール:<input type="text" name="mail" value="<?php print $mail ?>"><br> 題 名:<input type="text" name="title"><br> 削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"><br> <textarea name="contents" cols="60" rows="5"></textarea><br> <input type="submit" name="write" value="送信"> <hr> 記事番号:<input type="text" name="delno"> 削除キー: <input type="password" name="delkey2"> <input type="submit" name="delete" value="記事削除"> </form> <hr> <?php foreach($lines as $line) { $line = rtrim($line); $items = explode("\t", $line); print "No.{$items[0]} "; print "<b>{$items[3]}</b> 投稿者:"; if ($items[2]) print "<a href='mailto:{$items[2]}'>"; print $items[1]; if ($items[2]) print "</a>"; print " 投稿時間:{$items[6]}"; print "<p>{$items[4]}</p><hr>\n"; } ?> </body> </html>

###試したこと
IFをつけてやりたかったのだがいい条件式が探してみたが見つからなかった。
グローバル変数で先に$itemsで配列を作ったがまったく意味なかった。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

ikuwow👍を押しています

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

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

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

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

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

kei344

2016/08/22 16:07

エラー文はテキストで追記されたほうが良いと思います。
toutou

2016/08/22 16:24

エラー文の意味と予想を載せてみました
kei344

2016/08/22 16:25

少なくとも動かしているもののコードを提示ください。
toutou

2016/08/22 17:07

コード載せましたがIssetをつけたくらいであまり変わりないです。
mpyw

2016/08/22 17:38

著者の方に連絡してみましたので,もしかしたら回答がいただけるかもしれません(強制するものではありません)(丸投げ)
guest

回答4

0

そのサイトの管理人です。
参考にして頂いてありがとうございます。

この記事は10年前に作成したもので、今となっては相当に古い記述になっています。
一度は消したのですが、参考にしたいというご要望がありまして、一応「旧コンテンツ」という扱いで残してあります。

しかし、初学者が見ると混乱の元となると考えて、掲示板1のみ修正しました。修正点は、

・HTML4からHTML5へ。
・文字コードをShift_JISからUTF-8へ。
・データファイルをタブ区切りのテキストファイルからJSONへ。
・htmlspecialchars関数にENT_QUOTESオプションを付加。
・HTMLタグとPHPプログラムを分離。

ロックやCSRF対策なども施すべきですが、ソースが長くなるのでとりあえずはこのくらいで。

他の記事も順次移行していく予定ですので、何卒ご容赦のほどをm(__)m

http://ponk.jp/php/file/bbs1

投稿2016/08/23 01:10

naga3

総合スコア1293

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

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

toutou

2016/08/23 11:35

大変恐縮です。管理人さんがくるなんて。10年前ってかなり古いんですね。少しずつ解説があって見やすかったので修正版を勉強させていただきます。
guest

0

サイトに載っているスクリプトを、言われた手順通り実行すると動作しますね。
入門用サイトなので、実用に耐えうるスクリプトではないですが、DBなしで1ファイルで動くので、ちょっと動かして楽しむ分にはイイんじゃないでしょうか。
*個人的に違和感のある箇所が複数ヶ所ありますが。。。

toutou さんの改変したスクリプトで、添付画像そのままのエラーは出ませんでしたが、多分 cookie が空なのと、text ファイルの最終行に改行が入っているのが原因です。

flied_onion さんの指摘通り、touch bbs2.txtで改善すると思います。

いずれにしても、実用に耐えうるスクリプトではないので、もう少し勉強し、ちゃんとしたスクリプトを作成されたほうが良いかと。

投稿2016/08/22 17:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

toutou

2016/08/22 17:44

これだと実用的じゃないんですか。掲示板と言うもの自体をそこまで知らないのでわからないですね。改変したのがまずかったとはひどい話ですね。いろいろ大変です。
退会済みユーザー

退会済みユーザー

2016/08/22 17:52 編集

実用的ではないです。手順として普通やることが省かれています。 入門用ということで省かれたのだと思いますが、個人的にはこういったサンプルは嫌いです。
guest

0

ベストアンサー

PHP

1$items = explode("\t", $line); 2if ( count( $items ) !== 7 ) { continue; } // Add

投稿2016/08/22 17:22

kei344

総合スコア69398

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

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

toutou

2016/08/22 17:41

まいどまいど自分のつたない質問にお付き合いいただいてありがとうございます。count文なりcontinue知らないことばかりです。精進します。
guest

0

信用していいかどうかは私はノーコメントですが、

bbs1.txt に改行が入っているためだと思います。
完全に空のファイルなら警告はでないんじゃないでしょうか。

たとえばWindowsで以下の様にファイルを作っていたら、改行が含まれてしまいます。
echo.>bbs1.txt
OS XやLinuxの場合は以下で改行付きのファイルになります。
echo >bbs1.txt

Windowsなら新規作成でテキストファイルを作って名前を変えるか、
OS XやLinuxであれば、ファイルを消して
touch bbs1.txt
でファイルを作成してみてください。


追記

foreachのあと、無条件にファイルを書き込んでいるからかもしれません。
表示するときに行が増えてしまっているのかも。
$fp = fopen('bbs1.txt', 'w');を含む3行を以下の様にしてみてください。

if ($_POST['write']) { $fp = fopen('bbs1.txt', 'w'); foreach($lines as $line) fputs($fp, $line); fclose($fp); }

投稿2016/08/22 16:17

編集2016/08/22 16:43
flied_onion

総合スコア2604

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

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

toutou

2016/08/22 16:30

ファイル名を変えたり空のでもやってみましたが無理でした 
flied_onion

2016/08/22 16:37

bbs1.txtのファイルサイズは0バイトですか?
flied_onion

2016/08/22 16:41

あぁ、ひょっとして出力の後無条件に書き込んでるからですかね。 ちょっと追記します。
toutou

2016/08/22 17:13

すいません間違ってコード張ってたので修正しました。 気づくのが遅れて申し訳ないです。掲示板の2個目でした。そっちのほうだとissetをつけないと画像のようなことになります。下のほうの||のが二つに分かれてるのは自分の技術不足です。動作には問題ないと思います。
toutou

2016/08/22 17:42

色々振り回してしまいましてすみませんでした。自分が間違いばかりで申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問