質問するログイン新規登録

質問編集履歴

1

前回の質問一旦削除しました。

2017/06/18 04:57

投稿

YamamotoAtsushi
YamamotoAtsushi

スコア17

title CHANGED
@@ -1,1 +1,1 @@
1
- googla api calender月替わりカレンダとエラメッセジにつ
1
+ mysqlにてデスからパスワードとidを取り出し、loginフォームを作りた
body CHANGED
@@ -1,169 +1,191 @@
1
- google api calender使って祝日を取得し、日替わりケジュ作成するためにカレダー作りたいと考えておりま
1
+ mysqlにid,userid,name,password登録し、idとパ取り出しログイ画面出したいのでが、
2
- 但し、google api calenderもローカルのxamppで扱うと「unable to find the wrapper "https" 」というエラーメッセージ
3
- が出てしまいます。
4
- た、月めりにしようとファイルが存在しませんというエラーが出ます。申訳御座いませんがどな教えて頂ければと思います。
2
+ まくいきません。下記にコードとエラー画面、試したことを記載しますので教えて頂ければと思います。
3
+ まだ、phpのmysqlについて習って日が浅いのでどなたかご教授頂ければと思います。
5
- お願いします。
4
+ よろしくお願いいたします。
5
+
6
+ ログイン画面 login.php
6
7
  ```php
7
8
  <?php
9
+ require 'password.php';
10
+ // セッション開始
11
+ session_start();
12
+
13
+ $db['host'] = "localhost"; // DBサーバのurl
14
+ $db['user'] = "testuser";
15
+ $db['pass'] = "testpass";
16
+ $db['dbname'] = "booksample";
17
+
18
+ // エラーメッセージの初期化
19
+ $errorMessage = "";
20
+
21
+ // ログインボタンが押された場合
22
+ if (isset($_POST["login"])) {
23
+ // 1.ユーザIDの入力チェック
24
+ if (empty($_POST["userid"])) {
25
+ $errorMessage = "ユーザIDが未入力です。";
26
+ } else if (empty($_POST["password"])) {
27
+ $errorMessage = "パスワードが未入力です。";
28
+ }
29
+
30
+ // 2.ユーザIDとパスワードが入力されていたら認証する
31
+ if (!empty($_POST["userid"]) && !empty($_POST["password"])) {
32
+ // mysqlへの接続
33
+ $mysqli = new mysqli($db['host'], $db['user'], $db['pass']);
34
+ if ($mysqli->connect_errno) {
35
+ print('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error);
36
+ exit();
37
+ }
38
+
39
+ // データベースの選択
40
+ $mysqli->select_db($db['dbname']);
41
+
42
+ var_dump($db['dbname']);
43
+
44
+ // 入力値のサニタイズ
45
+ $userid = $mysqli->real_escape_string($_POST["userid"]);
46
+ var_dump($userid);
47
+ // クエリの実行
48
+ $query = "SELECT * FROM users WHERE name = '" . $userid . "'";
8
49
 
9
- // 初期値
10
- $y = date('Y');
11
- $m = date('m');
12
-
13
- // 日付の指定がある場合
14
- if(!empty($_GET['date']))
15
- {
16
- $arr_date = explode('-', htmlspecialchars($_GET['date'], ENT_QUOTES));
17
-
18
- if(count($arr_date) == 2 and is_numeric($arr_date[0]) and is_numeric($arr_date[1]))
19
- {
20
- $y = (int)$arr_date[0];
50
+ $result = $mysqli->query($query);
51
+ var_dump($query);
52
+ var_dump($result);
53
+ if (!$result) {
54
+ print('クエリーが失敗しました。' . $mysqli->error);
21
- $m = (int)$arr_date[1];
55
+ $mysqli->close();
56
+ exit();
22
- }
57
+ }
23
- }
24
-
25
- // 祝日の取得の関数
26
- function japan_holiday($year = '')
27
- {
28
- $apiKey = 'GoogleAPIキー ';
29
- $holidays = array();
30
-
31
- // カレンダーID
32
- $calendar_id = urlencode('グーグルカレンダーのID');
33
-
34
- // 取得期間
35
- $start = date($year."-01-01\T00:00:00\Z");
36
- $finish = date($year."-12-31\T00:00:00\Z");
37
-
38
- $url = "https://www.googleapis.com/calendar/v3/calendars/{$calendar_id}/events?key={$apiKey}&timeMin={$start}&timeMax={$finish}&maxResults=50&orderBy=startTime&singleEvents=true";
39
-
40
- if ($results = file_get_contents($url, true))
41
- {
42
- // JSON形式で取得した情報を配列に格納
43
- $results = json_decode($results);
44
-
45
- // 年月日をキー、祝日名を配列に格納
46
- foreach ($results->items as $item) {
47
- $date = strtotime((string) $item->start->date);
48
- $title = (string) $item->summary;
49
- $holidays[date('Y-m-d', $date)] = $title;
50
58
 
59
+
60
+
61
+ while ($row = $result->fetch_assoc()) {
62
+ // パスワード(暗号化済み)の取り出し
51
- var_dump($holidays);
63
+ $db_hashed_pwd = $row['password'];
52
- }
64
+ }
53
-
54
- // 祝日の配列を並び替え
55
- ksort($holidays);
56
65
 
57
- var_dump($holidays);
66
+ var_dump($db_hashed_pwd);
67
+
68
+ // データベースの切断
69
+ $mysqli->close();
70
+
71
+ // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。
72
+ //if ($_POST["password"] == $pw) {
73
+ if (password_verify($_POST["password"], $db_hashed_pwd)) {
74
+ // 4.認証成功なら、セッションIDを新規に発行する
75
+ session_regenerate_id(true);
76
+ $_SESSION["USERID"] = $_POST["userid"];
77
+ header("Location: main.php");
78
+ exit;
79
+ } else {
80
+ // 認証失敗
81
+ $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";
58
- }
82
+ }
59
-
83
+ } else {
60
- return $holidays;
84
+ // 未入力なら何もしない
61
- }
85
+ }
62
-
63
- // 祝日取得
64
- $national_holiday = japan_holiday($y);
65
- ?>
86
+ }
66
- <!DOCTYPE html>
67
- <head>
68
- <meta charset="utf-8">
69
- </head>
70
- <table>
71
- <tr>
72
- <td><a href="./date=<?php echo date('Y-m', strtotime($y .'-' . $m . ' -1 month')); ?>">&lt; 前の月</a></td>
73
- <td><?php echo $y ?>年<?php echo $m ?>月</td>
74
- <td><a href="./date=<?php echo date('Y-m', strtotime($y .'-' . $m . ' +1 month')); ?>">次の月 &gt;</a></td>
75
- </tr>
76
- </table>
77
87
 
78
- <table>
88
+
79
- <tr>
80
- <th>日</th>
81
- <th>月</th>
82
- <th>火</th>
83
- <th>水</th>
84
- <th>木</th>
85
- <th>金</th>
86
- <th>土</th>
87
- </tr>
88
- <tr>
89
-
90
- <?php
91
-
92
- // 1日の曜日を取得
93
- $wd1 = date("w", mktime(0, 0, 0, $m, 1, $y));
94
-
95
- // その数だけ空のセルを作成
96
- for ($i = 1; $i <= $wd1; $i++) {
97
- echo "<td> </td>";
98
- }
99
-
100
- $d = 1;
101
- while (checkdate($m, $d, $y)) {
102
-
103
- // 日曜:赤色
104
- if(date("w", mktime(0, 0, 0, $m, $d, $y)) == 0)
105
- {
106
- echo "<td style='color:red;'>$d</td>";
107
- }
108
- // 土曜:青色
109
- elseif(date("w", mktime(0, 0, 0, $m, $d, $y)) == 6)
110
- {
111
- echo "<td style='color:blue;'>$d</td>";
112
- }
113
- // 祝日:黄色
114
- elseif(!empty($national_holiday[date("Y-m-d", mktime(0, 0, 0, $m, $d, $y))]))
115
- {
116
- echo "<td style='background:yellow;'>$d</td>";
117
- }
118
- // 土日祝以外
119
- else
120
- {
121
- echo "<td>$d</td>";
122
- }
123
-
124
- // 週の始まりと終わりでタグを出力
125
- if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6)
126
- {
127
- // 週を終了
128
- echo "</tr>";
129
-
130
- // 次の週がある場合は新たな行を準備
131
- if (checkdate($m, $d + 1, $y)) {
132
- echo "<tr>";
89
+ var_dump($db_hashed_pwd);
133
- }
90
+
134
- }
91
+
135
-
136
- $d++;
137
- }
138
-
139
- // 最後の週の土曜日まで空のセルを作成
140
- $wdx = date("w", mktime(0, 0, 0, $m + 1, 0, $y));
141
-
142
- for ($i = 1; $i < 7 - $wdx; $i++)
143
- {
144
- echo "<td> </td>";
145
- }
146
92
  ?>
93
+ <!doctype html>
94
+ <html>
95
+ <head>
96
+ <meta charset="UTF-8">
97
+ <title>サンプルアプリケーション</title>
98
+ </head>
99
+ <body>
100
+ <h1>ログイン機能 サンプルアプリケーション</h1>
101
+ <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく -->
102
+ <!--<form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">-->
103
+ <form id="loginForm" name="loginForm" action="" method="POST">
104
+ <fieldset>
105
+ <legend>ログインフォーム</legend>
106
+ <div><?php echo $errorMessage ?></div>
107
+ <label for="userid">ユーザID</label><input type="text" id="userid" name="userid" value="">
108
+ <br>
109
+ <label for="password">パスワード</label><input type="password" id="password" name="password" value="">
110
+ <br>
111
+ <input type="submit" id="login" name="login" value="ログイン">
112
+ </fieldset>
147
- </tr>
113
+ </form>
148
- </table>
114
+ </body>
149
115
  </html>
150
116
  ```
