登入功能(三)
之前的準(zhǔn)備工作及登入的前端頁面都做好了,現(xiàn)在我們來介紹登入的功能程式碼。
先建立一個login.php的文件,用來寫我們的登入php程式碼,
#第一步就是要先連接資料庫,不然就取得不到資料庫裡的信息,程式碼如下:
<?php $link = mysqli_connect("localhost","root","root","joke");//注意后面的這幾個參數(shù),服務(wù)器名,數(shù)據(jù)庫的用戶名,密碼,數(shù)據(jù)庫名。密碼沒有可以不填 if (!$link) { die("連接失敗: " . mysqli_connect_error()); } ?>
第二步:不管是使用者名稱也好還是密碼也好,我們都是透過前臺的表單傳遞值到php程式中,然後再進(jìn)行驗(yàn)證,所以,我們接下來就是要先要取得前臺表單傳遞過來的值是多少,才能去驗(yàn)證它的對和錯,取得值的程式碼如下:
<?php $username = $_POST['username']; $password = $_POST['password']; ?>
我們?yōu)槭颤N是post而不是get呢?這就需要看下我們前臺的表單了,看form標(biāo)籤中的信息:
<form action="login.php" method="post"> ... </form>
action是講信息提交到哪裡,method是通過什麼方式傳遞,這裡我們是post方法
第三步:我們?nèi)〉玫街抵峋托枰ヲ?yàn)證這個值和資料庫中的是不是一樣的,必須都相同才可以登錄,驗(yàn)證程式碼如下:
<?php $sql="select * from login where username = '{$username}' and password = '{$password}'";//先從數(shù)據(jù)庫中查詢戶名和密碼 $rs=mysqli_query($link,$sql); //執(zhí)行sql查詢 $row=mysqli_fetch_array($rs);//將查詢的結(jié)果放入變量$row中 ?>
第四步:查詢到結(jié)果之後,我們就要開始進(jìn)行驗(yàn)證了:
<?php if($row) { if ($username == $row['username'] && $password == $row['password']) //判斷表單獲取的用戶名,密碼和數(shù)據(jù)庫中的是否一致 { echo "登陸成功,正在為你跳轉(zhuǎn)至后臺頁面"; header("location:index.html");//如果一致會跳轉(zhuǎn)到后臺的首頁 } }else{ echo "賬號或密碼錯誤" . "<br/>"; echo "<a href='login.html'>返回登陸頁面</a>";//如果不一致,將重新跳轉(zhuǎn)至登錄頁面重新登錄 } ?>
好像漏了點(diǎn)什麼?
...
...
驗(yàn)證碼好像沒說....
最後我們來說下驗(yàn)證碼。
我們需要一個產(chǎn)生驗(yàn)證碼的程序,先建立個PHP文件,叫passcode.php,用來寫驗(yàn)證碼產(chǎn)生。
下面我將驗(yàn)證碼的詳細(xì)寫法寫出來,每個重點(diǎn)難點(diǎn)都會有註釋,方便你們?nèi)ダ斫?,注意,看碼:
<?php //設(shè)置開啟session session_start(); $image = imagecreatetruecolor(100, 30); //設(shè)置驗(yàn)證碼圖片大小的函數(shù) //設(shè)置驗(yàn)證碼顏色,用法:imagecolorallocate(int im, int red, int green, int blue); $bgcolor = imagecolorallocate($image,255,255,255); //#ffffff //區(qū)域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的區(qū)域著色,col 表示欲涂上的顏色 imagefill($image, 0, 0, $bgcolor); //設(shè)置變量 $captcha_code = ""; //生成隨機(jī)數(shù)字 for($i=0;$i<4;$i++){ //設(shè)置字體大小 $fontsize = 10; //設(shè)置字體顏色,隨機(jī)顏色 $fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深顏色 //設(shè)置數(shù)字 $fontcontent = rand(0,9); //10>.=連續(xù)定義變量 $captcha_code .= $fontcontent; //設(shè)置坐標(biāo) $x = ($i*100/4)+rand(5,10); $y = rand(5,10); imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); } //存到session $_SESSION['authcode'] = $captcha_code; //增加干擾元素,設(shè)置雪花點(diǎn) for($i=0;$i<200;$i++){ //設(shè)置點(diǎn)的顏色,50-200顏色比數(shù)字淺,不干擾閱讀 $pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200)); //imagesetpixel — 畫一個單一像素 imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor); } //增加干擾元素,設(shè)置橫線 for($i=0;$i<4;$i++){ //設(shè)置線的顏色 $linecolor = imagecolorallocate($image,rand(80,220), rand(80,220),rand(80,220)); //設(shè)置線,兩點(diǎn)一線 imageline($image,rand(1,99), rand(1,29),rand(1,99), rand(1,29),$linecolor); } //設(shè)置頭部,image/png header('Content-Type: image/png'); //imagepng() 建立png圖形函數(shù) imagepng($image); //imagedestroy() 結(jié)束圖形函數(shù) 銷毀$image imagedestroy($image); ?>
如果想形象的具體的了解每行程式碼的功能,你可以講程式碼更改(盡量與之前差異很大,這樣才明顯),然後看其變化,和之前會有什麼不一樣,這樣,你就知道這行程式碼的作用了。
接下來就是驗(yàn)證碼的驗(yàn)證了,看碼:
<?php //判斷驗(yàn)證碼是否填寫并且是否正確 if(!$_POST['code']){ //首先判斷前端頁面是否有驗(yàn)證碼的值傳過來,沒有就提示驗(yàn)證碼不能為空 echo('驗(yàn)證碼不能為空'); return; }else if($_POST['code']!=$_SESSION['authcode']){ //如果有,判斷是否正確 echo('驗(yàn)證碼不正確'); return; } ?>
好了,這就是我們的完整的一個登陸功能。