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

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

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

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

Q&A

解決済

1回答

1927閲覧

ブラウザとteratermで違う結果が出る

slimat

総合スコア57

PHP

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

0グッド

0クリップ

投稿2018/07/24 04:01

前提・実現したいこと

私は今オノマトペで検索するとそのオノマトペに対応した画像が出てくるというシステムを作っています。
しかし、次のバグに困っています。
phpのisset関数を使うとブラウザとteratermで違う結果が出ます。
具体的には、if分で条件にissetを使うと、ブラウザではtrueの結果が、teratermではfalseの結果が出ます。
システムの流れは、index2.htmlから送られてきたオノマトペをserch.phpで受け取るという形です。

teratermでphpコマンド使った結果(最後の行にfalseの部分でechoされたものが出力されています)

PHP Notice: Undefined variable: enterOnomatope in /home/sys/s216045/public_html/md_syn/serch.php on line 62 PHP Stack trace: PHP 1. {main}() /home/sys/s216045/public_html/md_syn/serch.php:0 を受け取りました <p>オノマトペがserch.phpに届きませんでした</p>

該当のソースコード

index2.htmlのフォーム部分

html

1 <form action="serch.php" method="post" type="text"> 2 <input type="text" name="onomatopeSerch" placeholder="オノマトペを入力"> 3 <input type="submit" name="serch" value="検索"> 4 </form>

serch.php前文は以下です
javascriptのちょっと下の、if (isset($enterOnomatope)) のif文が問題のif文です。ブラウザでは一行下の"ちゃんとオノマトペは届いてるよ"の文が画像のように出力されています。しかし、上のようにteratermではfalseの部分でechoされた"<p>オノマトペがserch.phpに届きませんでした</p>"が出力されています。

php

1<?php 2// 元々はindex.phpにあったコードをこちらに埋め込んでいることに注意! 3// カウント数取得関数 4if (isset($_POST["onomatopeSerch"])) { 5 $enterOnomatope = $_POST["onomatopeSerch"]; //変数にそのオノマトペを代入 6} 7function get_count($file) { //sectionタグからファイル名(拡張子なし)を引数にして送られてくる 8 // $res = $_POST["onomatopeSerch"]; 9 global $enterOnomatope; 10 mkdir("data/$enterOnomatope"); //オノマトペごとのdatファイル格納フォルダ作成 11 $filename = "data/$enterOnomatope/".$file.'.dat'; //カウント数が記入されているファイルのパスを代入 12 $fp = @fopen($filename, 'r'); //そのファイルを開く作業を変数に代入? 13 if ($fp) { 14 $vote = fgets($fp, 9182); //変数に前回までに押された回数を代入 15 } else { 16 touch("$filename"); 17 $vote = 0; //php部分で送られたファイル名のファイルがなかったら投票数は0 18 } 19 return $vote; 20} 21?> 22<!DOCTYPE html> 23<html lang="ja"> 24<head> 25 <meta charset="utf-8"> 26 <link rel="stylesheet" href="css/style.css"> 27 <meta name="viewport" content="width=device-width, initial-scale=1"> 28 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 29 <script> 30 $(function() { 31 allowAjax = true; 32 $('.btn_vote').click(function() { //class名は絶対これ 33 if (allowAjax) { 34 allowAjax = false; 35 $(this).toggleClass('on'); 36 var id = $(this).attr('id'); 37 $(this).hasClass('on') ? Vote(id, 'plus') : Vote(id, 'minus'); //vote関数に送ってる 38 } 39 }); 40 }); 41 function Vote(id, plus) { 42 cls = $('.' + id); 43 cls_num = Number(cls.html()); 44 count = plus == 'minus' ? cls_num - 1 : cls_num + 1; 45 $.post('vote.php', {'file': id, 'count': count}, function(data) { //postでvote.phpにたぶん送っている 46 if (data == 'success') cls.html(count); 47 setTimeout(function() { 48 allowAjax = true; 49 }, 1000); 50 }); 51 } 52</script> 53</head> 54<body> 55 <article> 56 <?php 57 // if (isset($_POST["onomatopeSerch"])) { 58 // $enterOnomatope = $_POST["onomatopeSerch"]; //変数にそのオノマトペを代入 59 // } 60 // global $enterOnomatope; 61 $aa = "を受け取りました"; 62 echo $enterOnomatope."$aa\n"; 63 if (isset($enterOnomatope)) { //オノマトペが届いてたら 64 echo "ちゃんとオノマトペは届いてるよ\n"; 65 $dir_s = "onomatopes/$enterOnomatope/"; //そのオノマトペのタイトルのフォルダの中身を示すパスを代入 66 $filelist = scandir($dir_s); //上記のフォルダの中身を代入、scandirでファイル名(ファイルのパスかも)を取得できる 67 $count = count($filelist); //そのフォルダに含まれるファイルの数を代入 68 $a = 0; 69 for ($j = 0; $j < $count; $j++) { //jpgファイルの数を知りたい 70 $file = pathinfo($filelist[$j]); //指定したフォルダに含まれるj番目のファイルの情報を代入 71 $file_ext = $file["extension"]; //そのファイルの拡張子を代入 72 if ($file_ext == "jpg") { 73 $a = $a + 1; //拡張子が"jpg"だったら1を足す 74 } else { 75 $a = $a; //そのまま 76 } 77 } //for分の終わり 78 echo "<p>拡張子がjpgのファイル数 == $a</p>"; 79 80 if (file_exists("onomatopes/$enterOnomatope")) { //入力されたオノマトペをフォルダ名にしてるフォルダがあれば && !(is_dir($file_path)) 81 82 for($i = 0; $i<$count; $i++) { //対象フォルダにあるファイルの数だけループ 83 $file = pathinfo($filelist[$i]); //指定したフォルダに含まれるi番目のファイルの情報を代入、こっちの方にも$filelistもってきたほうがいいのか 84 // $file_name=$file["basename"]; 85 $file_extension = $file["extension"]; //そのファイルの拡張子を代入 86 $file_path = "onomatopes/$enterOnomatope/$filelist[$i]"; //i番目のファイルのパスを代入 87 if ($file_extension == "jpg") { //拡張子がjpgだったら 88 echo "<section>"; 89 echo "<p><img src=\"$file_path\" width=\"300px\"></p>"; //i番目のファイルがjpgファイルだったら表示 90 echo "<div class=\"btn_area\">"; 91 echo "<h2>$enterOnomatope</h2>"; 92 echo "<p class=\"ico_heart count_".$i."\">"; //get_countに「いいね」の数が記入されているファイル名(拡張子抜き)を送信 93 get_count("count_$i"); //semi coronn 94 echo "</p>"; 95 echo "<p class=\"btn_vote\" id=\"count_$i\"></p>"; //JavaScript部分にidを送ってる? idはファイル名にも使用される 96 echo "</div>"; 97 echo "</section>"; 98 } 99 } //for分の終わり 100 101 } else { //該当する画像はありません 102 echo "<p>sorry,couldn't find you asked(there is no such directory. 103 so let's upload image with onomatope you entered!!)</p>\n"; 104 } 105 106 } else { 107 echo "<p>オノマトペがserch.phpに届きませんでした</p>\n"; 108 } 109 ?> 110 </article> 111 <a href="index2.html">return to index2.html</a> 112</body> 113</html> 114

