【前后端结合】从 0 到 1 实现一个网站框架(一、注册 [1] )

article/2025/11/6 21:57:35

Hi~你好呀,等你很久啦~

我是 LStar,一枚来自北京的初二女生,2020 年年初加入 CSDN。

话不多说,直入主题~(我现在看两年多前我 11 岁那会发的文章,越看越想笑。为了不让四年后 18 岁的我看着这篇文章露出 “一言难尽的笑容”,我还是不扯那么多闲篇了呃)


前言

今年寒假,我自学了前端三件套 & 一点点 PHP,给班级做了一个作业发布网站,效果如下:

(嘿嘿,其实是和我两年半前在 CSDN 认识的曹智铭同学一起做的呀~~他搭建了一个后台,超厉害~~!)

(这个字体也是他的,嘿嘿嘿~~)

其实这也是一个网站框架(已经开源到了 GitHub),但功能非常简陋,纯静态,只有最基本的主页和文章页面,无注册登录/论坛/留言/聊天等动态的多样的功能。

暑假的时候一直在奋战 C++,也就无暇顾及这个 “框架”。

最近,我开始构思,在这个 “框架” 的基础上,开发一个功能更全面,更为 “动态” 的网站框架(点名 WordPress!! 哦当然我不是说我的框架能和 WP 相提并论...)。

于是,我决定从最必要也最基本的(我之前一直不会的)注册登录功能开始写起。


开始吧!

首先当然是注册啦~

这一篇我会搭出样式框架并实现信息判断功能,后续(一周)用 3-4 篇的篇幅将其完善。

当前目录结构:

· sign.css——注册登录页面 CSS 样式

· signup.php——注册页面(主页面)

· signup_success.html——注册成功后跳转至的页面(不是登录页面哦)

先把样式写出来:

sign.css:

/* 注册登录页面 CSS 样式 */body {/* 这里的 position 和 min-height 是为了以后加上 footer 做准备的~(好吧其实 footer 我已经写完了)*/position: relative;min-height: 95vh;background-color: rgb(220, 250, 255);
}.main {/* 也是为了 footer 做准备~ */padding-bottom: 160px;
}h1 {text-align: center;font-size: 40px;
}a {display: block;text-align: center;color: rgb(240, 0, 255);padding-top: 20px;
}a:hover {color: blue;
}a:active {color: yellow;
}

再把注册成功页面写出来...

signup_success.html:

<!-- 注册成功页面 --><!DOCTYPE html>
<html><head><title>注册成功!</title><link rel="stylesheet" href="sign.css"><style>h1 {padding-top: 18%;}</style></head><body><div class="sign"><div class="main"><h1>注册成功!</h1></div></div></body>
</html>

写完这两个,重头戏开始了——注册主页面!

我们首先需要确定,注册时都需要用户填写哪些信息?

我确定了如下几个:手机号、用户名、密码(以及二次输入确认密码)、短信验证码、邮箱和个人网站(后两个选填)。

新建变量:

第一行 $flag 是指示变量,决定是否跳转到注册成功页面。

第二行的变量用于存储用户输入的信息。

第三行的变量用于存储 “输入不符合规范” 时的提示信息(具体输入规范见后文)。

$flag = 0;
$phone = $usern = $pwd = $pwd2 = $verification = $website = $email = "";
$pErr = $nErr = $pwdErr = $pwd2Err = $vErr = $wErr = $eErr = "";

而提交信息,自然要用 PHP 表单咯~

由于有两个是选填信息,我们用 * 来表示必填,没有 * 则为选填。

我希望前端的显示是这样的:

也就是:需输入的项的名称+输入框+(*)+“输入不符合规范” 时的提示信息。

呐,把表单做出来:

(我比较喜欢用 POST,安全,数据长度不受限,而且 url 也会好看呀~)

用 <center></center> 让所有的 input 框居中显示。

<form method="post" action="signup.php"><!--需输入的项的名称+输入框+(*)+“输入不符合规范” 时的提示信息--><center>手机号:<input type="text" name="phone" id="phone_number"><span, class="must">* <?php echo $pErr?></span></center><br><br><center>用户名:<input type="text" name="usern"><span, class="must">* <?php echo $nErr?></span></center><br><br><center>密码:<input type="password" name="pwd"><span, class="must">* <?php echo $pwdErr?></span></center><br><br><center>确认密码:<input type="password" name="pwd2"><span, class="must">* <?php echo $pwd2Err?></span></center><br><br><center>验证码:<input type="text" name="verification"><span, class="must">* <?php echo $vErr?></span></center><br><br><center>个人网站:<input type="url" name="website"><span, class="must"><?php echo $wErr?></span></center><br><br><center>邮箱:<input type="email" name="email"><span, class="must"><?php echo $eErr?></span></center><br><br><center><input type="submit" name="注册" value="注册"></center>
</form>

