1. 程式人生 > >三篇文章帶你極速入門php(三)之php原生實現登陸註冊

三篇文章帶你極速入門php(三)之php原生實現登陸註冊

區別 找不到 oot arr 字符串拼接 value 前端 信任 .get

看下成果

ps:純天然h5,絕不添加任何添加劑(css)以及化學成分(js)(<( ̄ ﹌  ̄)我就是喜歡純天然,不接受任何反駁)
技術分享圖片

關於本文

用原生的php和html做了一個登陸註冊,大概是可以窺見一般php開發的樣子了。不過,low的地方區別提前說一下:

  1. 這個是多入口,一般程序都是單入口,單入口就是統一通過index.php進入,然後再引入其他文件,調用其代碼,多入口就是每次通過不同文件進入(比如一會展示的login.php和register.php)
  2. 保留登陸信息用的是session,現在普遍是前後端分離,一般用cookie或者redis實現session的功能,很少直接使用session的
  3. 連接mysql使用的是mysqli,沒有做封裝,也沒有使用pdo,除了能用沒有其他優點了
  4. 這種樣子的代碼大概是上世紀的風格了,MVC都沒用,看一看好了,真的開發再不濟也要MVC分一下層
  5. 性能杠桿的,不要信任何框架的吹噓,就性能而言,沒有任何框架快得過原生。

準備工作

emmmm,首先用nginx或者Apache創建一個站點指向本地代碼的目錄,然後在host裏配置127.0.0.1指向該站點。(這個就不教了啊,之前講過),然後是一個user庫的sql,和登陸和註冊的前端代碼頁面(不好意思說這是代碼):

  1. sql
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘id‘,
  `username` varchar(64) NOT NULL DEFAULT ‘‘ COMMENT ‘賬號‘,
  `password` varchar(64) NOT NULL DEFAULT ‘‘ COMMENT ‘密碼‘,
  `nickname` varchar(64) NOT NULL DEFAULT ‘‘ COMMENT ‘昵稱‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  1. login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
<form action="login.php" method="post">
    賬 號 <input type="text" name="username"> <br>
    密 碼 <input type="password" name="password"> <br>
    <button type="submit">提交</button>
</form>
<a href="register.html">沒有賬號?註冊</a>
</body>
</html>
  1. register.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Register</title>
</head>
<body>
<form action="register.php" method="post">
    賬 號 <input type="text" name="username"> <br>
    密 碼 <input type="password" name="password"> <br>
    昵 稱 <input type="text" name="nickname"> <br>
    <button type="submit">註冊</button>
</form>
</body>
</html>  

正文

  1. 首頁index.php
    假設我們的網站有個首頁,需要判斷用戶是否登陸,登陸就歡迎他,沒有登陸就讓他去登陸,這個思路我們這麽寫
