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

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

ただいまの
回答率

90.75%

  • PHP

    19153questions

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

(おそらく)PHPでの文字列比較に関する問題点

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 236

are_kore

score 2

前提・実現したいこと

PHPで、パスワード付きでコメントと名前を投稿し表示させ、番号指定とパスワード入力で削除や編集をできるようにするという課題(練習問題)に取り組んでいます。
①コメント、名前、パスワード入力でメモ帳に記載
②番号を指定しパスワードを入力してボタンを押すとコメント削除(実際はメモ帳の中身を最初から書き換えている)
③番号を指定し編集ボタンを押すと編集モードとして起動、コメントを削除して再投稿できる(同上)
④上記いずれでも最終的にページにメモ帳の内容がパスワードを除いて表示される

発生している問題・エラーメッセージ

詳しいことはソースコードの中にコメントアウトとして記載していますが、「問題の部分」にて記載の通りの問題が発生し、解決しておりません。
エラーメッセージは出ておりませんが、当該部分に不備があるのか、正しく編集項目・パスワードを入力しても編集済みの文章が出力されません。
(「if((strcmp($postcont[0],$_POST["edit_ed"])==0) && 『(strcmp($postcont[4],$_POST["pass_ed"]) == 0)』)」の『』部分のみどのような値でもfalseになっている?)
しかし、PHPは初心者ゆえこの部分のみの問題かは判断できないため、最初から最後までを記載しております。申し訳ございません。

該当のソースコード

<?php
header('Content-Type: text/html; charset=UTF-8');

if(!file_exists('exam.txt')){
  touch('exam.txt');
  chmod('exam.txt',0644);
}
?>
<!DOCTYPE html>
<html lang = “ja”>
<head>
<meta charset = “UTF-8”>
<title>簡易掲示板</title>
</head>
<body>

/* 
「コメントを編集する」欄に数値が入った状態で「編集」ボタンが押されてファイルが再読込されたら「編集モード」として各欄のnameとvalueが変わる仕組み
具体的にはnameは名前欄のname→name_ed、コメント欄のcomment→comment_ed、という風に_edが付記される
valueは編集予定のコメントが表示される(現在のところこの部分に不具合はない)
*/
  <?php
if(!empty($_POST["edit"])){
  echo("現在編集モードです");
}
   ?>


  <form action="exam.php" method="post">
  <p>
  入力フォーム:
  <input type="text"
  name="<?php
      if(!empty($_POST["edit"])){
        echo("comment_ed");
      }else{
        echo("comment");
      }
      ?>"
  size="40"
  value="<?php
    if(!empty($_POST["edit"])){
      $comarr = file("exam.txt");
      $edc = $_POST["edit"] -1;
      $string = $comarr[$edc];
      $postcont = explode("<>",$string);
      echo($postcont[2]);}
      ?>"/>
   <?php
   if(!empty($_POST["edit"])){
     echo('<input type="hidden" name="editedcomment">');
   }
   ?>
  名前:
  <input type="text"
  name="<?php
    if(!empty($_POST["edit"])){
      echo("name_ed");
    }else{
      echo("name");
    }
  ?>"
  size="10"

  value="<?php
  if(!empty($_POST["edit"])){
    $comarr =  file("exam.txt");
    $edc = $_POST["edit"] -1;
    $string = $comarr[$edc];
    $postcont = explode("<>",$string);
    echo($postcont[1]);
  }
   ?>" />
   <?php
   if(!empty($_POST["edit"])){
     echo('<input type="hidden" name="editedname">');
   }
   ?>
</p>
<p>
パスワード(投稿時に入力してください。削除や編集の際は、投稿時に登録したものを入力してください):
<input type="text"
name="<?php
    if(!empty($_POST["edit"])){
      echo("pass_ed");
    }else{
      echo("pass");
    }
    ?>"
size="10"
value ="<?php

/*
パスワード欄に入力された状態で編集ボタンを押すとそれを表示したままにする(ここも問題なし)
*/

if(!empty($_POST["edit"]) && !empty($_POST["pass"])){
  echo($_POST["pass"]);
}
?>"/>
 <?php
 if(!empty($_POST["edit"])){
   echo('<input type="hidden" name="editedpass">');
 }
 ?>
