OSDN Git Service

辛夷祭初日の緊急修正多数。
[h58pcdgame/GameScriptCoreLibrary.git] / www / auth.php
1 <?php\r
2 //FOR DEBUG\r
3 mysqli_report(MYSQLI_REPORT_ERROR);\r
4 \r
5 require("header.php");\r
6 //将来的にURLのname属性は、sqlに渡すため、エスケープして安全を確保しなければいけない。\r
7 //->すでにやった\r
8 //->escapeMySQLArgumentString\r
9 // http://blog.image-lab.net/2012/07/phpmysql.html\r
10 // 接続(DB選択含む)\r
11 //DB:\r
12 //create table AuthUserTable ( id int auto_increment, name char(32), index(id));\r
13 //insert into AuthUserTable (name) values ('hikarupsp');\r
14 // 実行\r
15 //$query = "SELECT * FROM AuthUserTable";\r
16 //$stmt = $db->prepare($query);\r
17 //$stmt->execute();\r
18 // 変数のバインド\r
19 //$stmt->bind_result($name,$id);\r
20 //while ($stmt->fetch()) {\r
21 //      echo $name;\r
22 //      echo $id;\r
23 //}\r
24 \r
25 $db = new mysqli('localhost', DATABASE_USER, DATABASE_PWD, DATABASE_NAME);\r
26 if (mysqli_connect_error()) {\r
27         responseError();\r
28 }\r
29 // 文字化け防止\r
30 $db->set_charset("utf8");\r
31         \r
32 if(isset($_GET['action'])){\r
33         $action = $_GET['action'];\r
34         if(isset($_GET['name'])){\r
35                 $name = urldecode($_GET['name']);\r
36                 escapeMySQLArgumentString($name);\r
37                 \r
38                 if(strcmp($action, 'join') == 0){\r
39                         //通常モード\r
40                         $stmt = $db->prepare(QUERY_SELECT_USER_ID);\r
41                         $stmt->bind_param(QUERY_SELECT_USER_ID_TYPES, $name);\r
42                         $stmt->execute();\r
43                         if($stmt->errno == 0){\r
44                                 //クエリ成功\r
45                                 $stmt->store_result();\r
46                                 // 結果の個数を確認\r
47                                 if($stmt->num_rows == 0){\r
48                                         //ユーザー名はリストになかった=はじめてのひと\r
49                                         $stmt = $db->prepare(QUERY_ADD_USER);\r
50                                         $stgName = DEFAULT_START_STAGE;\r
51                                         $stmt->bind_param(QUERY_ADD_USER_TYPES, $name, $stgName);\r
52                                         $stmt->execute();\r
53                                         if($stmt->errno == 0){\r
54                                                 //クエリ成功\r
55                                                 $stmt = $db->prepare(QUERY_SELECT_USER_ID);\r
56                                                 $stmt->bind_param(QUERY_SELECT_USER_ID_TYPES, $name);\r
57                                                 $stmt->execute();\r
58                                                 if($stmt->errno == 0){\r
59                                                         //クエリ成功\r
60                                                         $stmt->store_result();\r
61                                                         if($stmt->num_rows == 0){\r
62                                                                 //ユーザー名はリストになかった=そんな…登録したのに。あきらめてエラーを返す\r
63                                                                 responseError();\r
64                                                         } else{\r
65                                                                 //ユーザー名がリストにある=予想通り\r
66                                                                 $stmt->bind_result($id);\r
67                                                                 $stmt->fetch();\r
68                                                                 responseNewUser($db, $id);\r
69                                                         }\r
70                                                 } else{\r
71                                                         //クエリ失敗\r
72                                                         responseError();\r
73                                                 }\r
74                                         } else{\r
75                                                 //クエリ失敗\r
76                                                 responseError();\r
77                                         }\r
78                                 } else{\r
79                                         //すでにユーザー名がリストにある=続きからプレイ\r
80                                         $stmt->bind_result($id);\r
81                                         $stmt->fetch();\r
82                                         $stgName = getUserStage($db, $id);\r
83                                         responseExistUser($db, $id, $stgName);\r
84                                 }\r
85                         } else{\r
86                                 //クエリ失敗\r
87                                 responseError();\r
88                         }\r
89                 } else if(strcmp($action, 'devjoin') == 0){\r
90                         //開発者モード\r
91                         if(!isset($_GET['stage'])){\r
92                                 responseError();\r
93                         }\r
94                         $stgName = urldecode($_GET['stage']);\r
95                         $stmt = $db->prepare(QUERY_SELECT_USER_ID);\r
96                         $stmt->bind_param(QUERY_SELECT_USER_ID_TYPES, $name);\r
97                         $stmt->execute();\r
98                         if($stmt->errno == 0){\r
99                                 //クエリ成功\r
100                                 $stmt->store_result();\r
101                                 // 結果の個数を確認\r
102                                 if($stmt->num_rows == 0){\r
103                                         //ユーザー名はリストになかった=はじめてのひと\r
104                                         $stmt = $db->prepare(QUERY_ADD_USER);\r
105                                         //$stgName = DEFAULT_START_STAGE;\r
106                                         $stmt->bind_param(QUERY_ADD_USER_TYPES, $name, $stgName);\r
107                                         $stmt->execute();\r
108                                         if($stmt->errno == 0){\r
109                                                 //クエリ成功\r
110                                                 $stmt = $db->prepare(QUERY_SELECT_USER_ID);\r
111                                                 $stmt->bind_param(QUERY_SELECT_USER_ID_TYPES, $name);\r
112                                                 $stmt->execute();\r
113                                                 if($stmt->errno == 0){\r
114                                                         //クエリ成功\r
115                                                         $stmt->store_result();\r
116                                                         if($stmt->num_rows == 0){\r
117                                                                 //ユーザー名はリストになかった=そんな…登録したのに。あきらめてエラーを返す\r
118                                                                 responseError();\r
119                                                         } else{\r
120                                                                 //ユーザー名がリストにある=予想通り\r
121                                                                 $stmt->bind_result($id);\r
122                                                                 $stmt->fetch();\r
123                                                                 responseExistUser($db, $id, getUserStage($db, $id));\r
124                                                         }\r
125                                                 } else{\r
126                                                         //クエリ失敗\r
127                                                         responseError();\r
128                                                 }\r
129                                         } else{\r
130                                                 //クエリ失敗\r
131                                                 responseError();\r
132                                         }\r
133                                 } else{\r
134                                         //すでにユーザー名がリストにある=続きからプレイ\r
135                                         $stmt->bind_result($id);\r
136                                         $stmt->fetch();\r
137                                         //未実装(本当はデータベースから続きのステージ名を取得するべき)\r
138                                         updateUserStage($db, $id, $stgName);\r
139                                         responseExistUser($db, $id, $stgName);\r
140                                 }\r
141                         }\r
142                 } else if(strcmp($action, 'chstg') == 0){\r
143                         //ステージ移動\r
144                         if(!isset($_GET['id'])){\r
145                                 exit("eee");\r
146                         }\r
147                         $id = $_GET['id'];\r
148                         //deleteUserStageObjectAll($db, $id);\r
149                         updateUserStage($db, $id, $name);\r
150                         exit("success");\r
151                 } else if(strcmp($action, 'chcharacter') == 0){\r
152                         if(!isset($_GET['id'])){\r
153                                 exit("eee");\r
154                         }\r
155                         $id = $_GET['id'];\r
156                         updateUserCharacterClass($db,$id,$name);\r
157                         exit("success");\r
158                 }\r
159         }\r
160 }\r
161 //正しいリクエストであればここに来るはずはない\r
162 responseError();\r
163 \r
164 \r
165 //\r
166 // response\r
167 //\r
168 // [[userID], [timestamp], [stageName], [info]];\r
169 // info == 10: エラーなし。ログインできる。\r
170 // info == 0:データベース通信エラー。ログインできない。\r
171 // info == 11: すでにユーザーがログインしている。ログインできない。\r
172 \r
173 function responseError()\r
174 {\r
175         exit("[0, 0, \"\", 0];");\r
176 }\r
177 \r
178 function responseNewUser($db, $userID)\r
179 {\r
180         updateUserTimestamp($db, $userID);\r
181         updateUserStage($db, $userID, DEFAULT_START_STAGE);\r
182         exit("[" . $userID . "," . getTimeStampMs() . ",\"" . DEFAULT_START_STAGE . "\", 10, null]");\r
183 }\r
184 \r
185 function responseExistUser($db, $userID, $stageName)\r
186 {\r
187         $ts = getUserLastResponseTimestamp($db, $userID);\r
188         $ts -= getTimeStampMs();\r
189         if(-$ts < USER_ALIVE_TIME_MS){\r
190                 // info == 11: すでにユーザーがログインしている。ログインできない。\r
191                 exit("[" . $userID . "," . getTimeStampMs() . ",\"" . $stageName . "\", 11, \"" . getUserCharacterClass($db, $userID) . "\"];");\r
192         }\r
193         deleteUserStageObjectAll($db, $userID);\r
194         updateUserTimestamp($db, $userID);\r
195         exit("[" . $userID . "," . getTimeStampMs() . ",\"" . $stageName . "\", 10, \"" . getUserCharacterClass($db, $userID) . "\"]");\r
196 }\r
197 \r
198 //\r
199 // update\r
200 //\r
201 \r
202 function updateUserStage($db, $userID, $stageName)\r
203 {\r
204         $stmt = $db->prepare(QUERY_UPDATE_USER_STAGE);\r
205         $stmt->bind_param(QUERY_UPDATE_USER_STAGE_TYPES, $stageName, $userID);\r
206         $stmt->execute();\r
207         //エラーチェック省略\r
208         if($stmt->errno != 0){\r
209                 exit("error573");\r
210         }\r
211         $stmt->close();\r
212 }\r
213 \r
214 function getUserStage($db, $userID)\r
215 {\r
216         $stgName = "unknown";\r
217         $stmt = $db->prepare(QUERY_SELECT_USER_STAGE);\r
218         $stmt->bind_param(QUERY_SELECT_USER_STAGE_TYPES, $userID);\r
219         $stmt->execute();\r
220         if($stmt->errno == 0){\r
221                 //クエリ成功\r
222                 $stmt->store_result();\r
223                 // 結果の個数を確認\r
224                 if($stmt->num_rows != 0){\r
225                         //結果格納\r
226                         $stmt->bind_result($stgName);\r
227                         $stmt->fetch();\r
228                 }\r
229         }\r
230         $stmt->close();\r
231         return $stgName;\r
232 }\r
233 \r
234 function updateUserCharacterClass($db, $userID, $className)\r
235 {\r
236         $stmt = $db->prepare(QUERY_UPDATE_USER_CCLASS);\r
237         $stmt->bind_param(QUERY_UPDATE_USER_CCLASS_TYPES, $className, $userID);\r
238         $stmt->execute();\r
239         //エラーチェック省略\r
240         if($stmt->errno != 0){\r
241                 exit("error573");\r
242         }\r
243         $stmt->close();\r
244 }\r
245 \r
246 function getUserCharacterClass($db, $userID)\r
247 {\r
248         $className = "unknown";\r
249         $stmt = $db->prepare(QUERY_SELECT_USER_CCLASS);\r
250         $stmt->bind_param(QUERY_SELECT_USER_CCLASS_TYPES, $userID);\r
251         $stmt->execute();\r
252         if($stmt->errno == 0){\r
253                 //クエリ成功\r
254                 $stmt->store_result();\r
255                 // 結果の個数を確認\r
256                 if($stmt->num_rows != 0){\r
257                         //結果格納\r
258                         $stmt->bind_result($className);\r
259                         $stmt->fetch();\r
260                 }\r
261         }\r
262         $stmt->close();\r
263         return $className;\r
264 }\r
265 \r
266 function deleteUserStageObjectAll($db, $userID)\r
267 {\r
268         $stmt = $db->prepare(QUERY_DELETE_USER_OBJECT_ALL);\r
269         $stmt->bind_param(QUERY_DELETE_USER_OBJECT_ALL_TYPES, $userID);\r
270         $stmt->execute();\r
271         //エラーチェック省略\r
272 }\r
273 \r
274 //\r
275 // add\r
276 //\r
277 \r
278 \r
279 \r
280 ?>