well,做完表单,就要进入到最关键的——信息判断环节!

在正式开始判断之前,我们需要对用户输入的数据做一些处理...

(每一个函数的具体功能都在注释中写啦~)

// 数据过滤函数
function test_input($data)
{$data = trim($data);    // 移除字符串两侧的空白字符或其他预定义字符$data = stripslashes($data);    // 删除由 addslashes() 函数添加的反斜杠$data = htmlspecialchars($data);    // 把一些预定义的字符转换为 HTML 实体return $data;
}

做好预处理,就开始判断吧!

我们一项一项来。

首先是手机号(它也是数据表的主键)。它是必填项,所以需要先判断是否为空。为空则无需接着进行正则判断,不为空则继续进行正则判断,判断是否为合法手机号。

正则表达式:/^1[3456789]\d{9}$/

手机号完整判断:

// 手机号
if (empty($_POST["phone"]))$pErr = "手机号是必填项哦~";
else
{   $phone = test_input($_POST["phone"]);if (!preg_match("/^1[3456789]\d{9}$/", $phone))   $pErr = "非法的手机号...";else$flag++;
}

接着是用户名。它和手机号一样是必填项,先判断是否为空。为空则无需接着进行正则判断,不为空则继续进行正则判断,判断格式是否正确。

判断标准:不超过 20 个字符且仅包含字母和数字。

正则表达式:/[A-Za-z0-9_]/

用户名完整判断:

// 用户名
if (empty($_POST["usern"]))$nErr = "用户名是必填项哦~";
else
{   $name = test_input($_POST["usern"]);if (strlen($nErr) > 20)$nErr = "用户名不得超过 20 个字符哦~";else{// !/[A-Za-z0-9_]/ 意为:判断【是否不包含】大小写字母和数字;而 !/^[A-Za-z0-9_]$/ 意为:判断【是否不全为】大小写字母和数字if (!preg_match("/[A-Za-z0-9_]/", $name))    // 此处不能加 ^ 和 $$nErr = "用户名不得包含中文和特殊字符!";else$flag++;}
}

接着是密码。判断逻辑同上。

判断标准:长度 > 8 && 长度 <24,同时包含大小写字母和数字。

正则表达式(三个分开):/[A-Z]/、/[a-z]/、/[0-9]/

密码完整判断:

// 密码(长度,是否包含三项)
if (empty($_POST["pwd"]))$pwdErr = "密码是必填项哦~";
else
{$pwd = test_input($_POST["pwd"]);if (strlen($pwd) > 24 || strlen($pwd) < 8)$pwdErr = "密码的长度须在 8-24 之间哦~";else{// /[A-Z]/ 意为:判断【是否包含】大写字母;而 /^[A-Z]$/ 意为:判断【是否全为】大写字母if ((!preg_match("/[A-Z]/", $pwd)) || (!preg_match("/[a-z]/", $pwd)) || (!preg_match("/[0-9]/", $pwd)))$pwdErr = "密码需同时包含大小写字母和数字哦!";else$flag++;}
}

接着是确认密码。只需判断它和密码是否一致即可。

确认密码完整判断:

if (empty($_POST["pwd2"]))$pwd2Err = "确认密码是必填项哦~";
else
{   $pwd2 = $_POST["pwd2"];if ($pwd2 != $pwd)$pwd2Err = "两次输入的密码不一致!";else$flag++;
}

接着是短信验证码。这个我还没有做出来,将在后续文章中完成~。

这里用 111 做的测试,代码如下:

// 验证码
if (empty($_POST["verification"]))$vErr = "验证码是必填项哦~";
else
{      $verification = test_input($_POST["verification"]);// 和发出的验证码不一致// 发送验证码功能暂未开发,此处 111 仅为测试数据if ($verification != "111")    $vErr = "啊哦...验证码错误...";else$flag++;
}

接着是邮箱。它是选填项,所以可以为空。如果不为空则需要进行判断,判断是否为合法的邮箱号。

这里不用正则,用 PHP 自带的 filter_var() 函数。

邮箱完整判断:

// 邮箱
if (empty($_POST["email"]))$flag++;
else
{   $email = test_input($_POST["email"]);if (!filter_var($email, FILTER_VALIDATE_EMAIL))$eErr = "非法的邮箱地址...";else$flag++;
}

接着是个人网站,判断逻辑同上。

正则表达式:/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i

个人网站完整判断:

// 个人网站
if(empty($_POST["website"]))$flag++;
else
{   $website = $_POST["website"];if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $website))$wErr = "非法的 URL...";else$flag++;
}

