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

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

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

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

Q&A

解決済

1回答

211閲覧

GETのstr_replace変換について

64orenji

総合スコア12

PHP

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

0グッド

1クリップ

投稿2018/04/03 01:31

別スレのカウント処理について参考にやってみましたが、別問題に突き当たり解決方法が思い当たらないので再度失礼します。
https://teratail.com/questions/119574

※適切な題名が思いつかなかったのでGETのstr_replace変換についてにしています。

前提・実現したいこと

以下の発生している問題で+1追加ボタンをクリックすると①を挟まず、いきなりそのまま②に移りたい。

ボタンを押したら①→②ではなく
ボタンを押したらいきなり②といった形です。

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

初期値を0として

+1追加ボタンをクリックすると最初に
①index.php?action=remove&month=%7Bmonth%7D
が表示される。

さらにクリックすれば、正常。
②index.php?action=remove&month=01
になる。

以降ボタンクリックするたびにindex.php?action=remove&month=数字
※数字がカウントされる。

該当のソースコード

PHP

1config.php 2 3define("EXPLODE","<explode>");

PHP

1function.php 2 3function explode_h($html_path){ 4 $html = file_get_contents($html_path); 5 $s_html = explode(EXPLODE, $html); 6 7 return $s_html; 8} 9 10function YearMonthChange($av_month,$s_html,$branch){ 11 12 $month = $av_month; 13 if(array_key_exists("month",$_GET) && ctype_digit($_GET["month"])){ 14 if($branch==='increase'){ 15 $month = $_GET["month"]+1; 16 }elseif($branch==='decrease'){ 17 $month = $_GET["month"]-1; 18 } 19 } 20 $html = $s_html[4]; 21 $html = str_replace("{month}", $month, $html); 22 return $html; 23} 24 25 26

php

1index.php 2 for ($i = 0; $i < 6; $i++) { 3 $v_html[$i] = $s_html[$i];//s_htmlを雛型として読み込み、$v_htmlで加工 4 } 5$av_Year = date('Y');//今年 6$av_month= date('m');//今月 7 8$ActionGet = $_GET['action']; 9 10if (isset($ActionGet)) {//先月、今月、来月ボタンを押すまでは実行しない 11 if ($ActionGet === 'remove') { 12 $v_html[4] = YearMonthChange($av_month,$s_html,'decrease'); 13 14 } elseif ($ActionGet === 'add'){ 15 $v_html[4] = YearMonthChange($av_month,$s_html,'increase'); 16 17 } elseif ($ActionGet === 'nowMonth'){ 18 header('Location: index.php'); 19 exit(); 20 } 21 } 22}else{//今月表示処理 23}

html

1$v_html[4]の内容 2 3<explode> 4<form action="" method="GET"> 5<button type="submit" name="action" value="remove">先月</button> 6<button type="submit" name="action" value="nowMonth">今月</button> 7<button type="submit" name="action" value="add">来月</button> 8 9<input type="hidden" name="month" value="{month}"> 10 11</form> 12 13 14<explode>

試したこと

file_get_contentsを入れないコード(別スレ(URL先のコード内容通り))で発生している問題の①はないのですが、どうしてもfile_get_contentsを入れておきたいので解決方法が思いつきませんでした・・

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問についての回答です

PHPにおいてダブルクォーテーションの中では{}は変数を意味するような特別なものなので、置換用に使うのは微妙だなと思います。
私の場合は[]や@@などでを使っています。
いずれにしても{}使いたいのであればダブルクォーテーションではなくシングルクォーテーションを使うと良いです。

php

1$html = <<<EOF 2aaaaaaaa{test}@@@@@@ 3EOF; 4$test = "hogehoge"; 5 6echo str_replace('{test}',$test,$html); 7//出力結果:aaaaaaaahogehoge@@@@@@

やろうとしていることに関してのアドバイス的なものです

またおそらく日付の出力に関してかなり難しくやろうとしているように見えます。
(すみません前の回答でも質問者さんがやりたいことを私自身あまり理解できてなかったかもしれません)

私なりに理解した「おそらく質問者さんが実現したいこと」を回答としていますが、
もし、やろうとしていることと違ったらスルーしてください。

おそらく下記のようなことでしょうか(前回質問から カレンダーを作るということでしたので)
0. 今月 を押したら今月(今なら4月)へ
0. 次月 を押したら翌月(今なら5月)へ
0. 前月 を押したら前月(今なら3月)へ
0. 次月、または前月を押した場合はその月を「当月」として、前月、翌月を計算
(今が4月で前月を押して3月の場合、3月を「今月」として2月が前月、4月を次月とする)

date()関数の第2引数を利用すれば、簡単に「何ヵ月後」というのが算出可能なので、それを使えばもっと簡単にできるのでは、と思います。

php

1if(!isset($_GET["yearmonth"])){ 2 $year = date("Y"); 3 $month = date("m"); 4}else{ 5 $year = date("Y",strtotime($_GET["yearmonth"]."01")); 6 $month = date("m",strtotime($_GET["yearmonth"]."01")); 7} 8 9//今月と違ったら今月リンク挿入 10$thismonthLink = ""; 11if($year.$month != date("Y").date("m")){ 12 $thismonthLink = '<a href="index.php?yearmonth='.date("Y").date("m").'">今月</a>'; 13 14} 15//前月 16$lastyear = date("Y",strtotime($year.$month."01"." -1 month ")); 17$lastmonth = date("m",strtotime($year.$month."01"." -1 month ")); 18//次月 19$nextyear = date("Y",strtotime($year.$month."01"." +1 month ")); 20$nextmonth = date("m",strtotime($year.$month."01"." +1 month ")); 21 22 23echo <<<EOF 24<a href="index.php?yearmonth={$lastyear}{$lastmonth}">前月</a> 25{$year}{$month}26{$thismonthLink} 27<a href="index.php?yearmonth={$nextyear}{$nextmonth}">次月</a> 28EOF; 29

投稿2018/04/03 02:04

編集2018/04/03 02:22
m.ts10806

総合スコア80850

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

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

m.ts10806

2018/04/03 02:17

この回答、質問に答えてないですね^^; 質問に対する回答も追記しますので少々お待ちください。
64orenji

2018/04/03 02:26

コード入力ありがとうございます。 mts10806様の1~4まで考えて頂いた通りです。 回答内容としては、少々違うかもしれませんがロジックが特に参考になります。 私の一番苦手なのがロジックなので・・ こちらのコード内容を参考にfile_get_contentsも加えて編集いたします。
m.ts10806

2018/04/03 02:31

いかに簡単に書くか を考える方が楽です。 プログラミング言語には効率的に書くための機能が沢山備わっていますし、 今回の日付関係のものはおおよそ出尽くしているようなものなので、 ちょっとした組み合わせで実は容易に実現可能だったりします。 おおよそ大きな流れを文章や図でまとめておき、 細かく落とし込む際にどのような機能・部品が使えるかを集めて 組み合わせていくようにすると楽になるかもしれません。 (その部品の集合体がオレオレフレームワークにつながっていくのですが、これはまた別の話) 今回色々とやろうとしていることですが、 SmartyやTwigといったPHPのテンプレートエンジンを利用すると置換の手間も省けて ロジックを書くことに集中できるようになると思います。 もちろん置換を含めて考えられるようになるのは素晴らしいことなのでそれはそれで頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問