/[LeafOK_CVS]/fenglin/bbs/user_service_reg.php
ViewVC logotype

Contents of /fenglin/bbs/user_service_reg.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (show annotations)
Wed Dec 24 06:56:17 2025 UTC (2 months, 3 weeks ago) by sysadm
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +19 -0 lines
Move send_mail_do out of transaction to avoid blocking page load by calling sendmail

1 <?php
2 require_once "../lib/common.inc.php";
3 require_once "../lib/str_process.inc.php";
4 require_once "../lib/vn_gif.inc.php";
5 require_once "../lib/passwd.inc.php";
6 require_once "../lib/db_open.inc.php";
7 require_once "../lib/send_mail.inc.php";
8 require_once "./session_init.inc.php";
9 require_once "./user_reg_check.inc.php";
10
11 $data = json_decode(file_get_contents("php://input"), true);
12
13 $username = (isset($data["username"]) ? trim($data["username"]) : "");
14 $nickname = (isset($data["nickname"]) ? trim($data["nickname"]) : "");
15 $realname = (isset($data["realname"]) ? trim($data["realname"]) : "");
16 $gender = (isset($data["gender"]) ? $data["gender"] : "");
17 $gender_public = (isset($data["gender_public"]) && $data["gender_public"] == "1" ? 1 : 0);
18 $email = (isset($data["email"]) ? trim($data["email"]) : "");
19 $year = (isset($data["year"]) ? intval($data["year"]) : 0);
20 $month = (isset($data["month"]) ? intval($data["month"]) : 0);
21 $day = (isset($data["day"]) ? intval($data["day"]) : 0);
22 $qq = (isset($data["qq"]) ? trim($data["qq"]) : "");
23 $agreement = (isset($data["agreement"]) && $data["agreement"] == "1");
24 $vn_str = (isset($data["vn_str"]) ? trim($data["vn_str"]) : "");
25
26 $result_set = array(
27 "return" => array(
28 "code" => 0,
29 "message" => "",
30 "errorFields" => array(),
31 )
32 );
33
34 header("Content-Type:application/json; charset=utf-8");
35
36 // Validate input data
37 if (!preg_match("/^[A-Za-z][A-Za-z0-9_]{4,11}$/", $username))
38 {
39 $result_set["return"]["code"] = -1;
40 array_push($result_set["return"]["errorFields"], array(
41 "id" => "username",
42 "errMsg" => "不符合格式要求",
43 ));
44 }
45 else if (!check_str($username))
46 {
47 $result_set["return"]["code"] = -1;
48 array_push($result_set["return"]["errorFields"], array(
49 "id" => "username",
50 "errMsg" => "用户名不可用",
51 ));
52 }
53
54 if ($nickname == "" || preg_match("/[[:space:]]/", $nickname) || str_length($nickname) > 20)
55 {
56 $result_set["return"]["code"] = -1;
57 array_push($result_set["return"]["errorFields"], array(
58 "id" => "nickname",
59 "errMsg" => "不符合格式要求",
60 ));
61 }
62 else if (!check_str($nickname))
63 {
64 $result_set["return"]["code"] = -1;
65 array_push($result_set["return"]["errorFields"], array(
66 "id" => "nickname",
67 "errMsg" => "昵称不可用",
68 ));
69 }
70
71 if ($realname == "" || preg_match("/[\t\r\n]/", $realname) || str_length($realname) > 10)
72 {
73 $result_set["return"]["code"] = -1;
74 array_push($result_set["return"]["errorFields"], array(
75 "id" => "realname",
76 "errMsg" => "不符合格式要求",
77 ));
78 }
79
80 if ($gender != "M" && $gender != "F")
81 {
82 $result_set["return"]["code"] = -1;
83 array_push($result_set["return"]["errorFields"], array(
84 "id" => "gender",
85 "errMsg" => "未指定性别",
86 ));
87 }
88
89 if (!preg_match("/^[A-Za-z0-9_.-]+@([A-Za-z0-9-]+[.])+[A-Za-z0-9-]+$/", $email))
90 {
91 $result_set["return"]["code"] = -1;
92 array_push($result_set["return"]["errorFields"], array(
93 "id" => "email",
94 "errMsg" => "不符合格式要求",
95 ));
96 }
97
98 if (!checkdate($month, $day, $year))
99 {
100 $result_set["return"]["code"] = -1;
101 array_push($result_set["return"]["errorFields"], array(
102 "id" => "birthday",
103 "errMsg" => "非法日期",
104 ));
105 }
106 else if ((new DateTimeImmutable("$year-$month-$day")) > (new DateTimeImmutable("-16 year")))
107 {
108 $result_set["return"]["code"] = -1;
109 array_push($result_set["return"]["errorFields"], array(
110 "id" => "birthday",
111 "errMsg" => "需年满16周岁才能使用本站服务",
112 ));
113 }
114
115 if ($qq != "" && !preg_match("/^[0-9]{5,11}$/", $qq))
116 {
117 $result_set["return"]["code"] = -1;
118 array_push($result_set["return"]["errorFields"], array(
119 "id" => "qq",
120 "errMsg" => "不符合格式要求",
121 ));
122 }
123
124 if (!$agreement)
125 {
126 $result_set["return"]["code"] = -1;
127 array_push($result_set["return"]["errorFields"], array(
128 "id" => "agreement",
129 "errMsg" => "请仔细阅读并确认同意《用户许可协议》",
130 ));
131 }
132
133 if ((!isset($_SESSION["BBS_vn_str"])) || $_SESSION["BBS_vn_str"] == "" || strcasecmp($_SESSION["BBS_vn_str"], $vn_str) != 0)
134 {
135 $result_set["return"]["code"] = -1;
136 array_push($result_set["return"]["errorFields"], array(
137 "id" => "vn_str",
138 "errMsg" => "验证码错误",
139 ));
140 }
141
142 if ($result_set["return"]["code"] != 0)
143 {
144 mysqli_close($db_conn);
145 exit(json_encode($result_set));
146 }
147
148 // Secure SQL statement
149 $nickname = mysqli_real_escape_string($db_conn, $nickname);
150 $realname = mysqli_real_escape_string($db_conn, $realname);
151
152 // Begin transaction
153 $rs = mysqli_query($db_conn, "SET autocommit=0");
154 if ($rs == false)
155 {
156 $result_set["return"]["code"] = -2;
157 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
158
159 mysqli_close($db_conn);
160 exit(json_encode($result_set));
161 }
162
163 $rs = mysqli_query($db_conn, "BEGIN");
164 if ($rs == false)
165 {
166 $result_set["return"]["code"] = -2;
167 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
168
169 mysqli_close($db_conn);
170 exit(json_encode($result_set));
171 }
172
173 // Check availability of username and nickname
174 $sql = "SELECT UID FROM user_list WHERE username = '$username' FOR UPDATE";
175
176 $rs = mysqli_query($db_conn, $sql);
177 if ($rs == false)
178 {
179 $result_set["return"]["code"] = -2;
180 $result_set["return"]["message"] = "Query user list error: " . mysqli_error($db_conn);
181
182 mysqli_close($db_conn);
183 exit(json_encode($result_set));
184 }
185
186 if (mysqli_num_rows($rs) > 0)
187 {
188 $result_set["return"]["code"] = -1;
189 array_push($result_set["return"]["errorFields"], array(
190 "id" => "username",
191 "errMsg" => "用户名已存在",
192 ));
193 }
194 mysqli_free_result($rs);
195
196 $sql = "SELECT UID FROM user_nickname WHERE nickname = '$nickname' FOR UPDATE";
197
198 $rs = mysqli_query($db_conn, $sql);
199 if ($rs == false)
200 {
201 $result_set["return"]["code"] = -2;
202 $result_set["return"]["message"] = "Query user nickname error: " . mysqli_error($db_conn);
203
204 mysqli_close($db_conn);
205 exit(json_encode($result_set));
206 }
207
208 if (mysqli_num_rows($rs) > 0)
209 {
210 $result_set["return"]["code"] = -1;
211 array_push($result_set["return"]["errorFields"], array(
212 "id" => "nickname",
213 "errMsg" => "昵称已存在",
214 ));
215 }
216 mysqli_free_result($rs);
217
218 $sql = "SELECT UID FROM user_pubinfo WHERE email = '$email' FOR UPDATE";
219
220 $rs = mysqli_query($db_conn, $sql);
221 if ($rs == false)
222 {
223 $result_set["return"]["code"] = -2;
224 $result_set["return"]["message"] = "Query user email error: " . mysqli_error($db_conn);
225
226 mysqli_close($db_conn);
227 exit(json_encode($result_set));
228 }
229
230 if (mysqli_num_rows($rs) >= $BBS_max_user_per_email)
231 {
232 $result_set["return"]["code"] = -1;
233 array_push($result_set["return"]["errorFields"], array(
234 "id" => "email",
235 "errMsg" => "该邮箱的使用次数已超过限制",
236 ));
237 }
238 mysqli_free_result($rs);
239
240 if ($result_set["return"]["code"] != 0)
241 {
242 mysqli_close($db_conn);
243 exit(json_encode($result_set));
244 }
245
246 // Create new user
247 $temp_password = gen_passwd(10);
248
249 $sql = "INSERT INTO user_list(username, temp_password) values('$username', SHA2('$temp_password', 256))";
250
251 $rs = mysqli_query($db_conn, $sql);
252 if ($rs == false)
253 {
254 $result_set["return"]["code"] = -2;
255 $result_set["return"]["message"] = "Add user list error: " . mysqli_error($db_conn);
256
257 mysqli_close($db_conn);
258 exit(json_encode($result_set));
259 }
260
261 $uid = mysqli_insert_id($db_conn);
262
263 $sql = "INSERT INTO user_reginfo(UID, name, birthday, signup_dt, signup_ip)
264 VALUES($uid, '$realname', '$year-$month-$day', NOW(), '".
265 client_addr() . "')";
266
267 $rs = mysqli_query($db_conn, $sql);
268 if ($rs == false)
269 {
270 $result_set["return"]["code"] = -2;
271 $result_set["return"]["message"] = "Add user reginfo error: " . mysqli_error($db_conn);
272
273 mysqli_close($db_conn);
274 exit(json_encode($result_set));
275 }
276
277 $sql = "INSERT INTO user_pubinfo(UID, nickname, email, gender, gender_pub, qq, last_login_dt)
278 VALUES($uid, '$nickname', '$email', '$gender', $gender_public, '$qq', NOW())";
279
280 $rs = mysqli_query($db_conn, $sql);
281 if ($rs == false)
282 {
283 $result_set["return"]["code"] = -2;
284 $result_set["return"]["message"] = "Add user pubinfo error: " . mysqli_error($db_conn);
285
286 mysqli_close($db_conn);
287 exit(json_encode($result_set));
288 }
289
290 $sql = "INSERT INTO user_nickname(UID, nickname, begin_dt, begin_reason)
291 VALUES($uid, '$nickname', NOW(), 'R')";
292
293 $rs = mysqli_query($db_conn, $sql);
294 if ($rs == false)
295 {
296 $result_set["return"]["code"] = -2;
297 $result_set["return"]["message"] = "Add user nickname error: " . mysqli_error($db_conn);
298
299 mysqli_close($db_conn);
300 exit(json_encode($result_set));
301 }
302
303 // Send initial password via email
304 $from = "";
305 $fromname = $BBS_name;
306 $to = $email;
307 $toname = $username;
308 $subject = $BBS_name . "注册确认";
309 $body = $username . ":\n 您好!\n" .
310 " 您的临时密码是: $temp_password (区分大小写)\n".
311 " 请访问以下链接并在登录时修改密码:\n".
312 "https://$BBS_host_name/bbs/\n\n".
313 " 感谢您的大力支持!\n\n".
314 $BBS_name . "\n" . date("Y年m月d日") . "\n";
315
316 $ret = send_mail($from, $fromname, $to, $toname, $subject, $body, $db_conn);
317 if ($ret == false)
318 {
319 $result_set["return"]["code"] = -2;
320 $result_set["return"]["message"] = "Add email error: " . mysqli_error($db_conn);
321
322 mysqli_close($db_conn);
323 exit(json_encode($result_set));
324 }
325
326 // Commit transaction
327 $rs = mysqli_query($db_conn, "COMMIT");
328 if ($rs == false)
329 {
330 $result_set["return"]["code"] = -2;
331 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
332
333 mysqli_close($db_conn);
334 exit(json_encode($result_set));
335 }
336
337 $_SESSION["BBS_vn_str"] = "";
338
339 $rs = mysqli_query($db_conn, "SET autocommit=1");
340 if ($rs == false)
341 {
342 $result_set["return"]["code"] = -2;
343 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
344
345 mysqli_close($db_conn);
346 exit(json_encode($result_set));
347 }
348
349 if (send_mail_do($db_conn) < 0)
350 {
351 $result_set["return"]["code"] = -2;
352 $result_set["return"]["message"] = "User created, but send mail error";
353
354 mysqli_close($db_conn);
355 exit(json_encode($result_set));
356 }
357
358 mysqli_close($db_conn);
359 exit(json_encode($result_set));

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1