</p>
  <p>
  <input type="submit" value="送信"><input type="reset" value="クリア">
  </p>

  <p>
  コメントを削除する(コメント番号を半角数字で入力してください):
  <input type="text" name="delete" size="4"><input type="submit" value="削除"></br>
  コメントを編集する(コメント番号を半角数字で入力してください):
  <input type="text"
   name="<?php
     if(!empty($_POST["edit"])){
       echo("edit_ed");
     }else{
       echo("edit");
     }
   ?>"
   size="4"
   value="<?php
  if(!empty($_POST["edit"])){
    echo($_POST["edit"]);}
   ?>" />
   <?php
   if(!empty($_POST["edit"])){
     echo('<input type="hidden" name="edited">');
   };
   ?>
<input type="submit" value="編集">
</p>
  </form>

<?php

$eccom = "";
$comarr = file("exam.txt");
/*
コメント、名前、パスワードが入力された状態でページを更新するとメモ帳に「番号<>名前<>コメント<>時間帯<>パスワード」のように記録される(1から開始)
番号を入力して削除ボタンを押した場合、当該番号のコメントが消される(実際は当該コメントを除外してtxtファイルを書き換えるという処理)
ここも問題なし
*/
  if(!empty($_POST["pass"]) && empty($_POST["edit"]) && empty($_POST["delete"])
    && (!empty($_POST["comment"]) && !empty($_POST["name"]))){
    $count = count($comarr)+1;

    $fp = fopen("exam.txt", "a");
    fwrite($fp, $count."<>".$_POST["name"]."<>".$_POST["comment"]."<>".date("o\年n\月j\日 G:i:s")."<>".$_POST["pass"].PHP_EOL);
    fclose($fp);

    for( $i = 0; $i < count($comarr); ++$i ) {
      $string = $comarr[$i];
      $postcont = explode("<>",$string);
    }
  }else if(!empty($_POST["delete"]) & empty($_POST["edit"]) & !empty($_POST["pass"])){
    $fp = fopen("exam.txt", "w");
    $count = 0;
      for( $i = 0; $i < count($comarr); ++$i ) {
        $string = $comarr[$i];
        $postcont = explode("<>",$string);
            if(($postcont[0] != $_POST["delete"]) && ($postcont[4] != $_POST["pass"])){
                fwrite($fp, ++$count."<>".$postcont[1]."<>".$postcont[2]."<>".$postcont[3]."<>".$postcont[4]);
      }
      }
      fclose($fp);
    }

    $comarr = file("exam.txt");
/*

コメント編集の部分

*/
    if(!empty($_POST["edit_ed"]) && !empty($_POST["pass_ed"])){
    $fp = fopen("exam.txt", "w");
    $count = 0;
      for( $i = 0; $i < count($comarr); ++$i ) {
        $string = $comarr[$i];
        $postcont = explode("<>",$string);
/*

問題の部分
&&の部分を||にすると片方が合っていれば成功、if文の後半部分をコメントアウトしても成功したが
前半部分をコメントアウトすると失敗するため、「&& (strcmp($postcont[4],$_POST["pass_ed"]) == 0)」に問題があると思われる

*/
      if((strcmp($postcont[0],$_POST["edit_ed"])==0) && (strcmp($postcont[4],$_POST["pass_ed"]) == 0)){
                fwrite($fp, ++$count."<>".$_POST["name_ed"]."<>".$_POST["comment_ed"]."<>".$postcont[3]."<>".$postcont[4]);
              }else{
                fwrite($fp, ++$count."<>".$postcont[1]."<>".$postcont[2]."<>".$postcont[3]."<>".$postcont[4]);
              }
      }
      fclose($fp);
    }
   ?>

/*
メモ帳の内容を表示
問題なし
*/
<?php
  $comarr = file("exam.txt");
  for( $i = 0; $i < count($comarr); ++$i ) {
    $string = $comarr[$i];
    $postcont = explode("<>",$string);
    echo($postcont[0].":".$postcont[2]." - ".$postcont[1].":".$postcont[3]);
    echo('<br />');
  }
?>

</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2017/10/10 01:32

    出ているエラーも提示ください。

    キャンセル

  • are_kore

    2017/10/10 01:46

    失礼しました。上部に追記いたしました。

    キャンセル