117
+ メイン画面 main.php
118
+ ```php
119
+ <?php
120
+ session_start();
151
121
 
152
- 試したことは以下の通りです。
153
- APIまで部分を下記に変えて、月代わりをしようとしましたが
122
+ // ログイン状態チェック
123
+ if (!isset($_SESSION["USERID"])) {
124
+ header("Location: logout.php");
154
- 出来ませんでした。
125
+ exit;
126
+ }
155
127
 
128
+ ?>
129
+
130
+ <!doctype html>
131
+ <html>
132
+ <head>
133
+ <meta charset="UTF-8">
134
+ <title>サンプルアプリケーション</title>
135
+ </head>
136
+ <body>
137
+ <h1>ログイン機能 サンプルアプリケーション</h1>
138
+ <!-- ユーザIDにHTMLタグが含まれても良いようにエスケープする -->
139
+ <p>ようこそ<?=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん</p>
140
+ <ul>
141
+ <li><a href="logout.php">ログアウト</a></li>
142
+ </ul>
143
+ </body>
144
+ </html>
145
+
146
+ ```
147
+ logout.php
156
148
  ```php
149
+ <?php
150
+ session_start();
151
+
157
- if(isset($_GET['date'])){
152
+ if (isset($_SESSION["USERID"])) {
158
- $y = date('Y');
159
- $m = date('m');
160
- $date = $_GET['date'];
161
- } else {
162
- $date ="";
153
+ $errorMessage = "ログアウトしました。";
163
154
  }
155
+ else {
156
+ $errorMessage = "セッションがタイムアウトしました。";
157
+ }
158
+ // セッション変数のクリア
159
+ $_SESSION = array();
164
160
 
161
+ @session_destroy();
162
+ ?>
163
+
164
+ <!doctype html>
165
+ <html>
166
+ <head>
167
+ <meta charset="UTF-8">
168
+ <title>サンプルアプリケーション</title>
169
+ </head>
170
+ <body>
171
+ <h1>ログイン機能 サンプルアプリケーション</h1>
172
+ <div><?php echo $errorMessage; ?></div>
173
+ <ul>
174
+ <li><a href="login.php">ログイン画面に戻る</a></li>
175
+ </ul>
176
+ </body>
177
+ </html>
165
178
  ```
179
+
180
+ 出ているエラー
181
+ Notice: Undefined variable: db_hashed_pwd in C:\xampp\htdocs\login\login.php on line 59
182
+ 59行目が、var_dumpで調べてもデーターベースからパスワードを引き出せていないというものでした。
166
- 新しphp7.1.4に変え
183
+ 空のnullとう文字が出しまいます。
184
+ 試したことは、$query = "SELECT * FROM users WHERE name = '" . $userid . "'";のあとに
185
+ ```php
167
- php.iniの部分の;extension=php_openssl.dllの;を取り外したことですが、
186
+ $query = "SELECT * FROM users WHERE password;
187
+ ```
188
+ をつけたり、
168
- エラメッセージが改善さる気配がありせんでした。
189
+ hash(sha1,"password")でパスワドを切ていないかを調べましたが、切れていないようです
169
- 申し訳御座ませんどなたか教えて頂ければと思います。
190
+ データーベース扱いが初めてなものでどなたか頂ければと思います。
191
+ 宜しくお願い致します。