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

Annotation of /fenglin/bbs/user_service_reg.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (hide 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 sysadm 1.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 sysadm 1.2 require_once "./user_reg_check.inc.php";
10 sysadm 1.1
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 sysadm 1.5 if (!preg_match("/^[A-Za-z][A-Za-z0-9_]{4,11}$/", $username))
38 sysadm 1.1 {
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 sysadm 1.3
152 sysadm 1.1 // 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 sysadm 1.3
163 sysadm 1.1 $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 sysadm 1.3
176 sysadm 1.1 $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 sysadm 1.3
218 sysadm 1.1 $sql = "SELECT UID FROM user_pubinfo WHERE email = '$email' FOR UPDATE";
219 sysadm 1.3
220 sysadm 1.1 $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 sysadm 1.6 $sql = "INSERT INTO user_list(username, temp_password) values('$username', SHA2('$temp_password', 256))";
250 sysadm 1.1
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 sysadm 1.7 $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 sysadm 1.1 mysqli_close($db_conn);
359     exit(json_encode($result_set));

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