到现在为止,所有的信息判断就完成啦!!

$flag:到我上场了,嘿嘿...~

前文说过,$flag 是指示变量,决定是否跳转到注册成功页面。

那么,什么时候跳转呢?

——自然是以上七项都满足条件的时候呀~!

而如果以上七项都满足,$flag 的值会为 7。

也就是...

if ($flag == 7)
{// 将所有数据写入数据库header("location: signup_success.html");             
}

(数据库将在下一篇文章中连上哒~)

至此,本篇文章计划需要实现的功能已经全部实现!

梳理一下逻辑~:

 下一篇文章会实现数据库功能,记得来看哦!!~~


全部代码

(sign.css 和 signup_success.html 的代码前面都写过啦~)

sign.php:

<!-- 注册页面 --><!DOCTYPE html>
<html><head><title>注册</title><link rel="stylesheet" href="sign.css"><style>.must {color: red;}</style></head><body><?php$flag = 0;$phone = $usern = $pwd = $pwd2 = $verification = $website = $email = "";$pErr = $nErr = $pwdErr = $pwd2Err = $vErr = $wErr = $eErr = "";// 数据验证if (isset($_POST["注册"])){   // 手机号if (empty($_POST["phone"]))$pErr = "手机号是必填项哦~";else{   $phone = test_input($_POST["phone"]);if (!preg_match("/^1[3456789]\d{9}$/", $phone))   $pErr = "非法的手机号...";else$flag++;}// 用户名if (empty($_POST["usern"]))$nErr = "用户名是必填项哦~";else{   $name = test_input($_POST["usern"]);if (strlen($nErr) > 20)$nErr = "用户名不得超过 20 个字符哦~";else{// !/[A-Za-z0-9_]/ 意为:判断【是否不包含】大小写字母和数字;而 !/^[A-Za-z0-9_]$/ 意为:判断【是否不全为】大小写字母和数字if (!preg_match("/[A-Za-z0-9_]/", $name))    // 此处不能加 ^ 和 $$nErr = "用户名不得包含中文和特殊字符!";else$flag++;}}// 密码(长度,是否包含三项)if (empty($_POST["pwd"]))$pwdErr = "密码是必填项哦~";else{$pwd = test_input($_POST["pwd"]);if (strlen($pwd) > 24 || strlen($pwd) < 8)$pwdErr = "密码的长度须在 8-24 之间哦~";else{// /[A-Z]/ 意为:判断【是否包含】大写字母;而 /^[A-Z]$/ 意为:判断【是否全为】大写字母if ((!preg_match("/[A-Z]/", $pwd)) || (!preg_match("/[a-z]/", $pwd)) || (!preg_match("/[0-9]/", $pwd)))$pwdErr = "密码需同时包含大小写字母和数字哦!";else$flag++;}}// 确认密码if (empty($_POST["pwd2"]))$pwd2Err = "确认密码是必填项哦~";else{   $pwd2 = $_POST["pwd2"];if ($pwd2 != $pwd)$pwd2Err = "两次输入的密码不一致!";else$flag++;}// 验证码if (empty($_POST["verification"]))$vErr = "验证码是必填项哦~";else{      $verification = test_input($_POST["verification"]);// 和发出的验证码不一致// 发送验证码功能暂未开发,此处 111 仅为测试数据if ($verification != "111")    $vErr = "啊哦...验证码错误...";else$flag++;}// 个人网站if(empty($_POST["website"]))$flag++;else{   $website = $_POST["website"];if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $website))$wErr = "非法的 URL...";else$flag++;}// 邮箱if(empty($_POST["email"]))$flag++;else{   $email = test_input($_POST["email"]);if (!filter_var($email, FILTER_VALIDATE_EMAIL))$eErr = "非法的邮箱地址...";else$flag++;}if ($flag == 7){// 将所有数据写入数据库header("location: signup_success.html");}}// 数据过滤函数function test_input($data){$data = trim($data);$data = stripslashes($data);$data = htmlspecialchars($data);return $data;}?><div class="sign"><div class="main"><h1>注册</h1><center><p class="must">* 为必填字段</p></center><form method="post" action="signup.php"><center>手机号:<input type="text" name="phone" id="phone_number"><span, class="must">* <?php echo $pErr?></span></center><br><br><center>用户名:<input type="text" name="usern"><span, class="must">* <?php echo $nErr?></span></center><br><br><center>密码:<input type="password" name="pwd"><span, class="must">* <?php echo $pwdErr?></span></center><br><br><center>确认密码:<input type="password" name="pwd2"><span, class="must">* <?php echo $pwd2Err?></span></center><br><br><center>验证码:<input type="text" name="verification"><span, class="must">* <?php echo $vErr?></span></center><br><br><center>个人网站:<input type="url" name="website"><span, class="must"><?php echo $wErr?></span></center><br><br><center>邮箱:<input type="email" name="email"><span, class="must"><?php echo $eErr?></span></center><br><br><center><input type="submit" name="注册" value="注册"></center></form></div></div></body>
</html>

