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

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

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

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

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

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

Q&A

解決済

2回答

3024閲覧

URLから値を取得しMySQLの日付を取得する

58_ta2_9

総合スコア14

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

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

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

0グッド

0クリップ

投稿2019/12/10 07:18

編集2019/12/11 08:06

前提・実現したいこと

PHPでカレンダーと連携したTodoリストを作成中です。
ドットインストールの「PHPのDatetimeクラスでカレンダーを作ろう」と、「PHPでtodo管理アプリを作ろう」を参考に進めています。カレンダーの日付にDatetimeから取得したリンク(~/index_todo.php?s=年月日8桁)を作り、そこからTodo管理アプリにとべるようになっています。

Todo管理画面でsubmitをしたときに、URLのパラメータからデータベースのdateの値を取得したいです。$_GET['s']としてurlの値の取得ができるかと試しましたが以下のようなエラーメッセージが表示されました。
どうすればsubmit時にURLのパラメータからdateを取得できるでしょうか。
ご回答お願い致します。

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

PHP Notice: Undefined index: s in /home/vagrant/work_1_php/Todo/Todo.php on line 105

該当のソースコード

<Todo.php>

<?php namespace MyApp; // var_dump($_GET['s']); // exit; class Todo { private $_db; public function __construct() { $this->_createToken(); try { $this->_db = new \PDO(DSN, DB_USERNAME, DB_PASSWORD); $this->_db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); } catch (\PDOException $e) { echo $e->getMessage(); exit; } } private function _createToken() { if (!isset($_SESSION['token'])) { $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(16)); } } public function getAll() { $sql = sprintf("select * from todos where date = %d order by id desc", $_GET['s']); $stmt = $this->_db->query($sql); return $stmt->fetchAll(\PDO::FETCH_OBJ); } public function post() { $this->_validateToken(); if (!isset($_POST['mode'])) { throw new \Exception('mode not set!'); } switch ($_POST['mode']) { case 'update': return $this->_update(); case 'create': return $this->_create(); case 'delete': return $this->_delete(); } } private function _validateToken() { if ( !isset($_SESSION['token']) || !isset($_POST['token']) || $_SESSION['token'] !== $_POST['token'] ) { throw new \Exception('Invalid token!'); } } private function _update() { if (!isset($_POST['id'])) { throw new \Exception('[update] id not set!'); } $this->_db->beginTransaction(); $sql = sprintf("update todos set state = (state + 1) %% 2 where id = %d", $_POST['id']); $stmt = $this->_db->prepare($sql); $stmt->execute(); $sql = sprintf("select state from todos where id = %d", $_POST['id']); $stmt = $this->_db->query($sql); $state = $stmt->fetchColumn(); $this->_db->commit(); return [ 'state' => $state ]; } private function _delete() { if (!isset($_POST['id'])) { throw new \Exception('[delete] id not set!'); } $sql = sprintf("delete from todos where id = %d", $_POST['id']); $stmt = $this->_db->prepare($sql); $stmt->execute(); return []; } private function _create() { if (!isset($_POST['title']) || $_POST['title'] === '') { throw new \Exception('[create] title not set!'); } $sql = "insert into todos (title, date) values (:title, :date)"; $stmt = $this->_db->prepare($sql); $stmt->execute([':title' => $_POST['title'], ':date' => $_GET['s']]); return [ 'id' => $this->_db->lastInsertId() ]; } }
<sql> ``` create table todos ( id int not null auto_increment primary key, state tinyint(1) default 0, /* 0:not finished, 1:finished */ title text, date date ); ```

<index_todo.php>

<?php session_start(); require_once(__DIR__ . '/config.php'); require_once(__DIR__ . '/functions.php'); require_once(__DIR__ . '/Todo.php'); // get todos $todoApp = new \MyApp\Todo(); $todos = $todoApp->getAll(); // var_dump($todos); // exit; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Todos</title> <link rel="stylesheet" href="todo_styles.css"> </head> <body> <div id="container"> <h1>Todos</h1> <form action="#" id="new_todo_form"> <input type="text" id="new_todo"> </form> <ul id="todos"> <?php foreach ($todos as $todo) : ?> <li id="todo_<?= h($todo->id); ?>" data-id="<?= h($todo->id); ?>"> <input type="checkbox" class="update_todo" <?php if($todo->state === '1') { echo 'checked'; } ?>> <span class="todo_title <?php if($todo->state === '1') { echo 'done'; } ?>"> <?= h($todo->title); ?></span> <div class="delete_todo">×</div> </li> <?php endforeach; ?> <li id="todo_template" data-id=""> <input type="checkbox" class="update_todo"> <span class="todo_title"></span> <div class="delete_todo">×</div> </li> </ul> </div> <input type="hidden" id="token" value="<?= h($_SESSION['token']); ?>"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="todo.js"></script> </body> </html>

<todo.js>