イメージ説明

補足情報

5.5.30がphpのバージョンです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/24 04:09

phpが複数バージョン組み込まれていて、webサーバーが利用するものと、コンソールから利用するものが違う、ということはありませんか?
slimat

2018/07/24 04:11

大学の環境でやってるんですが、あるかもしれません。
m.ts10806

2018/07/24 04:13

teratermからPOST送信ってできましたっけ。私が知らないだけかもしれませんけど。。
otn

2018/07/24 05:06

「teratermで」とは具体的にどうやって動かしていますか?
slimat

2018/07/24 05:07

teratermでphpコマンドを使って「php serch.php」と入力しました。
otn

2018/07/24 05:10

?いったい$_POSTにはどうやって値を与えたつもりですか?
slimat

2018/07/24 05:14 編集

htmlのformタグからnameをonomatopeSerchにして、serch.phpに送って、serch.phpでは上から4行目のif (isset($_POST["onomatopeSerch"])) { $enterOnomatope = $_POST["onomatopeSerch"];}で受け取ったつもりです。
otn

2018/07/24 05:18

?それはブラウザから動かした場合のことでは?コマンドラインの場合、そのHTMLとsearch.phpをどうやって関連づけたつもりですか?
m.ts10806

2018/07/24 05:20

ああ、やっぱり。POST送信自体はブラウザからのリクエストなのでターミナル上からは基本送れませんよ。
slimat

2018/07/24 05:21

ブラウザ上でフォームに実際に文字列を入力してserch.phpの画面が出てきたら、teratermでphpコマンドで確認するという形です。
m.ts10806

2018/07/24 05:23

あと、前から気になってましたが、意図的でないならスペルはちゃんとされた方が良いです。 serchではなくsearchです。
m.ts10806

2018/07/24 05:24

ブラウザとターミナルは同じセッションではないので、その方法ではブラウザからのpost送信は確認できません。
slimat

2018/07/24 05:24

そうなんですか!それだと、自分がやってたのは無意味でしたね 汗
slimat

2018/07/24 05:26

すいません。普通に間違えてました。
otn

2018/07/24 05:38

「ブラウザ上でフォームに実際に文字列を入力してserch.phpの画面が出てきたら、teratermでphpコマンドで確認するという形です。」で関連づけられたと思う想像力が不思議です。プログラムにはテレパシー能力はありません。
slimat

2018/07/24 06:01

teratermを使う時にサーバー名を入力するので、繋がってるのかなと思ってました。
m.ts10806

2018/07/24 06:04

その理屈だと別のPCから同じサーバーにアクセスしても片方のpost送信を他方で確認できることになります。ブラウザも別のブラウザであれば別セッションです。
slimat

2018/07/24 06:39

僕の考えだと他人の検索履歴が見れてしまうってことですか?
m.ts10806

2018/07/24 06:48

ちょっと飛躍しすぎましたね。要は別セッションなので同じ箇所にアクセスしてもそれぞれ独立して動いてるということで、理解してください。例に出してますが同じPCでも別のブラウザであれば、別のアクセスです。何も連携はされていません。
slimat

2018/07/24 06:58

なるほど、分かりました。ご教授ありがとうございました。(_ _)
otn

2018/07/24 07:09

「同じ大学に通っている学生同士だから知り合いに決まっていて、情報共有しているにちがいない」という考えになりますね。
guest

回答1

0

ベストアンサー

teratermでphpコマンド使った結果

ブラウザからhttpベースで接続した場合と、phpをCLIモードで実行するのは
環境が違うので一致させることはそれなりに面倒です。

もしやるならシェルからwgetなどクローラー経由でhttpベースで
処理するのが良いと思います

投稿2018/07/24 04:14

yambejp

総合スコア114843

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

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

slimat

2018/07/24 04:18 編集

初心者なので、理解できてないですが、回答有難うございます。勉強して、理解できるように頑張りたいと思います。
yambejp

2018/07/24 04:19

単純にPHPをコマンドラインから動かすのはやめたほうがいいという話です。 (それ専用に作ってあるなら別ですが)
slimat

2018/07/24 04:23

そうなんですね!教えてくださった方法を試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問