回答 1

checkベストアンサー

+2

ご質問の内容はexam.txtの内容も確認しないと挙動が特定できませんが、冒頭でexam.txtを新規作成する処理があること、fwriteの出力内容もみるに$postcont[4]はexam.txtの最終列となるものだと想定します。
そのため、おそらく$postcont[4]の値には改行コードが含まれており、strcmpでの比較に失敗しています。

簡単ですが、コメントの内容で作成したexam.txtで挙動を確認してみました。

<?php

$comarr = file("exam.txt");
/*
hoge<>fuga<>piyo<>mogu<>nurupo
aaaa<>bbbb<>cccc<>dddd<>eeee
*/

var_dump($comarr);

for( $i = 0; $i < count($comarr); ++$i ) {
   $string = $comarr[$i];
   $postcont = explode("<>", $string);

   var_dump($postcont);

   if((strcmp($postcont[0], "hoge")==0) && (strcmp($postcont[4], "nurupo") == 0)){
      print "--------\n";
      print "ga!\n";
      print "--------\n";
   }
   if((strcmp($postcont[0], "aaaa")==0) && (strcmp($postcont[4], "eeee\n") == 0)){
      print "--------\n";
      print "kitayo!\n";
      print "--------\n";
   }
}

出力結果は下記となりました。
PHP5.4.16、7.1.9で同じ挙動となることを確認しています。

array(2) {
  [0]=>
  string(31) "hoge<>fuga<>piyo<>mogu<>nurupo
"
  [1]=>
  string(29) "aaaa<>bbbb<>cccc<>dddd<>eeee
"
}
array(5) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(4) "fuga"
  [2]=>
  string(4) "piyo"
  [3]=>
  string(4) "mogu"
  [4]=>
  string(7) "nurupo
"
}
array(5) {
  [0]=>
  string(4) "aaaa"
  [1]=>
  string(4) "bbbb"
  [2]=>
  string(4) "cccc"
  [3]=>
  string(4) "dddd"
  [4]=>
  string(5) "eeee
"
}
--------
kitayo!
--------

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/10 09:26

    ありがとうございました、まさにこの部分でした!
    改行も含まれてしまうのですね…覚えておきます。

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    php初心者です。issetの使い方がよくわかりません。

    issetをつかって、名前とコメントを入力したときと、空白のときで、働くプログラムを変更したいのですが、やり方がよくわかりません。 該当のソースコード <form acti

  • 解決済

    PHP:パスワードが一致したときのみ、投稿の削除をする簡易掲示板

    パスワードが一致したときの条件式をプログラムに書いても反応しません。/ファイル消去/ブロックの6行目あたりにあるif文のandの右側の条件式です。この式で使われている$delDat

  • 解決済

    php 掲示板の消去機能

    ```php コード <?php ini_set('display_errors', 1); error_reporting(E_ALL); date_defa

  • 解決済

    php 簡易掲示板の編集

    実現したいこと 簡易掲示板について。 テキストと送信ボタンがある掲示版を扱います。 フォームを送信すると、別に用意したテキストファイルに内容が保存され、そこから読みだされた内

  • 解決済

    PHP 掲示板 編集機能について

    プログラミング初心者です。 今はphpについて勉強しています。 そして、PHPで簡易掲示板を作成しています。 <入力フォーム> <form action="" meth

  • 受付中

    phpでの掲示板編集機能について

    現在phpを用いた掲示板を作成しているのですが、指定した番号のコメントを編集する機能がどうしても実装できません。 改善点を教えて頂けると嬉しいです。 <html> <body>

  • 受付中

    php 掲示板投稿番号

    前提・実現したいこと phpで簡易的な掲示板を作成しています。 発生している問題・エラーメッセージ テキストファイルに<投稿番号、名前、コメント、投稿時刻>を入力したいのですが

  • 解決済

    PHPで入力フォームのエラーを一気に出さないようにするにはどうしたら良いでしょうか?

    PHPで入力チェックを行っています。 新規登録フォームで空欄のまま、送信ボタンを押すとエラーが表示されるように実装しました。 しかし、エラー表示の下の3つまで表示されてしまいます

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

  • PHP

    19153questions

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