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

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

ただいまの
回答率

90.51%

  • PHP

    23978questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,521

toutou

score 1624

前提・実現したいこと

サイトのコードを信用していいものか
投稿したときの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/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/08/23 01:25

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

    キャンセル

  • toutou

    2016/08/23 02:07

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

    キャンセル

  • mpyw

    2016/08/23 02:38

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

    キャンセル

回答 4

+4

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

この記事は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 20:35

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

    キャンセル

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/23 02:44

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

    キャンセル

  • 2016/08/23 02:46 編集

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

    キャンセル

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/23 02:41

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

    キャンセル

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/23 01:30

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

    キャンセル

  • 2016/08/23 01:37

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

    キャンセル

  • 2016/08/23 01:41

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

    キャンセル

  • 2016/08/23 02:13

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

    キャンセル

  • 2016/08/23 02:42

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    23978questions

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