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

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

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

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

Q&A

解決済

1回答

1909閲覧

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

are_kore

総合スコア12

PHP

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

0グッド

0クリップ

投稿2017/10/09 16:18

編集2017/10/09 16:44

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

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

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

PHP

1<?php 2header('Content-Type: text/html; charset=UTF-8'); 3 4if(!file_exists('exam.txt')){ 5 touch('exam.txt'); 6 chmod('exam.txt',0644); 7} 8?> 9<!DOCTYPE html> 10<html lang = “ja”> 11<head> 12<meta charset = “UTF-8”> 13<title>簡易掲示板</title> 14</head> 15<body> 16 17/* 18「コメントを編集する」欄に数値が入った状態で「編集」ボタンが押されてファイルが再読込されたら「編集モード」として各欄のnameとvalueが変わる仕組み 19具体的にはnameは名前欄のname→name_ed、コメント欄のcomment→comment_ed、という風に_edが付記される 20valueは編集予定のコメントが表示される(現在のところこの部分に不具合はない) 21*/ 22 <?php 23if(!empty($_POST["edit"])){ 24 echo("現在編集モードです"); 25} 26 ?> 27 28 29 <form action="exam.php" method="post"> 30 <p> 31 入力フォーム: 32 <input type="text" 33 name="<?php 34 if(!empty($_POST["edit"])){ 35 echo("comment_ed"); 36 }else{ 37 echo("comment"); 38 } 39 ?>" 40 size="40" 41 value="<?php 42 if(!empty($_POST["edit"])){ 43 $comarr = file("exam.txt"); 44 $edc = $_POST["edit"] -1; 45 $string = $comarr[$edc]; 46 $postcont = explode("<>",$string); 47 echo($postcont[2]);} 48 ?>"/> 49 <?php 50 if(!empty($_POST["edit"])){ 51 echo('<input type="hidden" name="editedcomment">'); 52 } 53 ?> 54 名前: 55 <input type="text" 56 name="<?php 57 if(!empty($_POST["edit"])){ 58 echo("name_ed"); 59 }else{ 60 echo("name"); 61 } 62 ?>" 63 size="10" 64 65 value="<?php 66 if(!empty($_POST["edit"])){ 67 $comarr = file("exam.txt"); 68 $edc = $_POST["edit"] -1; 69 $string = $comarr[$edc]; 70 $postcont = explode("<>",$string); 71 echo($postcont[1]); 72 } 73 ?>" /> 74 <?php 75 if(!empty($_POST["edit"])){ 76 echo('<input type="hidden" name="editedname">'); 77 } 78 ?> 79</p> 80<p> 81パスワード(投稿時に入力してください。削除や編集の際は、投稿時に登録したものを入力してください): 82<input type="text" 83name="<?php 84 if(!empty($_POST["edit"])){ 85 echo("pass_ed"); 86 }else{ 87 echo("pass"); 88 } 89 ?>" 90size="10" 91value ="<?php 92 93/* 94パスワード欄に入力された状態で編集ボタンを押すとそれを表示したままにする(ここも問題なし) 95*/ 96 97if(!empty($_POST["edit"]) && !empty($_POST["pass"])){ 98 echo($_POST["pass"]); 99} 100?>"/> 101 <?php 102 if(!empty($_POST["edit"])){ 103 echo('<input type="hidden" name="editedpass">'); 104 } 105 ?> 106</p> 107 <p> 108 <input type="submit" value="送信"><input type="reset" value="クリア"> 109 </p> 110 111 <p> 112 コメントを削除する(コメント番号を半角数字で入力してください): 113 <input type="text" name="delete" size="4"><input type="submit" value="削除"></br> 114 コメントを編集する(コメント番号を半角数字で入力してください): 115 <input type="text" 116 name="<?php 117 if(!empty($_POST["edit"])){ 118 echo("edit_ed"); 119 }else{ 120 echo("edit"); 121 } 122 ?>" 123 size="4" 124 value="<?php 125 if(!empty($_POST["edit"])){ 126 echo($_POST["edit"]);} 127 ?>" /> 128 <?php 129 if(!empty($_POST["edit"])){ 130 echo('<input type="hidden" name="edited">'); 131 }; 132 ?> 133<input type="submit" value="編集"> 134</p> 135 </form> 136 137<?php 138 139$eccom = ""; 140$comarr = file("exam.txt"); 141/* 142コメント、名前、パスワードが入力された状態でページを更新するとメモ帳に「番号<>名前<>コメント<>時間帯<>パスワード」のように記録される(1から開始) 143番号を入力して削除ボタンを押した場合、当該番号のコメントが消される(実際は当該コメントを除外してtxtファイルを書き換えるという処理) 144ここも問題なし 145*/ 146 if(!empty($_POST["pass"]) && empty($_POST["edit"]) && empty($_POST["delete"]) 147 && (!empty($_POST["comment"]) && !empty($_POST["name"]))){ 148 $count = count($comarr)+1; 149 150 $fp = fopen("exam.txt", "a"); 151 fwrite($fp, $count."<>".$_POST["name"]."<>".$_POST["comment"]."<>".date("o\年n\月j\日 G:i:s")."<>".$_POST["pass"].PHP_EOL); 152 fclose($fp); 153 154 for( $i = 0; $i < count($comarr); ++$i ) { 155 $string = $comarr[$i]; 156 $postcont = explode("<>",$string); 157 } 158 }else if(!empty($_POST["delete"]) & empty($_POST["edit"]) & !empty($_POST["pass"])){ 159 $fp = fopen("exam.txt", "w"); 160 $count = 0; 161 for( $i = 0; $i < count($comarr); ++$i ) { 162 $string = $comarr[$i]; 163 $postcont = explode("<>",$string); 164 if(($postcont[0] != $_POST["delete"]) && ($postcont[4] != $_POST["pass"])){ 165 fwrite($fp, ++$count."<>".$postcont[1]."<>".$postcont[2]."<>".$postcont[3]."<>".$postcont[4]); 166 } 167 } 168 fclose($fp); 169 } 170 171 $comarr = file("exam.txt"); 172/* 173 174コメント編集の部分 175 176*/ 177 if(!empty($_POST["edit_ed"]) && !empty($_POST["pass_ed"])){ 178 $fp = fopen("exam.txt", "w"); 179 $count = 0; 180 for( $i = 0; $i < count($comarr); ++$i ) { 181 $string = $comarr[$i]; 182 $postcont = explode("<>",$string); 183/* 184 185問題の部分 186&&の部分を||にすると片方が合っていれば成功、if文の後半部分をコメントアウトしても成功したが 187前半部分をコメントアウトすると失敗するため、「&& (strcmp($postcont[4],$_POST["pass_ed"]) == 0)」に問題があると思われる 188 189*/ 190 if((strcmp($postcont[0],$_POST["edit_ed"])==0) && (strcmp($postcont[4],$_POST["pass_ed"]) == 0)){ 191 fwrite($fp, ++$count."<>".$_POST["name_ed"]."<>".$_POST["comment_ed"]."<>".$postcont[3]."<>".$postcont[4]); 192 }else{ 193 fwrite($fp, ++$count."<>".$postcont[1]."<>".$postcont[2]."<>".$postcont[3]."<>".$postcont[4]); 194 } 195 } 196 fclose($fp); 197 } 198 ?> 199 200/* 201メモ帳の内容を表示 202問題なし 203*/ 204<?php 205 $comarr = file("exam.txt"); 206 for( $i = 0; $i < count($comarr); ++$i ) { 207 $string = $comarr[$i]; 208 $postcont = explode("<>",$string); 209 echo($postcont[0].":".$postcont[2]." - ".$postcont[1].":".$postcont[3]); 210 echo('<br />'); 211 } 212?> 213 214</body> 215</html> 216

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

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

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

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

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

kei344

2017/10/09 16:32

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

2017/10/09 16:46

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

回答1

0

ベストアンサー

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

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

php

1<?php 2 3$comarr = file("exam.txt"); 4/* 5hoge<>fuga<>piyo<>mogu<>nurupo 6aaaa<>bbbb<>cccc<>dddd<>eeee 7*/ 8 9var_dump($comarr); 10 11for( $i = 0; $i < count($comarr); ++$i ) { 12 $string = $comarr[$i]; 13 $postcont = explode("<>", $string); 14 15 var_dump($postcont); 16 17 if((strcmp($postcont[0], "hoge")==0) && (strcmp($postcont[4], "nurupo") == 0)){ 18 print "--------\n"; 19 print "ga!\n"; 20 print "--------\n"; 21 } 22 if((strcmp($postcont[0], "aaaa")==0) && (strcmp($postcont[4], "eeee\n") == 0)){ 23 print "--------\n"; 24 print "kitayo!\n"; 25 print "--------\n"; 26 } 27}

出力結果は下記となりました。
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/09 22:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

are_kore

2017/10/10 00:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問