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

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

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

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

Q&A

解決済

4回答

136閲覧

SESSIONを使わずにボタンをクリックすると値を変化させる方法

totomotomohiro

総合スコア11

PHP

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

0グッド

0クリップ

投稿2019/07/12 05:21

SESSIONを使わずにボタンをクリックすると値を変化させる方法を
ご助言いただけませんでしょうか?

PHPの学習の一環でカレンダーを作っています。
SESSIONを使えば作ることができたのですが、
次のチャレンジでSESSIONを使用しないで作ってみようと思っています。

取得する値を変化させてカレンダーに反映させたいです。

例えば、以下の出力値からボタンをクリックするごとに2018,2017と数字を変えて
該当月のカレンダーを表示させるための値に使用します。

2019

該当のソースコード

PHP

1<?php 2$year = 2019; 3 4function lastYear() { 5 $year -= 1; 6} 7 8if(isset($_POST["last_year"])){ 9 $year -= 1; 10} 11echo $year; 12?> 13 14<form method="POST"> 15 <input type="submit" name="last_year" value="昨年" > 16</form>

試したこと

$yearの値を変えてボタンをクリックすると、値が変化するのですが、
2回目以降のクリックでは値が変化しないことから$yearが初めの定数に縛られているのではないかと考えています。

以下のような記述により$yearが固定されないのではないかと試してみたのですが、
変化なしでした。

if (!isset($year)) { $year = date(Y); }

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

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

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

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

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

guest

回答4

0

ベストアンサー

php を使用した際のページをまたいでの情報のやり取りは
・session
・cookie
・POST/GET
を利用することになります。

この書き方の延長線上で考えると POST + hidden が一般的かなぁ。。。

投稿2019/07/12 05:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

totomotomohiro

2019/07/12 05:44

回答いただきありがとうございます。 まだ、Cookieの使い方を勉強する段階なので、 Cookieからやってみます。
m.ts10806

2019/07/12 05:56

私ならGET/hiddenですね。 「その年だけ狙って表示したい(リンクでも使いたい)」ときに有用です。
退会済みユーザー

退会済みユーザー

2019/07/12 06:00

あー。確かにw 今見えてる範囲だと、GET/hidden の方が適切だね。
totomotomohiro

2019/07/12 06:08

GET/hiddenの方はやり方を調べるところからですが、 試してみます。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/07/12 06:21

コード的には method を切り替えるだけでほぼ流用可能です。 どちらかというと、POST/GET の意味合いのちがいが理解できたほうが、今後の設計に役立ちます。 *雑に言うと ・GETはなにかを取得するときに使うべきものです。 ・POSTはなにかを登録するときに使うものです。 雑な説明なのでちゃんと調べたほうが良いですw
totomotomohiro

2019/07/12 06:29

ありがとうございます。 取り急ぎCOOKIEに値をセットして試していますが、うまくいっていません。 setcookie("year","2019",time()+60*60); $_COOKIE["year"] 「2019」は入っていそうなのですが、 値を変えられません。 もう少しトライしてみます。 GET/POTについて説明ありがとうございます。 こちらも調べてみます。
退会済みユーザー

退会済みユーザー

2019/07/12 06:36

cookie の挙動は、ブラウザの開発ツールを使うと追いかけやすくなります。 がんばって。
totomotomohiro

2019/07/12 06:50

ありがとうございます。 以下のコードにしたら、動くことは動いたのですが、 あまり美しくないような気がしています。 何度もcookieを生成するような感じです。 cookieの保持時間を短くすればいいようにも思いますが、 setcookie("year","2019",time()+60*60); function lastYear() { $_COOKIE["year"] -= 1; $n = $_COOKIE["year"]; setcookie("year","$n",time()+60*60); echo $_COOKIE["year"]; } 元の質問のところのif文の中にlastYear();を入れるつもりでしたが、 書き間違えています。すみません。
退会済みユーザー

退会済みユーザー

2019/07/12 07:04

たしかにきれいじゃないですね^^; 余分なことをいろいろやっているので、フローを図に書いて整理してみると良いです。 *まぁ、今の段階できれいに書くことに注力する必要は無い気がしますが、最初の setcookie だけは、条件分岐の中に取り込んでしまったほうが良いですね。
totomotomohiro

2019/07/12 07:21

たびたびコメントいただきありがとうございます。 まずは表題の目的は果たしたので、ベストアンサーさせていただきますね。 お付き合いいただきありがとうございます。 また、コードの無駄についてもまだまだ勉強不足なので、精進します。
guest

0

普通こんな書き方になるのでは?

PHP

1<?PHP 2print_r($_POST); 3?> 4<form method="POST"> 5<button "submit" name="year" value="2018">昨年</button> 6<button "submit" name="year" value="2020">来年</button> 7</form>

投稿2019/07/12 05:43

yambejp

総合スコア114777

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

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

totomotomohiro

2019/07/12 06:10

ありがとうございます。 そのような書き方が普通なのですね。 今後の表記に利用させていただきます。
guest

0

$yearが初めの定数に縛られているのではないかと考えています。

はい、PHPの変数はページ生成ごとにリセットされます。それを継続させるのがセッションです。