呐!!!成功啦!!!~~


实现效果

“第一印象”:

(不做任何输入时的页面)

“哦?什么?你不按规定输入?哼哼...”:

(有不合规范的输入时的页面)

 “哎,这就对了嘛~~!”:

(输入全部成功后跳转的页面)

后记

呐~到这里,本篇文章就结束啦~

下一篇(预计 2~3 days later),我会实现数据库功能,记得来看呀~~

 嘿嘿嘿可以写代码了(a当然,上课我不会摸鱼的)。

附上我的 GitHub:https://github.com/Geeker-LStar

(这个框架现在还是私有仓库,更新到十篇文章的时候会开源哒~主要是现在的代码还有一堆 bug  而且目录也超乱呜呜呜)(没错我写了 1024+ 行了,但是还没写文章,因为还有一些隐秘的 bug,而且目录肯定还要改的)

那么,我们下一篇见!

2022-11-20

By Geeker · LStar(李天星)


http://chatgpt.dhexx.cn/article/IeP0G4xD.shtml

相关文章

脚手架搭建网站框架

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 学习之路&#xff0c;长路漫漫&#xff0c;写学习笔记的过程就是把知识讲给自己听的过程。这个过程中&#xff0c;我们去记录思考的过程&#xff0c;便于日后复习&#xff0c;梳理自己的思路。学习之乐&#xff0c;独乐乐&a…

那些开源静态网站框架,快来了解一下

前言 “ 都2022年了&#xff0c;不会还有人没用过静态网站框架吧 ”。看到这句话&#xff0c;很多人不禁会想&#xff1a;网站听过&#xff0c;框架听过&#xff0c;但是静态网站框架我怎么没听过&#xff1f;确实&#xff0c;在没接触Vuepress这类静态网站之前&#xff0c;我…

林轩田机器学习基石-Notes

1.2 whats is machine learning 考虑使用机器学习&#xff0c;相应问题应满足3要素&#xff1a; 问题具有某种特定的模式 pattern问题不好用传统编码的形式解决 program有较为充足的训练数据 data

机器学习基石 7.4 Interpreting VC Dimension

文章目录 VC Bound Rephrase: Penalty for Model ComplexityTHE VC MessageVC Bound Rephrase: Sample ComplexityLooseness of VC BoundFun Time VC Bound Rephrase: Penalty for Model Complexity VC Bound&#xff1a; 改述&#xff1a;好事情发生&#xff08;GOOD&#xf…

机器学习基石(一):什么是机器学习

一、文字定义 机器学习&#xff1a;从data出发&#xff0c;最终目标是提高可以衡量的某方面表现。 可以称为机器学习的话&#xff0c;这个任务必须有如下三点&#xff1a; 必然有某种潜在规律可以学习 例&#xff1a;预测下一次打喷嚏的时刻是奇数还是偶数&#xff0c;这个事情…

1)机器学习基石笔记Lecture1:The Learning Problem

网上关于机器学习的课程有很多&#xff0c;其中最著名的是吴恩达老师的课程&#xff0c;最近又发现了NTU林轩田老师的《机器学习基石》课程&#xff0c;这门课也很好。课程总共分为4部分&#xff0c;总共分为16节课&#xff0c;今天来记录第一节课。 When Can Machines Learn?…

林轩田机器学习基石笔记14:Validation

0. 前言 之前的课程讲解了为了避免overfitting&#xff0c;可以使用regularization方法来解决。在之前的 Ein E i n 上加上一个regularizer&#xff0c;生成 Eaug E a u g &#xff0c;选择合适的 λ λ 将其最小化&#xff0c;通过减小模型复杂度来增加泛化能力。今天将会介绍…

[林轩田]机器学习基石(三)

Lecture 3 Types Of Learning 学习的类型 ppt 3.1 Learning with Different Output Space Y Y 根据不同的输出空间学习分类分析:二元分类、多元分类 回归分析:输出是实数 结构化学习 3.2 Learning with Different Data Label yn" role="presentation" styl…