$(function() { 'use strict'; $('#new_todo').focus(); // update $('#todos').on('click', '.update_todo', function() { // idを獲得 var id = $(this).parents('li').data('id'); // ajax処理 $.post('_ajax.php', { id: id, mode: 'update', token: $('#token').val() }, function(res) { if (res.state === '1') { $('#todo_' + id). find('.todo_title').addClass('done'); } else { $('#todo_' + id). find('.todo_title').removeClass('done'); } }) }); // delete $('#todos').on('click', '.delete_todo', function() { // idを獲得 var id = $(this).parents('li').data('id'); // ajax処理 if (confirm('are you sure?')) { $.post('_ajax.php', { id: id, mode: 'delete', token: $('#token').val() }, function() { $('#todo_' + id).fadeOut(800); }); } }); // create $('#new_todo_form').on('submit', function() { // titleを取得 var title = $('#new_todo').val(); // ajax処理 $.post('_ajax.php', { title: title, mode: 'create', token: $('#token').val() }, function(res) { // liを追加 var $li = $('#todo_template').clone(); $li .attr('id', 'todo_' + res.id) .data('id', res.id) .find('.todo_title').text(title); $('#todos').prepend($li.fadeIn()); $('#new_todo').val('').focus(); }); return false; }); });

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

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

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

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

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

guest

回答2

0

ベストアンサー

$_GETというのは、URLにくっついているパラメータ(?から始まる部分)を受け取る時に使います。

たとえば「test.com/index.php?hoge=1&fuga=2」というURLでindex.phpにアクセスがあったとき、index.phpの中で$_GET['hoge']と$_GET['fuga']が使えます。

また「test.com/index.php」というURLでindex.phpにアクセスがあったとき、URLには「hoge」も「fuga」もないので、$_GET['hoge']は使えず、表示されているエラーメッセージ「PHP Notice: Undefined index: 」が表示されています。

投稿2019/12/10 07:44

XNXSXMXR

総合スコア239

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

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

58_ta2_9

2019/12/10 08:15

ご回答ありがとうございます。 リンクはDatetimeで取得して ~/index_todo.php?s=年月日8桁 というurlでindex_todo.phpにアクセスできるようになっています。内容不足で申し訳ありません。
XNXSXMXR

2019/12/10 08:37

エラーが出ているのが105行目で、それはTodoクラスの「_create()」メソッドですよね。 この_create()メソッドを実行しているのが46行目の「post()」メソッドかと思います。 ブラウザで何かボタンを押すんでしょうか?index_todo.phpへPOSTする際のURLも、「index_todo.php?s=年月日8桁」になっていますでしょうか?
58_ta2_9

2019/12/10 13:25

ご返信ありがとうございます。 画面遷移なしでフォームを作っていたのですが、画面遷移ありで確認したところURLにパラメータが渡っておりませんでした。
guest

0

submitで自身に送信する場合、画面初期表示時に気を付ける必要があります。
初期表示時はindex_todo.phpのようにパラメータなしでアクセスしているはずです。
となれば想定されているパラメータであるsは送信されないので当然提示のNoticeが出ます。

「指定のパラメータがなかったら固定の初期値を設定する」分岐をひとつ入れると良いでしょう。
カレンダーなら本日日付とかがよく採用されますね。

投稿2019/12/10 07:43

m.ts10806

総合スコア80765

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

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

58_ta2_9

2019/12/10 08:19

ご回答ありがとうございます。 リンクはDatetimeで取得して ~/index_todo.php?s=年月日8桁 というurlでindex_todo.phpにアクセスできるようになっています。内容不足で申し訳ありません。 現在リンクにアクセスしパラメータがある場合にも記載したエラーが出ている状況です。
m.ts10806

2019/12/10 08:32

該当箇所手前で$_GETをvar_dumpすると何が出ますか?
58_ta2_9

2019/12/10 13:37

ご返信ありがとうございます。 var_dump($_GET['s'])を書き足しsubmitしたところ、noticeが消え、dateがnullのデータが追加されました。 また、画面遷移なしで作成しており気づかなかったのですが、遷移ありでURLを確認したところパラメータが入っておりませんでした。
m.ts10806

2019/12/10 14:00

いえ、 var_dump($_GET); です。出ているNoticeからすれば「配列にどんな情報が含まれているか」を調べるのが定石です。 キーを指定するメリットはあまりありません。 それにinsertの話ではなくあくまでselectの話ではないのですか?なぜデータ追加処理を動かしたのでしょう
58_ta2_9

2019/12/10 16:50

submit後、画面遷移なしのままだと、 array(1) { ["s"]=> string(8) "20191209" } と出ましたが、遷移ありだと、 array(0) { } と配列がありませんでした。
m.ts10806

2019/12/10 20:21 編集

なんでしょうその「遷移あり」って。 コード内にinputコントロールでname="s"というのもなければ リンクでs=となっているところもないようなので、「SUBMIT後」ですら何も渡っているようには見えないのですが・・
58_ta2_9

2019/12/11 04:54

submit時にajaxで画面遷移を行わない設定にしています。 以前にvar_dumpを行ったときには画面遷移を行っていなかったので、パラメータを受け取れていると勘違いしていました。パラメータが渡っていないんじゃないかとのご指摘を受けて、ajaxを使用せずに画面遷移を行ったところ、パラメータが渡っていないことに気が付きました。
m.ts10806

2019/12/11 05:12

前提条件整理してください。 あとだしが多くて結局の大目的がわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問