这里的网站是基于web server的网站,比如基于LAMP组合。关于如何在Ubuntu server上安装和设置web server,请参考“设置VirtualBox上的Ubuntu Server来Host网站”。另外,这里的Ubuntu server是安装在VirtualBox,在Windows 10上面host的。当然,web server可以在其他平台运行。关于Ubuntu server的安装,可参考“Windows上安装VirtualBox运⾏Ubuntu Server及SSH登录”。
接下来的网站添加注册/登录界面会用到MySQL和PHP,具体可分别参考https://dev.mysql.com/doc/ 和https://www.w3schools.com/php/。普通网站,比如只是展现个人介绍或者相册的网站,使用html和css是足够的,而且,在本地或者远端都比较容易实现,不需要另外安装软件。如果需要添加用户登录界面,这时候,MySQL和PHP会非常方便。
MySQL可以提供支持数据存储和访问的数据库,PHP是server scripting language,可以非常方便的实现网页的各种动态互动。
一、创建database来保存用户信息
1. 登录MySQL
使用root连接MySQL
sudo mysql -u root
或者使用已经有授权的其他用户登录mysql,可使用
sudo mysql -u -p
回车之后会被要求输入相应的密码来登录。
2. 这里列出一些mysql的基本命令,具体可以参考https://dev.mysql.com/doc/ 。
列出所有databae:
SHOW DATABASES;
如果没有登录MySQL,也可以执行:
sudo mysql -u -p -e “SHOW DATABASES;”
列出所有用户:
SELECT user FROM mysql.user;
列出现在的用户:
SELECT user();
列出所有的table:
USE <databaseName> ;
SHOW TABLES;
或者
SHOW TABLES FROM <databaseName>;
3. 创建用户表格
在MySQL里运行一下命令:
———————————————————————————
CREATE TABLE users (
id INTNOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(100) NOT NULL UNIQUE,
username VARCHAR(50)NOT NULL UNIQUE,
password VARCHAR(50)NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
———————————————————————————
也可以把上面的命令添加到text文件里,比如file.txt,在mysql里执行:
\. /path/to/file/file.txt
如需要删除表格(注意,信息会被删除,不可恢复):
DROP TABLE users;
二、创建配置文件
这里使用PHP来连接database server,创建配置文件config.php,它主要声明访问database的登录信息。由于文件包含用户信息,这里不要把文件放在public_html,share等公共访问路径中。注意替换相应的username和password。
———————————
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'test');
define('DB_PASSWORD', 'test1234');
define('DB_NAME', 'testDB');
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
if ($link == false) {
die("error: could not connect. " .mysqli_connect_error());
}
?>
———————————
三、创建注册/登录页面
由于页面的创建方法类似,这里仅用用户注册页面为例。注册页面通常以表格的形式来收集信息,并将信息对比存储在数据库里的用户信息来决定是否创建新的用户;如果创建,实质上是在数据库里面添加新的用户信息。登录页面则根据用户提供的信息,对比数据库里面的信息,验证是否正确及下一步操作。
对于PHP不熟悉的话,建议参考https://www.w3schools.com/php/ 。在创建PHP文件时,可以打开错误提示,这样运行的时候,就很容易知道哪里出了问题。打开错误提示,这里有两步:
一是在PHP文件中包括以下几行:
————————————
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
————————————
二是在/etc/php/7.X/apache2/php.ini中打开display_errors (X这里为版本,比如7.4):
display_errors = On
基本的signup.php文件通常包括以下几个区块:
1. 使用配置文件:这里是指上文中的config.php,用法,
require_once(“/path/to/config.php”);
2. 设置储存用户信息的变量:比如username,email, password,confirm password等。对于每一个变量,可对应一个错误提示变量。这些变量初值为空,然后根据用户填写的信息, 获得真实值:
$email = $username = $password = $confirm_password = "";
$email_err = $username_err = $password_err = $confirm_password_err = "";
3. 一旦用户提交信息,需要跟数据库比对来决定是否可以创建新的用户。这里可以用emai或者username等具有唯一性的变量来判断。其他变量的访问与存储类似。这里只列出一个例子:
————————————————————————————————
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty(trim($_POST["email"]))) {
$email_err = "Please enter an email address.";
}
else {
$sql = "SELECT id FROM users WHERE email = ?";
if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, "s", $param_email);
$param_email = trim($_POST["email"]);
if (mysqli_stmt_execute($stmt)) {
mysqli_stmt_store_result($stmt);
if (mysqli_stmt_num_rows($stmt) == 1) {
$email_err = "error: this email address is already taken.";
}
else {
$email = trim($_POST["email"]);
}
}
else {
echo "Something was wrong! Please try again later.";
}
mysqli_stmt_close($stmt);
}
}
———————————————————————————————
当然,还可以根据需要,添加相应的功能,比如验证是否为有效的email,以及字符串长度等。用户填写的信息,基本上可以分为三类:
(i).信息不符合要求:提醒重新注册
(ii).用户已经存在:可以导向登录页面
(iii).可以注册新用户:添加信息到数据库,并导向登录页面
这里只针对(iii)给出一个例子:
—————————————————————————————————
if (empty($email_err) && empty($username_err) && empty($password_err) && empty($confirm_password_err)) {
$sql = "INSERT INTO users (email, username, password) VALUES (?, ?, ?)";
if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, "sss", $param_email, $param_username, $param_password);
$param_email = $email;
$param_username = $username;
$param_password = password_hash($password, PASSWORD_DEFAULT);
if(mysqli_stmt_execute($stmt)){
header("location: login.php");
}
else{
echo "Something was wrong! Please try again later.”;
}
mysqli_stmt_close($stmt);
}
}
——————————————————————————————————
4. 接下来就是html网页本身的内容。这里主要是指显示可以让用户填写信息的表格,其具体形式可以通过css来实现。这里以email为例,其他类似。
——————————————————————————————————————
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($email_err)) ? 'has-error' : ''; ?>">
<label>Email</label>
<input type="text" name="email" class="form-control" value="<?php echo
$email; ?>">
<span class="help-block"><?php echo $email_err; ?></span>
</div>
</form>
—————————————————————————————————————
登录页面可以参考上面的注册页面创建。完整的登录系统会涉及更多的功能,比如忘记密码,密码重置,欢迎页面等,其创建方法类似。这些PHP文件创建完成之后,可以在远程电脑或者手机上,通过相应的IP 地址和Port信息,进行访问和测试。具体可以参考“设置VirtualBox上的Ubuntu Server来Host网站”。比如对应的web server的IP为1.2.3.4, port为2222,则可以访问位于/var/www/html下面的public_html的signup.php:
http://1.2.3.4:2222/signup.php
如果添加了PHP错误提示,会给出具体的错误类型和位置。对应的注册和登录PHP文件,也可以通过href镶嵌到其他html文件中。