机器学习基石第十三讲笔记

Lecture 13: Hazard of Overfitting 过拟合的危险 13-1 什么是过拟合 失败的一般化&#xff1a;low Ein&#xff0c;high Eout。 VC维很大的时候&#xff0c;会造成过拟合。 VC维太小的时候&#xff0c;会造成欠拟合。 造成过拟合的原因&#xff1a;过大的VC维&#xff0c…

《机器学习基石》笔记:第一讲

林轩田老师的《机器学习基石》和《机器学习技法》两门课程非常经典&#xff0c;从哲学原理讲到算法核心&#xff0c;深入浅出&#xff0c;非常详细。但存在两个问题&#xff1a; 1.林老师是台湾&#xff08;省&#xff09;人&#xff0c;很多舶来品词语的翻译和大陆不同&#…

机器学习基石 5.4 Break Point

文章目录 1. The Four Growth Functions2. Break Point of $\mathcal{H}$3. The Four Break Points4. Fun Time5. Summary 1. The Four Growth Functions 目前已知的4种成长函数&#xff1a; 如果成长函数是一个多项式&#xff08;polynomial&#xff09;&#xff0c;那么右侧…

机器学习基石:PLA算法代码实现

一、前言 本篇是面向机器学习基石第一次作业而言。 15-20题都是需要编程实现才能正确做出选择。 前面14个选择题&#xff0c;我觉得题目出得并不好。这里就不再多说。主要面向最后的LPA和pocket算法的实现。 代码对应的gitee地址 二、PLA算法实现 数据集中每个样本都是的…

机器学习基石——作业2解答

机器学习基石——作业2解答 这里的 μ 指的是某个h(x)≈f(x)&#xff0c;对应的 Eout(h) 。其中目标函数 f(x) 是确定性的&#xff0c;没有噪声干扰。如果加上噪声&#xff0c;目标函数变为课中讲的概率分布 P(y│x) &#xff0c;表示为 P(y│x){λ1−λyf(x)otherwize \begi…

台湾大学林轩田机器学习基石课程学习笔记3 -- Types of Learning

红色石头的个人网站&#xff1a;redstonewill.com 上节课我们主要介绍了解决线性分类问题的一个简单的方法&#xff1a;PLA。PLA能够在平面中选择一条直线将样本数据完全正确分类。而对于线性不可分的情况&#xff0c;可以使用Pocket Algorithm来处理。本节课将主要介绍一下机器…

林軒田《机器学习基石》课程总结

最近发布了一系列台湾大学资讯工程系林軒田&#xff08;Hsuan-Tien Lin&#xff09;教授开设的《机器学习基石》的课程总结&#xff0c;分为4个部分&#xff0c;点击标题可查看&#xff1a; 机器什么时候能够学习&#xff1f;&#xff08;When Can Machines Learn&#xff1f;…

台大林轩田《机器学习基石》:作业三python实现

台大林轩田《机器学习基石》&#xff1a;作业一python实现 台大林轩田《机器学习基石》&#xff1a;作业二python实现 台大林轩田《机器学习基石》&#xff1a;作业三python实现 台大林轩田《机器学习基石》&#xff1a;作业四python实现 完整代码&#xff1a; https://github…

机器学习基石系列三

课程关联与可学习 核心问题 上界限制 增长上限 上界证明&#xff08;不太懂&#xff09; - step three

林轩田 《机器学习基石》学习笔记

参考资料&#xff1a; 除了redstone的笔记较好之外&#xff0c;还有豆瓣的https://www.douban.com/doulist/3381853/的笔记也比较好 -------------------------------------- 1. 什么时候机器可以学习&#xff1f; 2. 为什么要要使用机器学习&#xff1f; 3. 机器怎么可以学习到…

【机器学习】机器学习基石-林轩田-1-机器学习介绍

机器学习基石-1-机器学习介绍 本节内容What is Machine Learning&#xff1f;What is skill?Why use machine learning?When use machine learning?Key Essence of Machine LearningFun TimeApplications of Machine LearningComponents of Machine Learning相关术语Leanin…

机器学习基石 作业0

机器学习基石 作业0 1 Probability and Statistics2 Linear Algebra3 Caculus网上没找到作业0的答案,这是自己做的版本,有一些可能会有错误,欢迎讨论。 1 Probability and Statistics 用数学归纳法。N=1时满足,假定N=n满足,当N=n+1同样满足。得证。 10个挑4个正面 C 10 4…