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

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

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

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

Q&A

解決済

2回答

1002閲覧

phpの条件分岐がうまくいきません…

mameo

総合スコア13

PHP

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

0グッド

0クリップ

投稿2019/03/02 07:09

編集2019/03/02 11:27

前提・実現したいこと

8桁の数字を入力して、それが他のファイル(list.txt)に羅列してある8桁の数字のどれかに該当したら「成功」という文字を送り、ファイルのその数字部分を消去する。

発生している問題

数字が合っているのに条件分岐が成功せず、「失敗」という文字が文字化けして送られてきます。

該当のソースコード

php

1<?php 2 3$pass = $_GET["pass"]; 4 5//ファイルの名前 6$file = "list.txt"; 7$num = "0"; 8$full = count( file( $file ) ); 9$result = "失敗"; 10 11a: 12 13//一行ずつ読み取り 14$hoge = file($file); 15$data = $hoge[$num]; 16 17//行数読み取りが末尾まで言ったら終了 18if ($num == $full) { 19 goto end; 20} 21 22//パスワード判定 23if ($data === $pass) { 24//パスワード一致、該当行削除 25 unset($file[$num]); 26 $result = "成功!"; 27 goto end; 28} else { 29//一致しない 30 $data = NULL; 31 $num++; 32 goto a; 33} 34 35 36end: 37echo $result; 38 39?>

試したこと

1.入力した数字が正しく送られていることを確認。
2.比較する数字(ファイルの数字)が正しく読み取られており、入力した数字と等しいことを確認。
試しに、入力数字=99999999、比較数字=99999999
と入力して絶対に「成功」が送られてくると思ってやってみたのですが、「失敗」という文字が送られてきました。

###追記

phpのバージョンは、PHP7.0.x。
参考にしたサイトはこちらです↓
http://php.net/manual/ja/control-structures.goto.php

問題とかではないです笑
用途を説明しますと、趣味のゲーム制作で、サーバーを介した遊びができるようになりたくて練習しています。
なので、$_GETで送信しているコード…なのかはわかりませんが、ゲーム側で「URL?pass=変数」のような感じで送信できています。ちなみに、制作使用ツールは「WOLF RPG エディター」です。

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

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

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

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

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

m.ts10806

2019/03/02 07:58

gotoってまだ生きてたんですね。 このコードは非常に謎の多いコードなのですが何を参考にされたのでしょうか? phpのバージョンはなにでしょうか? 文字化けはまた次の段階ですね。
m.ts10806

2019/03/02 07:59

あと $_GETで送信されている入力フォーム側のコードもご提示ください
m.ts10806

2019/03/02 08:01

質問は編集できるので適宜追記していただきたいのですが、「初心者アイコン」が質問につけられるので、タイトルや本文からは削ってください。初心者かどうかは要件とは関係ありませんので。
退会済みユーザー

退会済みユーザー

2019/03/02 08:26

どこかの転職サイトのスキルチェック問題じゃないよね? 本当に学習用?(念の為)
guest

回答2

0

ベストアンサー

コード内で使用している変数を var_dump() を駆使して内容を確認するところから試してください。

アドバイスを付け加えるならば、

1)file()の仕様を確認してください。
PHP: file - Manual
指定されたファイルから読み取って、指定の配列に格納するのだけど、
フラグを適切に設定しないと格納したデータに改行コードがついて回ります。
つまり、
$hoge = file($file);
は$hogeに配列に改行コード付きで格納されてます。
$hoge = file($file, FILE_IGNORE_NEW_LINES);
などとすれば改行コードを自動的に省いてくれます。

2)総当たりするときはgotoよりもforeach()使う。
PHP: foreach - Manual
例えば

php

1foreach ($hoge as $item) { 2 ~~~~ 3}

みたいにすれば、配列$hogeに格納されている値を順に$itemに代入されて繰り返されます。
ぶっちゃけ、goto依存するコードは構造が悪いです。
繰り返し実行する制御構文をマスターしてください。
しかし、今回の事例では、実は繰り返し実行しなくても処理できてしまう便利な関数があります。
PHP: array_search - Manual
改行コードなしに配列にデータファイルから読み取って格納されている前提で、
この関数一発であるかないか判定できます。
PHP: array_splice - Manual
この関数を使えば、指定の位置の要素を削除したり、削除した位置の別のデータを詰めることもできます。
もしもこの関数でヒット後のデータを削除するなら、
さっきのarray_search()の結果で得られたキーが使えるはずです。
配列を加工したらデータファイルに書き出すのをお忘れなく。

3)文字化けで応答が返るのは、エンコーディングのミスではないか。
例えばWindows上で一般的に使われているのがShiftJISに機種依存文字を加えたCP932とかSJIS-winというものですが、
一般的にwebサーバー上で動かすときのエンコーディングはUTF-8(のなかのBOMなし)というものです。
ファイルを保存するときどのエンコーディングを使っているかを確認し、
もしもSJISとかだったらUTF-8にしてみてください。

投稿2019/03/02 08:43

編集2019/03/02 12:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mameo

2019/03/03 06:16

無事処理が思った通りに成功しました!! 大きな原因は、m6uさんの言っていたように格納したデータが改行コード付きで送られていたことでした。 それを修正した後にもデータの書き出しを忘れていたのを修正。 文字化けについては、私の使用するサーバーには3種類のエンコーディングしか無かったので、結果を英語で送信することにしました。 しかし、foreach、arrayなどは何度も試したのですがどうしてもうまくいかず、マスターするまではgotoを使うことにしました…。これから勉強していきたいと思います! わかりやすい説明をしていただき、大変助かりました。ありがとうございます!
guest

0

投稿2019/03/02 09:09

m.ts10806

総合スコア80850

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

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

mameo

2019/03/03 06:21

初心者アイコン、あんなに見やすい位置にあったのに見落としていました…。 gotoが禁止されていたとは知らず、かなり見づらいコードを書いてしまっていたと気づきました。大変申し訳ありません! 私の使用しているゲーム制作ツールにgotoと似た処理があるので、使いやすく感じてしまっていたようです…。 これからコードの古さや見辛さなどを考えて、phpを勉強して行きたいと思います。ご指摘、ご回答いただきありがとうございます!
m.ts10806

2019/03/03 07:16

禁止と言いましても現場レベルの話ではあります。 「個人レベルなら自己責任で」という感じですかね。でも一般的に使う人はいません。 それだけアンチパターンと言ってもいいかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問