<?php
session_start(); 
if (!$_SESSION[‘nickname‘]) {
    header("location:login.html");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
Hello <?php echo $_SESSION[‘nickname‘] ?>
</body>
</html>
  1. 這行session_start() 是開啟session,必須在最開始寫,保證我們可以使用session相關的功能
  2. 如果當前session裏沒有存用戶的昵稱,那我們就認為該用戶沒有登陸,跳轉到登陸界面
  3. 跳轉是通過header的方式,參數重location後邊是目標地址
  4. <?php echo $_SESSION[‘nickname‘] ?>這段代碼可以鑲嵌在.php文件的html代碼的任何一個地方,echo出來的字符在html中具有等同的功能
  5. 這樣的就是前後端代碼混雜,如果項目龐大之後非常難於維護
  1. 登陸部分login.php
    這部分處理登陸請求,假設用戶輸入了賬號密碼這樣的數據(前端和後端都應該對數據進行校驗和處理,本文略去),然後拿到用戶信息,判斷用戶密碼是否正確,讓用戶成功登陸或者重新輸入。
<?php
session_start();
$username = $_POST[‘username‘];
$password = $_POST[‘password‘];
$password_md5 = md5(‘study‘.$password);
//連接mysql
$db = new MySQLi("localhost","root","root","allcanadmin",‘8889‘);
$sql = "select * from `user` where `username`= ‘{$username}‘";
$res = $db->query($sql);
$user = $res->fetch_array();
if ($password_md5 == $user[‘password‘]){
    $_SESSION[‘nickname‘] = $user[‘nickname‘];
    header("location:index.php");
}else{
    header("location:".getenv(‘HTTP_REFERER‘));
}  
  1. 首先也是啟用了session,因為登陸登陸成功之後要通過session保存用戶信息這樣才能在其他頁面確認用戶是已經登陸的狀態了。
  2. $_POST和$_GET是php自帶的兩個全局數組,保存了當前請求的post和get參數,比如這次登陸請求的from表單的傳遞用戶名的input標簽的name=username,並且請求方式是post,該參數就會在$_POST數組中,key是input標簽的name,value是input標簽的value。
  3. 業界通用的一個操作,服務器不要存用戶的明文密碼。本文通過用一個字符串拼接然後計算md5之後再保存(這只是一個比較簡單的方式)
  4. new MySQLi(地址,用戶名,密碼,庫名,端口) 創建一個mysqli對象(mysqli是一個更安全更好用的替代原來mysql的擴展,mysql擴展已被棄用),這個對象可以操作mysql庫。
  5. $res = $db->query($sql); mysqli的對象$db運行query方法,執行參數的sql語句,這裏的sql是查詢用戶名為用戶輸入用戶名的數據,保存在結果對象$res裏,再通過結果對象的fetch_array()方法,獲取到結果保存為一個數組。
  6. getenv(‘HTTP_REFERER‘) 獲取環境變量,這裏是取到上一個頁面地址,用來做返回,如果用戶登陸失敗,返回到登陸界面。
  1. 註冊部分register.php
    這部分處理註冊業務,註冊理論上要控制用戶名不能重復,可以通過mysql唯一索引或者代碼處查詢的方式保證唯一,本文采用查詢的方式。
<?php
$username = $_POST[‘username‘];
$password = $_POST[‘password‘];
$password_md5 = md5(‘study‘.$password);
$nickname = $_POST[‘nickname‘];
$db = new MySQLi("localhost","root","root","allcanadmin",‘8889‘);
$sql_select = "select * from `user` where `username`= ‘{$username}‘";
$res_select = $db->query($sql);
if ($res_select){
    header("location:".getenv(‘HTTP_REFERER‘));
}
$sql = "insert into `user` (`username`,`password`,`nickname`) VALUES (‘{$username}‘,‘{$password_md5}‘,‘{$nickname}‘)";
$res = $db->query($sql);
if ($res){
    header("location:login.html");
}else{
    header("location:".getenv(‘HTTP_REFERER‘));
}  

看懂登陸,註冊實現就很容易了,查找不到這個賬號則表明該賬號是可以註冊的,新增一條數據就好了。

寫在最後

三篇文章極速php算是寫完了,大致的流程是這樣

  1. 學一些簡單的php語法(真心覺得php語法不用專門學,用到什麽查什麽 http://php.net/manual/zh/index.php 無所不能),能看懂就行了
  2. 裝一下環境,開發環境用集成的就行,生產環境咱也碰不到啊
  3. 做個小demo,登陸註冊真是不能再簡單了,搬磚的工作大多也就是這樣了,拿參數,走業務,跑sql,反結果。

ps:既然都看到這裏了,不如順便論述一下php的意義。我個人看法,拋去公司接手的是祖傳代碼這個情況之外,php作為一個快速叠代的語言選擇是絕對沒有問題的,用在項目初期或者創業型項目是最佳選擇,更不用說如果做一些cms或者內容展示的項目,php根本就是為之而生的。不論是php是世界上最好的語言還是php已死,都是站在一個角度上的偏見,在不是很小的一個範圍裏,php還是一個很優的選擇。
學一手php,怎麽看都是不虧的。

三篇文章帶你極速入門php(三)之php原生實現登陸註冊