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

質問編集履歴

2

ソースコードを実行できる形で張り替えました

2020/01/28 15:52

投稿

Yuu412
Yuu412

スコア37

title CHANGED
File without changes
body CHANGED
@@ -19,7 +19,37 @@
19
19
 
20
20
  もし、どこか間違っていれば教えていただきたいです。
21
21
 
22
- ```PHP
22
+ ```index.php
23
+ <DOCTYPE html>
24
+ <!--Web上での電卓の作成-->
25
+ <html lang="ja">
26
+ <head>
27
+ <meta charset="utf-8">
28
+ <title>Web電卓</title>
29
+ <link rel="stylesheet" type="text/css" href="/style.css">
30
+ </head>
31
+
32
+ <body>
33
+ <div>
34
+ <?php
35
+ $i = 0;
36
+ do {
37
+ $mark = array();
38
+ } while ($i > 0);
39
+ ?>
40
+ <?php
41
+ //セッションの開始
42
+ session_start();
43
+
44
+ require_once("util.php");
45
+ //このページに来たとき、セッション変数の値を取り出す。
46
+ if(isset($_POST['sum'])){
47
+ $sum = $_POST['sum'];
48
+ $_SESSION['sum'] = $sum;
49
+ }
50
+ else{
51
+ $sum = "";
52
+ }
23
53
  if(isset($_POST['i'])){
24
54
  $i = $_POST['i'];
25
55
  $_SESSION['i'] = $i;
@@ -31,11 +61,44 @@
31
61
  array_push($mark, $_POST['mark']);
32
62
  $_SESSION['mark'] = $mark;
33
63
  }
