一、匹配數(shù)據(jù)庫登錄 步驟: 1.做一個(gè)普通的登錄界面,,注意提交方式為post,。 <!--登錄界面-->
<form action="chuli.php" method="post"><!--表單提交action到chuli界面,提交方式設(shè)置為post,。-->
<div>用戶名:<input type="text" name="uid"/></div> <!--用戶名輸入框-->
<div>密碼:<input type="password" name="pwd" /></div> <!--密碼輸入框-->
<div><input type="submit" value="登錄" /></div>
</form>
2.用php匹配用戶輸入的用戶名和密碼 (1)**下面方法存在可以被SQL注入攻擊的危險(xiǎn),,安全性太低,要記住這種攻擊的原理,,在以后的工作中切記不能這樣匹配登錄信息,。 <!--把html代碼全部刪除,做一個(gè)純php處理界面-->
<?PHP
$uid = $_POST["uid"];//預(yù)定義數(shù)組_POST取跳轉(zhuǎn)頁面?zhèn)鬟f過來的數(shù)據(jù),,也就是取text界面中用戶名和密碼輸入的值,。把取到的值交給變量$uid
$pwd = $_POST["pwd"];//取到的密碼交給變量$pwd
//取到這兩個(gè)值之后,就要去判斷用戶名和密碼是否匹配成功,。
//造連接對象
$db = new MySQLi("localhost","root","666","text1");
//判斷是否連接成功
mysqli_connect_error()?die("連接失敗"):"";
//使用數(shù)據(jù)庫中的login表驗(yàn)證
//寫SQL語句
//SQL注入攻擊
$sql = "select count(*) from login where username='{$uid}' and password='{$pwd}'";//查詢有幾條數(shù)據(jù)可以匹配成功,,等于0則沒有,大于0則匹配成功,。'{$pwd}'中''是說明這是一個(gè)字符串,,外面有"",這里就要用'',,{}是為了特殊說明這里是一個(gè)變量,。
//執(zhí)行sql語句
$result = $db->query($sql);//返回結(jié)果集對象
$n = $result->fetch_row();//這里的$result是一個(gè)對,存到變量$n里面,。
if($n[0]>0)//n>0代表能夠匹配到,,就能夠登陸成功。然后跳轉(zhuǎn)到主頁面,。在外部再建一個(gè)主頁面main.php.$n是一個(gè)數(shù)組,,要取里面的元素來判斷。
{
header("location:main.php");//header方法表示跳轉(zhuǎn)頁面,,()里面寫location,,冒號,,跳轉(zhuǎn)頁面的名稱。
}
else//如果匹配不成功
{
echo "用戶名或密碼錯(cuò)誤";//輸出 用戶名或密碼錯(cuò)誤
}
//上面的方法能夠?qū)崿F(xiàn)匹配數(shù)據(jù)庫的功能,,但是做登錄$sql語句一般不能這么寫,,需要?jiǎng)e的方法寫$sql語句,因?yàn)檫@種$sql語句做登錄不安全,。比如說在登錄名和密碼欄里都輸入a' or '1'='1也能跳轉(zhuǎn)到主頁面,,可以破解這種登錄方法,稱為SQL注入攻擊,,其原理是通過輸入特定的字符串來修改sql語句,,原來sql語句的意思完全變了。
(2).用php匹配用戶輸入的用戶名和密碼 防止SQL注入攻擊的方法:針對php來說的話,,要么優(yōu)化自己寫的語句,,要么把用戶輸入的內(nèi)容處理一下,永遠(yuǎn)不要相信用戶的任何輸入數(shù)據(jù),,這是做程序的常識,。 處理用戶輸入內(nèi)容是先自己寫一個(gè)函數(shù)去判斷用戶輸入的內(nèi)容里面有沒有特殊符號,像or,、and,、‘’等。如果有的話就去掉,。 后面還會(huì)學(xué)另一種方法pdo提供的一種方式,是最好的解決方案,,其方法是先把這條sql語句分兩次發(fā)動(dòng)給服務(wù)器,,第一次發(fā)送寫好的sql語句框架,變量先不發(fā)送,,mysql數(shù)據(jù)庫接收到以后先等待執(zhí)行,,然后再把用戶輸入的內(nèi)容提交過去,這樣就把字符串拆開了,,后來給的內(nèi)容就是要查的內(nèi)容,,數(shù)據(jù)庫就會(huì)原樣的去匹配。 我們下面采用優(yōu)化sql語句的方法來防止注入攻擊,。sql語句換一種寫法,。 $db = new MySQLi("localhost","root","666","text1");
mysqli_connect_error()?die("連接失敗"):"";
$sql = "select password from login where username='{$uid}'";//先根據(jù)uid找到對應(yīng)的密碼,這樣最多只能找到一條數(shù)據(jù),。這樣fetch_row()最多能取到1列,。
//執(zhí)行sql語句
$result = $db->query($sql);
$n = $result->fetch_row();
if($uid !="" && $pwd !="")//防止出現(xiàn)代碼下面所說的bug。
{
if($n[0]==$pwd)//判斷從數(shù)據(jù)庫中找到的密碼和用戶輸入的密碼是不是一樣,。
{
header("location:main.php");//如果相等局跳轉(zhuǎn)
}
else
{
echo "用戶名或密碼錯(cuò)誤";//如果不相等就出現(xiàn)提示
}
}
else//如果用戶名或者密碼不輸入彈出的信息
{
echo "用戶名或密碼不能為空";
}
//這樣寫的優(yōu)點(diǎn)就是不管用戶名怎么寫,,密碼就是固定的密碼,。驗(yàn)證兩個(gè)密碼是不是一樣。
//這種方法還會(huì)有個(gè)bug就是用戶名和密碼都輸入錯(cuò)誤也能登陸,,因?yàn)閿?shù)據(jù)庫中沒有改用戶名就會(huì)輸出null,,密碼輸錯(cuò)了也會(huì)返回null,正好會(huì)匹配上,。這樣就在外面再加上一個(gè)if判斷輸入的內(nèi)容是不是空的,,如果是空的就彈出提示信息。
二,、將數(shù)據(jù)庫中info表中的信息以表格的相識顯示在頁面中 (1)在網(wǎng)頁上顯示出數(shù)據(jù) <table width="100%" border="1" cellpadding="0" cellspacing="0">
<tr><!--做表頭-->
<td>代號</td>
<td>姓名</td>
<td>性別</td>
<td>民族</td>
<td>生日</td>
</tr>
<?php //做表的內(nèi)容,,嵌入php代碼
//造連接對象
$db = new MySQLi("localhost","root","666","text1");
//寫sql語句
$sql = "select *from info";
//執(zhí)行sql語句
$result = $db->query($sql);
//讀數(shù)據(jù),返回一個(gè)二維數(shù)組
$attr = $result->fetch_all();
//將二維數(shù)組里面的數(shù)據(jù)顯示出來
foreach($attr as $v)
{
echo"<tr>";
echo"<td>{$v[0]}</td><td>{$v[1]}</td><td>{$v[2]}</td><td>{$v[3]}</td><td>{$v[4]}</td>";//當(dāng)行數(shù)比較多時(shí)者采用下面的寫法,。
/*foreach($v as $v1)//$v1就是變量了,,二不是數(shù)組了。
{
echo "<td>{$v1}</td>";
}*/
echo"</tr>";
}
?>
</table>
<!--以上代碼會(huì)顯示出info表的信息,,但是sex欄顯示的是0或1,,而不是男或女,nation欄顯示的也是民族的代號-->
(2)網(wǎng)頁表格中的性別顯示為男,、女和民族欄顯示出民族的名稱 只更改php中的代碼,,其它地方的代碼不變。 <?php
$db = new MySQLi("localhost","root","666","text1");
$sql = "select *from info";
$result = $db->query($sql);
$attr = $result->fetch_all();
foreach($attr as $v)
{
echo"<tr>";
$sex = $v[2]?"男":"女";//$v[2]里面顯示的是sex,,內(nèi)容是0和1,,現(xiàn)在要轉(zhuǎn)化為男和女。最簡單的是用三元運(yùn)算符寫,。用變量$sex接收,,然后把$sex放到表格中替換$v[2]。就會(huì)顯示男女了,。
//$v[3]是民族的那一列,nation有另外一張表,,要根據(jù)民族代號查詢民族名稱。上面鏈接對象已經(jīng)造好了,,不需要再鏈接數(shù)據(jù)庫了,,用同一個(gè)連接就可以。直接寫sql語句
$sname = "select name from nation where code='{$v[3]}'";//根據(jù)民資代號查詢民族名稱
$rname = $db->query($sname);//返回結(jié)果集
$aname = $rname->fetch_row();//返回一個(gè)數(shù)組,$aname[0]里面就是存的民族名稱,,直接代替$v[3].
echo"<td>{$v[0]}</td><td>{$v[1]}</td><td>{$sex}</td><td>{$aname[0]}</td><td>{$v[4]}</td>";
/*foreach($v as $v1)//$v1就是變量了,,二不是數(shù)組了。
{
echo "<td>{$v1}</td>";
}*/
echo"</tr>";
}
?>
如果覺得顯示民族的代碼寫在foreach里面顯得太亂,,還可以封裝一個(gè)函數(shù),,調(diào)用這個(gè)函數(shù)來顯示民的名稱,具體寫法如下,,也是只寫php里面的代碼,。 <?php
$db = new MySQLi("localhost","root","666","text1");
$sql = "select *from info";
$result = $db->query($sql);
$attr = $result->fetch_all();
foreach($attr as $v)
{
echo"<tr>";
$sex = $v[2]?"男":"女";//$v[2]里面顯示的是sex,,內(nèi)容是0和1,現(xiàn)在要轉(zhuǎn)化為男和女,。最簡單的是用三元運(yùn)算符寫,。用變量$sex接收,然后把$sex放到表格中替換$v[2],。就會(huì)嫻熟男女了,。
//根據(jù)民族代號查詢民族名稱
$name = NationName($v[3]);//調(diào)用封裝的函數(shù),根據(jù)民族代號顯示出民族名稱,。
echo"<td>{$v[0]}</td><td>{$v[1]}</td><td>{$sex}</td><td>{$name}</td><td>{$v[4]}</td>";
/*foreach($v as $v1)//$v1就是變量了,,二不是數(shù)組了。
{
echo "<td>{$v1}</td>";
}*/
echo"</tr>";
}
//封裝下面的函數(shù),,這個(gè)函數(shù)的作用是給一個(gè)民族代號,,返回民族名稱。
function NationName($code)
{
$db = new MySQLi("localhost","root","666","text1");
$sql = "select name from nation where code = '{$code}'";
$result = $db->query($sql);
$attr = $result->fetch_row();
return $attr[0];
}
?>
(3)對表格增加刪除的功能,,每行后面都加一個(gè)刪除按鈕,,點(diǎn)擊后從數(shù)據(jù)庫中刪除該條數(shù)據(jù)。 main.php頁面中的代碼如下:(后面帶注釋的就是需要修改的) <table width="100%" border="1" cellpadding="0" cellspacing="0">
<tr><!--做表頭-->
<td>代號</td>
<td>姓名</td>
<td>性別</td>
<td>民族</td>
<td>生日</td>
<td>操作</td><!--添加一列,,做刪除列-->
</tr>
<?php
$db = new MySQLi("localhost","root","666","text1");
$sql = "select *from info";
$result = $db->query($sql);
$attr = $result->fetch_all();
foreach($attr as $v)
{
echo"<tr>";
$sex = $v[2]?"男":"女";
$name = NationName($v[3]);
echo"<td>{$v[0]}</td><td>{$v[1]}</td><td>{$sex}</td><td>{$name}</td><td>{$v[4]}</td><td><a href='shanchu.php?c={$v[0]}' onclick=\"return confirm('確定刪除嗎,?')\">刪除</a></td";
</table>
shanchu.php頁面中的代碼: <?php //做刪除頁面,,這種頁面是不讓用戶看到的頁面,把html代碼全部刪掉,。
$code = $_GET["c"];//取出來傳過來的值,,傳的c,,就取c的值。把c的值放在主鍵code里面,。
//造連接對象
$db = new MySQLi("localhost","root","666","text1");
$sql = "delete from info where code='{$code}'";//根據(jù)傳過來的值刪除數(shù)據(jù)庫對應(yīng)的數(shù)據(jù)
$r = $db->query($sql);
if($r)
{
header("location:main.php");//如果執(zhí)行成功,,就跳轉(zhuǎn)到主頁面main.php
}
else
{
echo "刪除失敗";
}
(4)對表格增加添加功能 a.先在main.php頁面里面添加一個(gè)添加數(shù)據(jù)的按鈕,寫在table后面就可以,。點(diǎn)擊添加數(shù)據(jù)按鈕后跳轉(zhuǎn)到頁面add.php,。 <a href="add.php"><input type="button" value="添加數(shù)據(jù)" /></a><!--做一個(gè)添加按鈕,點(diǎn)擊添加數(shù)據(jù),,跳轉(zhuǎn)到add.php頁面執(zhí)行,。-->
b.做一個(gè)add.php頁面,該頁面是讓用戶填寫要添加的數(shù)據(jù),,下方有“添加”的提交按鈕,,點(diǎn)擊“提交”按鈕跳轉(zhuǎn)到addchuli.php頁面。但是在填寫數(shù)據(jù)時(shí),,性別要填寫0或者1,,民族要填寫民族代號,后面會(huì)有解決方法,。 <!--做添加的界面-->
<form action="addchuli.php" method="post">
<div>代號:<input type="text" name="code" /></div>
<div>姓名:<input type="text" name="name" /></div>
<div>性別:<input type="text" name="sex" /></div>
<div>民族:<input type="text" name="nation" /></div>
<div>生日:<input type="text" name="birthday" /></div>
<div><input type="submit" value="添加" /></div><!--做個(gè)添加按鈕-->
</form>
addchuli.php頁面代碼,,填寫完數(shù)據(jù)以后點(diǎn)擊“添加”,跳轉(zhuǎn)到此頁面處理,,處理完以后再跳轉(zhuǎn)回主頁面,。 <?php //處理界面,把html代碼全部刪除
$code = $_POST["code"];//取到傳過來的所有的值
$name = $_POST["name"];
$sex = $_POST["sex"];
$nation = $_POST["nation"];
$birthday = $_POST["birthday"];
//造連接對象
$db = new MySQLi("localhost","root","666","text1");
$sql = "insert into info values('{$code}','{$name}',{$sex},'{$nation}','{$birthday}')";//波爾型數(shù)據(jù)往里添加時(shí)不能有‘’,,添加字符串的話永遠(yuǎn)返回的是true,。
$db->query($sql);
header("location:main.php");//往數(shù)據(jù)庫里添加完數(shù)據(jù)以后再返回主頁面。
c.解決b中提到的缺陷,。并且將性別選項(xiàng)做成單選按鈕,,將民族做成下拉菜單。 <!--做添加的界面-->
<form action="addchuli.php" method="post">
<div>代號:<input type="text" name="code" /></div>
<div>姓名:<input type="text" name="name" /></div>
<div>性別:
<input type="radio" name="sex" value="1" checked="checked" />男<!--將性別作成單選按鈕-->
<input type="radio" name="sex" value="0" />女
</div>
<div>民族:
<select name="nation">
<?php
//造連接對象
$db = new MySQLi("localhost","root","666","text1");
$sql = "select * from nation";
$result = $db->query($sql);
$attr = $result->fetch_all();
foreach($attr as $v)
{
echo "<option value='$v[0]'>{$v[1]}</option>";//表單提交的時(shí)候是提交的value值,,$v[1]僅僅是顯示用的,,value值$v[0]才是要提交的數(shù)據(jù),下拉菜單選中哪一項(xiàng)就提交哪一項(xiàng)的value值,。
}
?>
</select>
</div>
<div>生日:<input type="text" name="birthday" /></div>
<div><input type="submit" value="添加" /></div><!--做個(gè)添加按鈕-->
</form>
|
|