首先放一張天空之城javascript
Php入門來的第一個小項目,首先作的是一個簡陋的文章管理系統。有登陸、註冊、文章list、添加文章、修改文章、刪除文章、分頁這幾個小功能。php
本文介紹我在登陸、註冊功能上的學習、理解和實踐。html
剛學習完php函數和簡單的html,連js、ajax徹底不會。起初想搞一個美觀優雅的登陸註冊界面,可是礙於能力有限,最後寫了一個宇宙中最無敵簡陋的登陸模板,而後開始寫後端數據處理。java
模板想用的代碼login.phpmysql
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>login page</title> 6 </head> 7 <body> 8 <br> 9 <br> 10 <br> 11 <br> 12 <br> 13 <br> 14 <br> 15 <br> 16 <br> 17 <br> 18 <br> 19 <br> 20 <br> 21 <div> 22 <div style="width: 775px; height: 250px; float: left"> 23 24 </div> 25 <div align="center" style=" background-color: #78c4d8;display: table; height: 250px;width: 450px;box-shadow: 10px 10px 10px #828282; 26 border-radius: 30px"> 27 <div style="height: 89.5px"> 28 29 </div> 30 31 <form action="../Controller/login.php" method="POST" align="center"> 32 登陸 33 <input type="text" name="username1" size="20" maxlength="15" 34 placeholder="請填寫用戶名"> 35 <br> 36 密碼 37 <input type="password" 38 name="password1" size="20" maxlength="15"> <br> 39 <input 40 type="submit" name="submit" value="登陸"> 41 <input type="button" 42 onclick="window.location.href='register.html'" value="註冊"> 43 </form> 44 </div> 45 </div> 46 </body> 47 </html>
別問我面向對象是什麼?我這時候還不懂,啥也不懂,本科沒好好學c++和java,我錯了(已跪)。c++
接着我用面向過程的語言就寫成了這個玩意兒……ajax
login.phpsql
1 <?php 2 session_start(); 3 4 //註銷登陸 5 if(@$_GET['action'] == 'logout') { 6 7 unset($_SESSION['username1']); 8 unset($_SESSION['userID']); 9 echo '註銷登陸成功!點擊此處 <a href="../View/login.html">登陸</a>'; 10 exit; 11 } 12 13 14 $username1 = $_POST ['username1']; 15 $password1 = $_POST ['password1']; 16 17 include "../../../Common/dataBase.php"; 18 19 $check_query = mysqli_query($conn,"select userID from think_userrg where username1='$username1' and password1='$password1' limit 1"); 20 21 22 if ($result = mysqli_fetch_array($check_query)) { 23 //登錄成功 24 $_SESSION['username1'] =$username1; 25 $_SESSION['userID'] =$result['userID']; 26 echo $username1, ',登陸成功!歡迎您!<a href="../View/articleList.php">若是您的瀏覽器沒有自動跳轉,請點擊這裏</a> 27 ' . '<script> 28 setTimeout(function(){window.location.href=\'../View/articleList.php\';},3000) 29 </script>' ; 30 echo '點擊此處 <a href= "login.php?action=logout">註銷</a>登陸!<br />'; 31 exit; 32 } else { 33 die ( '登陸失敗!點擊此處<a href ="javascript:history.back(-1);">返回</a>重試' ); 34 } 35 36 /** 37 * 判斷是否爲 38 * 1.非submit事件 39 * 2.非註銷事件 40 */ 41 if (!isset($_POST['submit']) && !($_GET['action'] == 'logout')){ 42 die('非法訪問!'); 43 } 44 45 ?>
1.用戶名和密碼正確,點擊登陸,能夠成功。數據庫
2.用戶名不存在或者用戶名存在,密碼錯誤,都報錯,跳轉錯誤頁面,返回登陸初始界面。後端
(哦,忘了給看數據庫結構了)
think_userrg表
如下是註冊的模板
平平淡淡纔是真~
代碼以下register.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>register</title> 6 </head> 7 <body> 8 <br> 9 <br> 10 <br> 11 <br> 12 <br> 13 <br> 14 <br> 15 <br> 16 <br> 17 <br> 18 <br> 19 <br> 20 <form action="../Controller/register.php" method="POST" enctype="multipart/form-data" 21 align="center"> 22 23 用戶名: <input type="text" name="username1" size="20" maxlength="15" 24 placeholder="必須填寫用戶名"> <br> 登陸密碼: <input type="password" 25 name="password1" size="20" maxlength="15"> <br> 確認密碼: <input 26 type="password" name="confirmPassword" size="20" maxlength="15"> 27 <br> <input type="submit" name="submit" value="註冊"> <input 28 type="button" name="back" value="返回" 29 onclick="window.location.href='login.html'"> 30 </form> 31 32 </body> 33 </html>
而後是後端register.php
1 <?php 2 include "../../../Common/dataBase.php"; 3 4 if (empty ( $_POST )) { 5 exit ( "您提交的表單數據超過post_max_size!<br>" ); 6 } 7 8 // 判斷輸入密碼與確認密碼是否相同 9 $password1 = $_POST ['password1']; 10 $confirmPassword = $_POST ['confirmPassword']; 11 if ($password1 != $confirmPassword) { 12 exit ('兩次輸入的密碼不相同!<a href ="../View/register.html">返回重試</a>'); 13 } 14 15 $username1 = $_POST ['username1']; 16 17 // 判斷用戶名是否重複 18 $usernameSQL = "select * from userrg where username1 = '$username1'"; 19 $resultSet = mysqli_query ($conn, $usernameSQL ); 20 21 $row = mysqli_fetch_array($resultSet); 22 //判斷用戶名是否存在 23 if ($username1 == $row['username1']) { 24 die ('用戶名被佔用,請更換其餘用戶名<a href ="../View/register.html">返回重試</a>'); 25 }else{ 26 27 $sql = "insert into userrg (username1,password1,confirmPassword) 28 values ('$username1','$password1','$confirmPassword')"; 29 mysqli_query ($conn,$sql); 30 // 註冊成功跳轉到登陸界面 31 die ('註冊成功!點擊此處<a href="../View/login.html">登陸</a>'); 32 } 33 34 35 36 37 ?>
而後就沒了。
你竟然沒走?真的機智!機智如我~ :)
說明一下,以上是其實不是最初的版本,是改了好屢次以後的終於變成我本身代碼的代碼。
接下來是我學習了面向對象以後,對原來代碼的修改。
我師傅說雖然是寫成了一個個類文件,可是仍是有點面向過程的思惟,我本身也以爲是這樣子,我也不敢說,我也不敢問,我就是個年幼的程序猿。
話很少說,直接上代碼。
注意:登陸的註冊功能還應用了兩個文件。我會在末尾也貼出來。
登陸處理代碼Login.php
1 <?php 2 //namespace A; 3 //use A\User; 4 /** 5 * Login類 6 */ 7 require_once '../../Back/User/User.php'; 8 include '../../MySQLDB.php'; 9 10 class Login extends User 11 { 12 function __construct() 13 { 14 } 15 16 public function check($usernm, $userpwd) 17 { 18 19 $arr = array( 20 'dbname' => 'newpage' 21 ); 22 $db = MySQLDB::getInstance($arr); 23 $sql = "select uid from new_user where usernm='$usernm' and userpwd='$userpwd' limit 1"; 24 if ($result = $db->fetchArray($sql) ) { 25 echo $usernm . "歡迎您,點擊<a href='../Article/list.php'>此處</a>跳轉主頁"; 26 } else 27 die("密碼錯誤"); 28 } 29 } 30 31 $usernm = $_POST['usernm']; 32 $userpwd = $_POST['userpwd']; 33 34 $log = new Login(); 35 $log->is_POST(); 36 $a = $usernm; 37 $b = $userpwd; 38 $log->is_empty($a, $b); 39 $log->check($a, $b); 40 41 ?>
註冊處理代碼Register.php
1 <?php 2 // namespace User\Register; 3 4 require_once '../../Back/User/User.php'; 5 include '../../MySQLDB.php'; 6 //var_dump($_POST['usernm']); 7 //var_dump($_POST['userpwd']); 8 9 /** 10 * Register類 11 */ 12 class Register extends User 13 { 14 #註冊帳戶方法 15 function __construct() 16 { 17 18 // $usernm= $_POST['usernm']; 19 // $userpwd=$_POST['userpwd']; 20 // $userrepwd=$_POST['userrepwd']; 21 22 } 23 24 #判斷兩次輸入的密碼是否相同 25 public function pwdSame() 26 { 27 $userpwd = $_POST['userpwd']; 28 $userrepwd = $_POST['userrepwd']; 29 if ($userpwd != $userrepwd) { 30 die ("兩次輸入的密碼不相同!請重試!"); 31 } 32 33 } 34 35 36 37 #將用戶信息寫入數據庫 38 public function query() 39 { 40 $usernm = $_POST['usernm']; 41 $userpwd = $_POST['userpwd']; 42 $createtime = date("Y-m-d H:i:s", time()); 43 $arr = array( 44 'dbname' => 'newpage' 45 ); 46 $db = MySQLDB::getInstance($arr); 47 $sql = "insert into new_user (usernm,userpwd,createtime) value ('$usernm','$userpwd','$createtime')"; 48 if ($result = $db->my_query($sql)) { 49 die('註冊成功!點擊此處<a href="../Login/Login.html">登陸</a>'); 50 } else 51 return false; 52 } 53 54 #加載選擇數據庫信息方法 55 public function dbname() 56 { 57 } 58 } 59 60 61 $usernm = $_POST['usernm']; 62 $userpwd = $_POST['userpwd']; 63 64 65 $reg = new Register(); 66 $a = $usernm; 67 $b = $userpwd; 68 $reg->is_empty($a, $b); 69 70 $reg->is_POST(); 71 $reg->pwdSame(); 72 $reg->is_repeat(); 73 $reg->query(); 74 75 76 ?>
附件1:User.php
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: ts-jinjinying 5 * Date: 2019/6/13 6 * Time: 10:40 7 */ 8 9 //namespace A; 10 11 /** 12 * User類 13 */ 14 class User 15 { 16 /** 17 * 用戶類的屬性 18 * @param string $usernm 用戶名 19 * @param int $uid 用戶ID 20 * @param string $userpwd 密碼 21 * @param string $userrepwd 22 * @param datetime $createtime 建立時間 23 */ 24 public $usernm; 25 public $uid; 26 public $userpwd; 27 public $userrepwd; 28 public $createtime; 29 30 #初始化對象屬性 31 public function __construct($usernm, $userpwd) 32 { 33 $this->usernm = $usernm; 34 $this->userpwd = $userpwd; 35 } 36 37 #判斷是否提交 38 public function is_POST() 39 { 40 if (!(isset($_POST['submit']))) { 41 return false; 42 } 43 } 44 45 #判斷是否爲空 46 public function is_empty($a, $b) 47 { 48 if (empty($a && $b)) 49 die("用戶名或密碼不能爲空"); 50 } 51 52 #判斷用戶名是否重複 53 public function is_repeat() 54 { 55 $usernm = $_POST['usernm']; 56 $arr = array( 57 'dbname' => 'newpage' 58 ); 59 $select = MySQLDB::getInstance($arr); 60 $usernmSql = "select * from new_user where usernm = '$usernm'"; 61 62 $row = $select->fetchRow($usernmSql); 63 if ($usernm == $row['usernm']) { 64 die("用戶名被佔用,請更換其餘用戶名!"); 65 } else { 66 echo "用戶名合法!"; 67 } 68 } 69 70 71 #註銷方法 72 public function logout() 73 { 74 if ('合法') { 75 echo "註銷成功"; 76 } else 77 return false; 78 } 79 80 function __destruct() 81 { 82 } 83 }
附件2:MySQLDB.php
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: ts-jinjinying 5 * Date: 2019/6/14 6 * Time: 8:51 7 */ 8 9 10 /** 11 * Class MySQLDB 12 * MySQLDB工具類 13 */ 14 class MySQLDB 15 { 16 //定義相關的屬性 17 private $host;//主機地址 18 private $port;//端口號 19 private $user;//用戶名 20 private $pass;//密碼 21 private $charset;//字符集 22 private $dbname;//數據庫名 23 //運行時須要的屬性; 24 private $link;//保存鏈接資源 25 private static $instance;//用於保存對象 26 27 /** 28 * MySQLDB constructor. 29 * @param $arr 30 * 構造方法 31 */ 32 private function __construct($arr) 33 { 34 //初始化屬性的值 35 $this->init($arr); 36 //鏈接數據庫 37 $this->my_connect(); 38 //選擇默認字符集 39 $this->my_charset(); 40 //選擇默認數據庫 41 $this->my_dbname(); 42 } 43 44 /** 45 * 得到單例對象的公開的靜態方法 46 * @param array $arr 傳遞給構造方法的參數 47 */ 48 public static function getInstance($arr) 49 { 50 if (!self::$instance instanceof self) { 51 self::$instance = new self($arr); 52 } 53 return self::$instance; 54 } 55 56 private function init($arr) 57 { 58 $this->host = isset($arr['host']) ? $arr['host'] : '127.0.0.1'; 59 $this->port = isset($arr['port']) ? $arr['port'] : '3306'; 60 $this->user = isset($arr['user']) ? $arr['user'] : 'root'; 61 $this->pass = isset($arr['pass']) ? $arr['pass'] : ''; 62 $this->charset = isset($arr['charset']) ? $arr['charset'] : 'utf8'; 63 $this->dbname = isset($arr['dbname']) ? $arr['dbname'] : ''; 64 } 65 66 /** 67 * 鏈接數據庫 68 */ 69 private function my_connect() 70 { 71 //若是鏈接成功,就將鏈接資源保存到$link屬性裏面 72 if ($link = @mysqli_connect("$this->host:$this->port", "$this->user", "$this->pass")) { 73 $this->link = $link; 74 } else { 75 //鏈接失敗 76 77 echo "數據庫鏈接失敗!<br/>"; 78 echo "錯誤編號:", mysqli_errno($this->link), "<br/>"; 79 echo "錯誤信息:", mysqli_error($this->link), "<br/>"; 80 // die; 81 return false; 82 } 83 } 84 85 /** 86 * 錯誤調試方法,執行一條sql語句 87 */ 88 89 public function my_query($sql) 90 { 91 $result = mysqli_query($this->link, $sql); 92 if (!$result) { 93 //執行失敗 94 echo "SQL語句執行失敗<br/>"; 95 echo "錯誤編號:", mysqli_errno($this->link), "<br/>"; 96 echo "錯誤信息:", mysqli_error($this->link), "<br/>"; 97 // die; 98 return false; 99 } 100 return $result; 101 } 102 103 /** 104 * 返回多行多列的查詢結果 105 * @param string $sql 一條sql語句 106 * @return mixed array|false 107 */ 108 public function fetchAll($sql) 109 { 110 //先執行sql語句 111 if ($result = $this->my_query($sql)) { 112 //執行成功 113 //遍歷資源結果集 114 $rows = array(); 115 while ($row = mysqli_fetch_assoc($result)) { 116 $rows[] = $row; 117 } 118 //釋放結果集資源 119 mysqli_free_result($result); 120 //返回全部的數據 121 return $rows; 122 } else { 123 return false; 124 } 125 } 126 127 /** 128 * 返回一行的查詢結果 129 * @param string $sql 一條sql語句 130 * @return mixed array|false 131 */ 132 public function fetchRow($sql) 133 { 134 //先執行sql語句 135 if ($result = $this->my_query($sql)) { 136 //執行成功 137 $row = mysqli_fetch_assoc($result); 138 mysqli_free_result($result); 139 //返回這一條記錄的數據 140 return $row; 141 } else { 142 return false; 143 } 144 } 145 146 147 /** 148 * 返回單行單列的查詢結果(單一值) 149 * @param string $sql 一條sql語句 150 * @return mixed string|false 151 */ 152 public function fetchColumn($sql) 153 { 154 //執行sql語句 155 if ($result = $this->my_query($sql)) { 156 //執行成功 157 $row = mysqli_fetch_row($result); 158 //釋放結果集資源 159 mysqli_free_result($result); 160 //返回這個單一值 161 return isset($row[0]) ? $row[0] : false; 162 } else { 163 //執行失敗 164 return false; 165 } 166 } 167 168 /** 169 * @param $sql 170 * @return array|bool|null 171 * 返回遍歷數據表的全部數據 172 */ 173 public function fetchArray($sql) 174 { 175 //執行sql語句 176 if ($result = $this->my_query($sql)) { 177 //執行成功 178 //遍歷資源結果集 179 $rows = array(); 180 181 while($row = mysqli_fetch_array($result)){ 182 $rows[]= $row; 183 } 184 //釋放結果集資源 185 mysqli_free_result($result); 186 //返回全部數據 187 return $rows; 188 } else 189 return false; 190 } 191 192 193 /** 194 * 選擇默認的字符集 195 */ 196 private function my_charset() 197 { 198 $sql = "set names $this->charset"; 199 $this->my_query($sql); 200 } 201 202 /** 203 * 選擇默認數據庫 204 */ 205 private function my_dbname() 206 { 207 $sql = "use $this->dbname"; 208 $this->my_query($sql); 209 } 210 211 /** 212 * 析構方法 213 */ 214 public function __destruct() 215 { 216 //釋放額外的數據庫鏈接資源 217 mysqli_close($this->link); // TODO: Implement __destruct() method. 218 } 219 220 /** 221 * __sleep方法,序列化對象的時候自動調用 222 */ 223 public function __sleep() 224 { 225 //返回一個數組,數組內的元素爲須要被序列化的屬性名的集合 226 return array('host', 'port', 'user', 'pass', 'charset', 'dbname'); // TODO: Implement __sleep() method. 227 } 228 229 /** 230 * __wakeup方法,反序列化一個對象的時候自動調用 231 */ 232 public function __wakeup() 233 { 234 /**數據庫相關初始化操做*/ 235 236 //鏈接數據庫 237 $this->my_connect(); 238 //選擇默認字符集 239 $this->my_charset(); 240 //選擇默認數據庫 241 $this->my_dbname(); 242 } 243 244 /** 245 * 私有化克隆模式方法,防止經過克隆獲得一個新的對象 246 */ 247 private function __clone() 248 { 249 // TODO: Implement __clone() method. 250 } 251 252 public function __set($name, $value) 253 { 254 // TODO: Implement __set() method. 255 } 256 257 public function __get($name) 258 { 259 // TODO: Implement __get() method. 260 } 261 262 public function __unset($name) 263 { 264 //什麼都不作,表示不能刪除任何屬性 265 } 266 267 public function __isset($name) 268 { 269 // TODO: Implement __isset() method. 270 } 271 }
上面的代碼中有些本文沒有說明,之後有機會會一一說明,也是對我本身代碼的覆盤。
新人練手小項目的分享,一方面是記錄本身的學習,一方面分享給別的正在入門的朋友。
這個標籤還會堅持下去。
tails:第0000 0000 0000 0010篇