34
- ```
64
+ else{
65
+ $error[] ="セッションエラーです。";
66
+ }
67
+ ?>
35
68
 
69
+ <?php
70
+ //文字エンコード検証=======================================================
71
+ if(!cken($_POST)){
72
+ $encoding = mb_check_encoding();
73
+ $err = "Encoding Error! The expected encoding is". $encoding;
74
+ //エラーメッセージを表示して処理を終了させる
75
+ exit($err);
76
+ }
77
+ //HTMLエスケープ(XSS対策)
78
+ $_POST = es($_POST);
79
+ //========================================================================
80
+ ?>
36
81
 
82
+ <?php
83
+ //POSTされた値を取り出す
84
+ $error = [];
85
+
86
+ if(isset($_POST["result"])){
87
+ $result = (int)$_POST["result"];
88
+ }
37
- ```PHP
89
+ else{
90
+ $error = '数値を入力してください';
91
+ }
92
+ ?>
93
+
94
+ <?php
95
+ if(isset($_POST["number"])){
96
+ $number = $_POST["number"];
97
+ $result = ($result * 10) + $number;
98
+ $error = '';
99
+ $isError = FALSE;
100
+ }
38
- if(isset($_POST["plus"])){
101
+ else if(isset($_POST["plus"])){
39
102
  $sum = (int)$sum + (int)$result;
40
103
  $mark[$i] = 1;
41
104
  $i++;
@@ -43,20 +106,28 @@
43
106
  $error = '';
44
107
  $isError = FALSE;
45
108
  }
109
+ else if(isset($_POST["minus"])){
110
+ $sum = (int)$sum + (int)$result;
111
+ $mark[$i] = 2;
112
+ $i++;
113
+ $result = 0;
114
+ $error = '';
115
+ $isError = FALSE;
116
+ }
46
-   else if(isset($_POST["equal"])){
117
+ else if(isset($_POST["equal"])){
47
118
  $equal = $_POST["equal"];
48
119
  if(!is_null($mark)){ //足し算フラグがたっているとき
49
- 98 echo $mark[$i-1];
120
+ echo $mark[$i-1]; //98
50
- 99 if($mark[$i-1] == 1){
121
+ if($mark[$i-1] == 1){ //99
51
122
  $result = $sum + $result;
52
123
  }
53
- 102 else if($mark[$i-1] == 2){
124
+ else if($mark[$i-1] == 2){ //102
54
125
  $result = $sum - $result;
55
126
  }
56
- 105 else if($mark[$i-1] == 3){
127
+ else if($mark[$i-1] == 3){ //105
57
128
  $result = $sum * $result;
58
129
  }
59
- 108 else if($mark[$i-1] == 4){
130
+ else if($mark[$i-1] == 4){ //108
60
131
  $result = $sum / $result;
61
132
  }
62
133
  $sum = 0;
@@ -64,13 +135,105 @@
64
135
  $error = '';
65
136
  $isError = FALSE;
66
137
  }
67
- ```
68
138
 
69
- ```PHP
139
+ else{
140
+ //POSTされた値がないとき
141
+ $error = '数値を入力してください';
142
+ $isError = TRUE;
143
+ }
144
+ ?>
145
+ </div>
146
+
147
+
148
+ <!--入力フォームの作成-->
149
+ <div class="Box">
150
+
151
+ <!--現在開いているページにPOSTする-->
152
+ <form method="POST" action="<?php echo es($_SERVER['PHP_SELF'])?>">
153
+ <ul class = "form">
154
+
155
+ <?php if($isError): ?>
156
+ <!--エラーフラグが立っていればエラー出力-->
157
+ <input class="result" type="text" name="result" value="<?php echo $error ?>">
158
+ <?php else: ?>
159
+ <!--立ってなければ$result表示-->
70
160
  <input class="result" type="number" name="result" value="<?php echo $result ?>">
71
161
  <input type="hidden" name="sum" value="<?php echo $sum ?>">
72
162
  <input type="hidden" name="i" value="<?php echo $i ?>">
73
163
  <input type="hidden" name="mark" value="<?php echo $mark[$i-1] ?>">
164
+ <?php endif ?>
165
+
166
+ <ul>
167
+ <li><input type ="submit" name="number" value ="AC"></li>
168
+ <li><input type ="submit" name="number" value ="+/-"></li>
169
+ <li><input type ="submit" name="number" value ="%"></li>
170
+ <li><input type ="submit" name="multiply" value = "÷"></li>
171
+ </ul>
172
+ <ul>
173
+ <li><input type ="submit" name="number" value ="7"></li>
174
+ <li><input type ="submit" name="number" value ="8"></li>
175
+ <li><input type ="submit" name="number" value ="9"></li>
176
+ <li><input type ="submit" name="multiply" value = "×"></li>
177
+ </ul>
178
+ <ul>
179
+ <li><input type ="submit" name="number" value ="4"></li>
180
+ <li><input type ="submit" name="number" value ="5"></li>
181
+ <li><input type ="submit" name="number" value ="6"></li>
182
+ <li><input type ="submit" name=minus value = "-"></li>
183
+ </ul>
184
+ <ul>
185
+ <li><input type ="submit" name="number" value ="1"></li>
186
+ <li><input type ="submit" name="number" value ="2"></li>
187
+ <li><input type ="submit" name="number" value ="3"></li>
188
+ <li><input type ="submit" name="plus" value = "+"></li>
189
+ </ul>
190
+ <div class="zero"><input type ="submit" name="number" value ="0"></div>
191
+ <div class="point"><input type ="submit" name="point" value ="."></div>
192
+ </ul>
193
+ <div class="equal"><input type ="submit" name="equal" value = "="></div>
194
+
195
+ </form>
196
+ </div>
197
+
198
+
199
+ </body>
200
+
201
+ </html>
202
+
74
203
  ```
75
204
 
205
+ ```util.php
206
+ <?php
207
+
76
- 途中省略していますが、主要な部分は上記箇所だと思います。
208
+ //XSS対策ためのHTMLエスケープ
209
+ function es($data){
210
+ //$dataが配列のとき
211
+ if(is_array($data)){
212
+ //再帰呼出し
213
+ return array_map(__METHOD__, $data);
214
+ }
215
+ else{
216
+ //HTMLエスケープを行う
217
+ return htmlspecialchars($data, ENT_QUOTES, 'utf-8');
218
+ }
219
+ }
220
+
221
+ function cken(array $data){
222
+ $result = true;
223
+ foreach($data as $key => $value){
224
+ if(is_array($value)){
225
+ //含まれている値が配列のとき文字列に連結する
226
+ $value = implode("", $value);
227
+ }
228
+ if(!mb_check_encoding($value)){
229
+ //文字エンコードが一致しないとき
230
+ $result = faulse;
231
+ //foreachでの査定を終わらせる
232
+ break;
233
+ }
234
+ }
235
+ return $result;
236
+ }
237
+ ?>
238
+
239
+ ```

1

エラー内容を省略せずに書きました

2020/01/28 15:52

投稿

Yuu412
Yuu412

スコア37

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,18 @@
1
1
  PHPで配列を扱っているときにエラーがでてしまいます。
2
2
 
3
3
  エラーの内容は
4
+ ```エラー
5
+
4
- Undefined offset: 1
6
+ Notice: Undefined offset: 1 in C:\xampp\htdocs\index.php on line 98
7
+
8
+ Notice: Undefined offset: 1 in C:\xampp\htdocs\index.php on line 99
9
+
10
+ Notice: Undefined offset: 1 in C:\xampp\htdocs\index.php on line 102
11
+
12
+ Notice: Undefined offset: 1 in C:\xampp\htdocs\index.php on line 105
13
+
14
+ Notice: Undefined offset: 1 in C:\xampp\htdocs\index.php on line 108
15
+ ```
5
16
  のようなもので、たぶん配列の要素を2個しか格納していないにも関わらず、配列の要素を3個格納しているものとして扱ってしまうようなときに発生するエラーだと考えています。
6
17
 
7
18
  しかし、私の中ではその点には十分注意して作成したつもりです。
@@ -35,17 +46,17 @@
35
46
    else if(isset($_POST["equal"])){
36
47
  $equal = $_POST["equal"];
37
48
  if(!is_null($mark)){ //足し算フラグがたっているとき
38
- echo $mark[$i-1];
49
+ 98 echo $mark[$i-1];
39
- if($mark[$i-1] == 1){
50
+ 99 if($mark[$i-1] == 1){
40
51
  $result = $sum + $result;
41
52
  }
42
- else if($mark[$i-1] == 2){
53
+ 102 else if($mark[$i-1] == 2){
43
54
  $result = $sum - $result;
44
55
  }
45
- else if($mark[$i-1] == 3){
56
+ 105 else if($mark[$i-1] == 3){
46
57
  $result = $sum * $result;
47
58
  }
48
- else if($mark[$i-1] == 4){
59
+ 108 else if($mark[$i-1] == 4){
49
60
  $result = $sum / $result;
50
61
  }
51
62
  $sum = 0;