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

Contents of /fenglin/bbs/user_service_update_profile.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (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.3: +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/db_open.inc.php";
4 require_once "../lib//score_change.inc.php";
5 require_once "../lib/send_mail.inc.php";
6 require_once "../lib/str_process.inc.php";
7 require_once "../lib/passwd.inc.php";
8 require_once "./session_init.inc.php";
9 require_once "./user_reg_check.inc.php";
10
11 force_login();
12
13 $data = json_decode(file_get_contents("php://input"), true);
14
15 $nickname = (isset($data["nickname"]) ? trim($data["nickname"]) : "");
16 $realname = (isset($data["realname"]) ? trim($data["realname"]) : "");
17 $gender = (isset($data["gender"]) ? $data["gender"] : "");
18 $gender_public = (isset($data["gender_public"]) && $data["gender_public"] == "1" ? 1 : 0);
19 $email = (isset($data["email"]) ? trim($data["email"]) : "");
20 $year = (isset($data["year"]) ? intval($data["year"]) : 0);
21 $month = (isset($data["month"]) ? intval($data["month"]) : 0);
22 $day = (isset($data["day"]) ? intval($data["day"]) : 0);
23 $qq = (isset($data["qq"]) ? trim($data["qq"]) : "");
24
25 $result_set = array(
26 "return" => array(
27 "code" => 0,
28 "message" => "",
29 "errorFields" => array(),
30 )
31 );
32
33 header("Content-Type:application/json; charset=utf-8");
34
35 // Validate input data
36 if ($nickname == "" || preg_match("/[[:space:]]/", $nickname) || str_length($nickname) > 20)
37 {
38 $result_set["return"]["code"] = -1;
39 array_push($result_set["return"]["errorFields"], array(
40 "id" => "nickname",
41 "errMsg" => "不符合格式要求",
42 ));
43 }
44 else if (!check_str($nickname) && !$_SESSION["BBS_priv"]->checklevel(P_ADMIN_M | P_ADMIN_S))
45 {
46 $result_set["return"]["code"] = -1;
47 array_push($result_set["return"]["errorFields"], array(
48 "id" => "nickname",
49 "errMsg" => "昵称不可用",
50 ));
51 }
52
53 if ($realname == "" || preg_match("/[\t\r\n]/", $realname) || str_length($realname) > 10)
54 {
55 $result_set["return"]["code"] = -1;
56 array_push($result_set["return"]["errorFields"], array(
57 "id" => "realname",
58 "errMsg" => "不符合格式要求",
59 ));
60 }
61
62 if ($gender != "M" && $gender != "F")
63 {
64 $result_set["return"]["code"] = -1;
65 array_push($result_set["return"]["errorFields"], array(
66 "id" => "gender",
67 "errMsg" => "未指定性别",
68 ));
69 }
70
71 if (!preg_match("/^[A-Za-z0-9_.-]+@([A-Za-z0-9-]+[.])+[A-Za-z0-9-]+$/", $email))
72 {
73 $result_set["return"]["code"] = -1;
74 array_push($result_set["return"]["errorFields"], array(
75 "id" => "email",
76 "errMsg" => "不符合格式要求",
77 ));
78 }
79
80 if (!checkdate($month, $day, $year))
81 {
82 $result_set["return"]["code"] = -1;
83 array_push($result_set["return"]["errorFields"], array(
84 "id" => "birthday",
85 "errMsg" => "非法日期",
86 ));
87 }
88 else if ((new DateTimeImmutable("$year-$month-$day")) > (new DateTimeImmutable("-16 year")))
89 {
90 $result_set["return"]["code"] = -1;
91 array_push($result_set["return"]["errorFields"], array(
92 "id" => "birthday",
93 "errMsg" => "需年满16周岁才能使用本站服务",
94 ));
95 }
96
97 if ($qq != "" && !preg_match("/^[0-9]{5,11}$/", $qq))
98 {
99 $result_set["return"]["code"] = -1;
100 array_push($result_set["return"]["errorFields"], array(
101 "id" => "qq",
102 "errMsg" => "不符合格式要求",
103 ));
104 }
105
106 if ($result_set["return"]["code"] != 0)
107 {
108 mysqli_close($db_conn);
109 exit(json_encode($result_set));
110 }
111
112 // Secure SQL statement
113 $nickname = mysqli_real_escape_string($db_conn, $nickname);
114 $realname = mysqli_real_escape_string($db_conn, $realname);
115
116 // Begin transaction
117 $rs = mysqli_query($db_conn, "SET autocommit=0");
118 if ($rs == false)
119 {
120 $result_set["return"]["code"] = -2;
121 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
122
123 mysqli_close($db_conn);
124 exit(json_encode($result_set));
125 }
126
127 $rs = mysqli_query($db_conn, "BEGIN");
128 if ($rs == false)
129 {
130 $result_set["return"]["code"] = -2;
131 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
132
133 mysqli_close($db_conn);
134 exit(json_encode($result_set));
135 }
136
137 $sql = "SELECT nickname, email FROM user_pubinfo WHERE UID = " . $_SESSION["BBS_uid"] .
138 " FOR UPDATE";
139
140 $rs = mysqli_query($db_conn, $sql);
141 if ($rs == false)
142 {
143 $result_set["return"]["code"] = -2;
144 $result_set["return"]["message"] = "Query user info error: " . mysqli_error($db_conn);
145
146 mysqli_close($db_conn);
147 exit(json_encode($result_set));
148 }
149
150 if ($row = mysqli_fetch_array($rs))
151 {
152 $old_nickname = $row["nickname"];
153 $old_email = $row["email"];
154 }
155 else
156 {
157 $result_set["return"]["code"] = -2;
158 $result_set["return"]["message"] = "个人资料不存在";
159
160 mysqli_close($db_conn);
161 exit(json_encode($result_set));
162 }
163
164 mysqli_free_result($rs);
165
166 // Update nickname
167 if ($old_nickname != $nickname)
168 {
169 $sql = "SELECT DISTINCT UID FROM user_nickname WHERE nickname = '$nickname'";
170
171 $rs = mysqli_query($db_conn, $sql);
172 if ($rs == false)
173 {
174 $result_set["return"]["code"] = -2;
175 $result_set["return"]["message"] = "Query nickname error: " . mysqli_error($db_conn);
176
177 mysqli_close($db_conn);
178 exit(json_encode($result_set));
179 }
180
181 $free_change = false;
182 if ($row = mysqli_fetch_array($rs))
183 {
184 if ($row["UID"] == $_SESSION["BBS_uid"]) // Re-use old nickname
185 {
186 $free_change = true;
187 }
188 else // Unavailable nickname
189 {
190 $result_set["return"]["code"] = -1;
191 array_push($result_set["return"]["errorFields"], array(
192 "id" => "nickname",
193 "errMsg" => "昵称已存在",
194 ));
195
196 mysqli_close($db_conn);
197 exit(json_encode($result_set));
198 }
199 }
200 mysqli_free_result($rs);
201
202 if (!$free_change)
203 {
204 $ret = score_change($_SESSION["BBS_uid"], -abs($BBS_nickname_change_fee), "更改昵称", $db_conn);
205 if ($ret < 0)
206 {
207 $result_set["return"]["code"] = -2;
208 $result_set["return"]["message"] = "Query score error: " . mysqli_error($db_conn);
209
210 mysqli_close($db_conn);
211 exit(json_encode($result_set));
212 }
213 else if ($ret > 0)
214 {
215 $result_set["return"]["code"] = -1;
216 array_push($result_set["return"]["errorFields"], array(
217 "id" => "nickname",
218 "errMsg" => "积分不足",
219 ));
220
221 mysqli_close($db_conn);
222 exit(json_encode($result_set));
223 }
224 }
225
226 $sql = "UPDATE user_nickname SET end_dt = NOW(), end_reason = 'C'
227 WHERE UID = " . $_SESSION["BBS_uid"] . " AND end_dt IS NULL";
228
229 $rs = mysqli_query($db_conn, $sql);
230 if ($rs == false)
231 {
232 $result_set["return"]["code"] = -2;
233 $result_set["return"]["message"] = "Update old nickname error: " . mysqli_error($db_conn);
234
235 mysqli_close($db_conn);
236 exit(json_encode($result_set));
237 }
238
239 $sql = "INSERT INTO user_nickname(UID, nickname, begin_dt, begin_reason)
240 VALUES(" . $_SESSION["BBS_uid"] . ", '$nickname', NOW(), 'C')";
241
242 $rs = mysqli_query($db_conn, $sql);
243 if ($rs == false)
244 {
245 $result_set["return"]["code"] = -2;
246 $result_set["return"]["message"] = "Insert new nickname error: " . mysqli_error($db_conn);
247
248 mysqli_close($db_conn);
249 exit(json_encode($result_set));
250 }
251
252 $sql = "UPDATE user_pubinfo SET nickname = '$nickname' WHERE UID = " .
253 $_SESSION["BBS_uid"];
254
255 $rs = mysqli_query($db_conn, $sql);
256 if ($rs == false)
257 {
258 $result_set["return"]["code"] = -2;
259 $result_set["return"]["message"] = "Update nickname error: " . mysqli_error($db_conn);
260
261 mysqli_close($db_conn);
262 exit(json_encode($result_set));
263 }
264 }
265
266 // Update email
267 if ($old_email != $email)
268 {
269 $sql = "SELECT UID FROM user_pubinfo WHERE email = '$email' FOR SHARE";
270
271 $rs = mysqli_query($db_conn, $sql);
272 if ($rs == false)
273 {
274 $result_set["return"]["code"] = -2;
275 $result_set["return"]["message"] = "Query user email error: " . mysqli_error($db_conn);
276
277 mysqli_close($db_conn);
278 exit(json_encode($result_set));
279 }
280
281 if (mysqli_num_rows($rs) >= $BBS_max_user_per_email)
282 {
283 $result_set["return"]["code"] = -1;
284 array_push($result_set["return"]["errorFields"], array(
285 "id" => "email",
286 "errMsg" => "该邮箱的使用次数已超过限制",
287 ));
288
289 mysqli_close($db_conn);
290 exit(json_encode($result_set));
291 }
292 mysqli_free_result($rs);
293
294 // Generate verify code
295 $verify_code = gen_passwd(10);
296
297 $sql = "INSERT INTO user_modify_email_verify (UID, email, verify_code, dt, ip) VALUES(" .
298 $_SESSION["BBS_uid"] . ", '$email', '$verify_code', NOW(), '" . client_addr() . "')";
299
300 $rs = mysqli_query($db_conn, $sql);
301 if ($rs == false)
302 {
303 $result_set["return"]["code"] = -2;
304 $result_set["return"]["message"] = "Update email error: " . mysqli_error($db_conn);
305
306 mysqli_close($db_conn);
307 exit(json_encode($result_set));
308 }
309
310 //Send mail
311 $from = "";
312 $fromname = $BBS_name;
313 $to = $email;
314 $toname = $_SESSION["BBS_username"];
315 $subject = $BBS_name . "修改邮件地址确认";
316 $body = $_SESSION["BBS_username"] . ":\n 您好!\n" .
317 " 请访问以下链接确认更改注册邮件地址:\n" .
318 "https://$BBS_host_name/bbs/user_email_verify.php?code=$verify_code\n\n" .
319 " 感谢您的大力支持!\n\n" .
320 $BBS_name . "\n" . date("Y年m月d日") . "\n";
321
322 $ret = send_mail($from, $fromname, $to, $toname, $subject, $body, $db_conn);
323 if ($ret == false)
324 {
325 $result_set["return"]["code"] = -2;
326 $result_set["return"]["message"] = "Add email error: " . mysqli_error($db_conn);
327
328 mysqli_close($db_conn);
329 exit(json_encode($result_set));
330 }
331 }
332
333 $sql = "UPDATE user_reginfo SET name = '$realname',
334 birthday = '$year-$month-$day', signup_ip='" . client_addr() .
335 "' WHERE UID = " . $_SESSION["BBS_uid"];
336
337 $rs = mysqli_query($db_conn, $sql);
338 if ($rs == false)
339 {
340 $result_set["return"]["code"] = -2;
341 $result_set["return"]["message"] = "Update user reginfo error: " . mysqli_error($db_conn);
342
343 mysqli_close($db_conn);
344 exit(json_encode($result_set));
345 }
346
347 $sql = "UPDATE user_pubinfo SET gender = '$gender', gender_pub = $gender_public,
348 qq = '$qq' WHERE UID =" . $_SESSION["BBS_uid"];
349
350 $rs = mysqli_query($db_conn, $sql);
351 if ($rs == false)
352 {
353 $result_set["return"]["code"] = -2;
354 $result_set["return"]["message"] = "Update user pubinfo error: " . mysqli_error($db_conn);
355
356 mysqli_close($db_conn);
357 exit(json_encode($result_set));
358 }
359
360 $sql = "INSERT INTO user_modify_log(UID, modify_dt, modify_ip, complete) VALUES(".
361 $_SESSION["BBS_uid"] . ", NOW(), '" . client_addr() . "', 1)";
362
363 $rs = mysqli_query($db_conn, $sql);
364 if ($rs == false)
365 {
366 $result_set["return"]["code"] = -2;
367 $result_set["return"]["message"] = "Add log error: " . mysqli_error($db_conn);
368
369 mysqli_close($db_conn);
370 exit(json_encode($result_set));
371 }
372
373 //Send mail
374 $from = "";
375 $fromname = $BBS_name;
376 $to = $old_email;
377 $toname = $_SESSION["BBS_username"];
378 $subject = $BBS_name . "用户资料更改通知";
379 $body = $_SESSION["BBS_username"] . ":\n 您好!\n" .
380 " 您在本站的注册资料已经于" . date("Y年m月d日 H:i:s") . "更改。\n" .
381 " 为了您的个人资料的安全,如果此情况与事实不符,请立即与我们联系。\n\n" .
382 $BBS_name . "\n" . date("Y年m月d日") . "\n";
383
384 $ret = send_mail($from, $fromname, $to, $toname, $subject, $body, $db_conn);
385 if ($ret == false)
386 {
387 $result_set["return"]["code"] = -2;
388 $result_set["return"]["message"] = "Add email error: " . mysqli_error($db_conn);
389
390 mysqli_close($db_conn);
391 exit(json_encode($result_set));
392 }
393
394 // Commit transaction
395 $rs = mysqli_query($db_conn, "COMMIT");
396 if ($rs == false)
397 {
398 $result_set["return"]["code"] = -2;
399 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
400
401 mysqli_close($db_conn);
402 exit(json_encode($result_set));
403 }
404
405 $rs = mysqli_query($db_conn, "SET autocommit=1");
406 if ($rs == false)
407 {
408 $result_set["return"]["code"] = -2;
409 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
410
411 mysqli_close($db_conn);
412 exit(json_encode($result_set));
413 }
414
415 if (send_mail_do($db_conn) < 0)
416 {
417 $result_set["return"]["code"] = -2;
418 $result_set["return"]["message"] = "User updated, but send mail error";
419
420 mysqli_close($db_conn);
421 exit(json_encode($result_set));
422 }
423
424 mysqli_close($db_conn);
425 exit(json_encode($result_set));

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