セッションをあえて使わないなら、Cookieに保存するというような方法もあるかとは思います。

投稿2019/07/12 05:26

maisumakun

総合スコア145183

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

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

totomotomohiro

2019/07/12 05:33

早速ご助言いただきありがとうございます。 セッションの理解も進みました。 Cookieの使い方から勉強してやり直してみます。
guest

0

意見だけ言って何も書かないのは失礼かなと思い、コメントにしたGET/hiddenパターンを書いてみました。

php

1<?php 2$year = $_GET['last_year'] ?? date("Y"); 3?> 4<!DOCTYPE html> 5<html lang="ja"> 6<head> 7<meta charset="utf-8"> 8</head> 9<body> 10 <?=$year?>11 <form method="GET"> 12 <input type="hidden" name="last_year" value="<?=intval($year)-1?>"> 13 <button><?=intval($year)-1?></button> 14 </form> 15</body> 16</html>

※PHP7以降の新機能NULL合体演算子を利用していますのでご注意を
※とりあえず動くものということでHTMLエスケープとかはしてません。
※分かりやすくするためラベルを変えています。
※もしカレンダー作るならecho時に-1しているところは変更してください。」
-1と単に引くよりもdate()関数使って-1 yearのほうが適切です

投稿2019/07/12 07:05

編集2019/07/12 07:06
m.ts10806

総合スコア80850

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

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

totomotomohiro

2019/07/12 07:22

こ、これはすごい。。 ありがとうございます。 こちらの表記の仕方も理解できるように頑張ってみます。
m.ts10806

2019/07/12 07:23

やっていることはシンプルなので各機能についてPHPマニュアルで調べながら理解すると良いと思います。
totomotomohiro

2019/07/12 07:26

ありがとうございます。 カレンダーというシンプルなものだけで理解するものがたくさんあって とても勉強になります。 一つずつ積み上げるように機能を確かめながら模写してみます。
m.ts10806

2019/07/12 07:32 編集

自力で作るのも良いですが、DateTimeクラスやそちらを利用したライブラリであるCarbonを使うと日付関係の処理が少し楽になると思います。 DateTime クラス:https://www.php.net/manual/ja/class.datetime.php Carbon:https://carbon.nesbot.com/docs/ ↑のQiitaの紹介記事:https://qiita.com/yudsuzuk/items/ff894bd0b76d4657741d ※いずれにしてもdate()関数のフォーマットについては理解が必要です https://www.php.net/manual/ja/function.date.php
totomotomohiro

2019/07/12 07:50

たくさんの情報ありがとうございます。 簡単にパーツを組み合わせられるよう頑張ってみます。 根本の理解ができていないといけませんね。
m.ts10806

2019/07/12 08:01

そうですね。 「根本」をどこに置くかにもよるのですが、 結局は仰っているように「パーツを組み合わせられるように」というところ いわゆる「ロジック」が大事です。 書いたようにしか動かないのがプログラムですが、 目的を達成するための手段は1つではないので、色々な手段を考えて実現させていく訓練をすると良いかもしれません。 (例えば画面に「test」と出力するだけのプログラムを何通りのやり方で書けるか、とか。より複雑に書けるようになるとそれだけ地力がついているということになります)
totomotomohiro

2019/07/12 08:15

testを出力するだけでも少数の方法は浮かびますので、 今回はカレンダーでやってみていますが、 それこそ無数にやり方がありそうですね。 自分の書き方が全然だということがより実感できました。 マニュアルを読み直すと恐らく自分の無駄な部分ができると思いますので、 頑張ってみます。
m.ts10806

2019/07/12 08:18

カレンダーはロジック力をあげるには非常に良い課題と思います。 表示の仕方も1週間表示にするとか月表示にするとか日めくりとか 月表示にしても縦に全部並べたり日曜始まりの1週間で表組にしたり、 祝日入れたり(これはライブラリ利用したほうがいいですが) 予定を入れたり、予定も期間予定にするとグッと難易度が上がりますしね。 1つずつやっていくと良いと思います。
totomotomohiro

2019/07/12 08:30

できそうなことが無数にでてきますね。 今週からPHPの勉強を始めたところで、 progateからやって理解度確認にカレンダーを作っています。 手始めにボタンで月移動する月次カレンダーをSESSION使ったらなんとかできて、今度は土日の色を付けたり、今日の色を変えたりです。 祝日は無理やり日にち配列を作って色を変えてます。。 期間予定に至っては今のところまったく方法が浮かびませんが、 手元のところから積み上げていく感じて挑戦してみたいと思います。 ありがとうございます。 頭パンク状態です。でも楽しいので続けられそうです。
m.ts10806

2019/07/12 08:44

あぁごめんなさい。一気に情報流し込みすぎましたね でもモチベーションは力になりますので、できることから1個ずつやっていくようにしてください。 PHPマニュアルを辞書替わりに使えるようになるだけでも成長度合いが全然違います ※PHPマニュアル避けている人は大体ずっと質問者のままです・・
totomotomohiro

2019/07/12 13:14

ありがとうございます。 PHPマニュアルを活用しながらプログラミングができるよう 少しずつ読み解いていきたいと思います。 丁寧にご対応いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問