10月28日下午MySQL数据库的增加、删除、查询(匹配数据库登录和可以增、删、查的显示数据库内容的页面))
一、匹配数据库登录
步骤:
1.做一个普通的登录界面,注意提交方式为post。
<!--登录界面--> <form action="chuli.php" method="post"><!--表单提交action到chuli界面,提交方式设置为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注入攻击的危险,安全性太低,要记住这种攻击的原理,在以后的工作中切记不能这样匹配登录信息。
<!--把html代码全部删除,做一个纯php处理界面--> <?PHP $uid = $_POST["uid"];//预定义数组_POST取跳转页面传递过来的数据,也就是取text界面中用户名和密码输入的值。把取到的值交给变量$uid $pwd = $_POST["pwd"];//取到的密码交给变量$pwd //取到这两个值之后,就要去判断用户名和密码是否匹配成功。 //造连接对象 $db = new MySQLi("localhost","root","666","text1"); //判断是否连接成功 mysqli_connect_error()?die("连接失败"):""; //使用数据库中的login表验证 //写SQL语句 //SQL注入攻击 $sql = "select count(*) from login where username='{$uid}' and password='{$pwd}'";//查询有几条数据可以匹配成功,等于0则没有,大于0则匹配成功。 //执行sql语句 $result = $db->query($sql);//返回结果集对象 $n = $result->fetch_row();//这里的$result是一个对,存到变量$n里面。 if($n[0]>0)//n>0代表能够匹配到,就能够登陆成功。然后跳转到主页面。在外部再建一个主页面main.php.$n是一个数组,要取里面的元素来判断。 { header("location:main.php");//header方法表示跳转页面,()里面写location,冒号,跳转页面的名称。 } else//如果匹配不成功 { echo "用户名或密码错误";//输出 用户名或密码错误 } //上面的方法能够实现匹配数据库的功能,但是做登录$sql语句一般不能这么写,需要别的方法写$sql语句,因为这种$sql语句做登录不安全。比如说在登录名和密码栏里都输入a' or '1'='1也能跳转到主页面,可以破解这种登录方法,称为SQL注入攻击,其原理是通过输入特定的字符串来修改sql语句,原来sql语句的意思完全变了。
(2).用php匹配用户输入的用户名和密码
防止SQL注入攻击的方法:针对php来说的话,要么优化自己写的语句,要么把用户输入的内容处理一下,永远不要相信用户的任何输入数据,这是做程序的常识。
处理用户输入内容是先自己写一个函数去判断用户输入的内容里面有没有特殊符号,像or、and、‘’等。如果有的话就去掉。
后面还会学另一种方法pdo提供的一种方式,是最好的解决方案,其方法是先把这条sql语句分两次发动给服务器,第一次发送写好的sql语句框架,变量先不发送,mysql数据库接收到以后先等待执行,然后再把用户输入的内容提交过去,这样就把字符串拆开了,后来给的内容就是要查的内容,数据库就会原样的去匹配。
我们下面采用优化sql语句的方法来防止注入攻击。sql语句换一种写法。
$db = new MySQLi("localhost","root","666","text1"); mysqli_connect_error()?die("连接失败"):""; $sql = "select password from login where username='{$uid}'";//先根据uid找到对应的密码,这样最多只能找到一条数据。这样fetch_row()最多能取到1列。 //执行sql语句 $result = $db->query($sql); $n = $result->fetch_row(); if($uid !="" && $pwd !="")//防止出现代码下面所说的bug。 { if($n[0]==$pwd)//判断从数据库中找到的密码和用户输入的密码是不是一样。 { header("location:main.php");//如果相等就跳转 } else { echo "用户名或密码错误";//如果不相等就出现提示 } } else//如果用户名或者密码不输入弹出的信息 { echo "用户名或密码不能为空"; } //这样写的优点就是不管用户名怎么写,密码就是固定的密码。验证两个密码是不是一样。 //这种方法还会有个bug就是用户名和密码都输入错误也能登陆,因为数据库中没有改用户名就会输出null,密码输错了也会返回null,正好会匹配上。这样就在外面再加上一个if判断输入的内容是不是空的,如果是空的就弹出提示信息。
二、将数据库中info表中的信息以表格的相识显示在页面中
(1)在网页上显示出数据
<table width="100%" border="1" cellpadding="0" cellspacing="0"> <tr><!--做表头--> <td>代号</td> <td>姓名</td> <td>性别</td> <td>民族</td> <td>生日</td> </tr>
<?php //做表的内容,嵌入php代码 //造连接对象 $db = new MySQLi("localhost","root","666","text1"); //写sql语句 $sql = "select *from info"; //执行sql语句 $result = $db->query($sql); //读数据,返回一个二维数组 $attr = $result->fetch_all(); //将二维数组里面的数据显示出来 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>";//当行数比较多时者采用下面的写法。 /*foreach($v as $v1)//$v1就是变量了,二不是数组了。 { echo "<td>{$v1}</td>"; }*/ echo"</tr>"; } ?>
</table> <!--以上代码会显示出info表的信息,但是sex栏显示的是0或1,而不是男或女,nation栏显示的也是民族的代号-->
(2)网页表格中的性别显示为男、女和民族栏显示出民族的名称
只更改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,内容是0和1,现在要转化为男和女。最简单的是用三元运算符写。用变量$sex接收,然后把$sex放到表格中替换$v[2]。就会显示男女了。 //$v[3]是民族的那一列,nation有另外一张表,要根据民族代号查询民族名称。上面链接对象已经造好了,不需要再链接数据库了,用同一个连接就可以。直接写sql语句 $sname = "select name from nation where code='{$v[3]}'";//根据民资代号查询民族名称 $rname = $db->query($sname);//返回结果集 $aname = $rname->fetch_row();//返回一个数组,$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就是变量了,二不是数组了。 { echo "<td>{$v1}</td>"; }*/ echo"</tr>"; } ?>
如果觉得显示民族的代码写在foreach里面显得太乱,还可以封装一个函数,调用这个函数来显示民的名称,具体写法如下,也是只写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,内容是0和1,现在要转化为男和女。最简单的是用三元运算符写。用变量$sex接收,然后把$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>"; /*foreach($v as $v1)//$v1就是变量了,二不是数组了。 { echo "<td>{$v1}</td>"; }*/ echo"</tr>"; } //封装下面的函数,这个函数的作用是给一个民族代号,返回民族名称。 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)对表格增加删除的功能,每行后面都加一个删除按钮,点击后从数据库中删除该条数据。
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"; //这里也要加一列,里面加删除。在删除外层添加一个<a>标签,‘删除’变成了超链接。点击删除后页面跳转到另一个页面chuli.php处理 // onclick=\"return confirm('确定删除吗?')代表的是删除之前会弹出提示信息,确认或者取消,留给用户后悔的余地。onclick事件先于跳转页面执行,confirm是弹出一个带有确认或者删除的和用户交互的对话框,点击确定就会返回true继续执行,点击取消就会返回flase停止执行。confirm()里面填写的信息就会出现在弹出的对话框里面,用于提醒用户。无论是使用的<a>标签或者是按钮,都可以使用这句话。 /*foreach($v as $v1) { echo "<td>{$v1}</td>"; }*/ echo"</tr>"; } 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]; } ?>
</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}'";//根据传过来的值删除数据库对应的数据 $r = $db->query($sql); if($r) { header("location:main.php");//如果执行成功,就跳转到主页面main.php } else { echo "删除失败"; }
(4)对表格增加添加功能
1.先在main.php页面里面添加一个添加数据的按钮,写在table后面就可以。点击添加数据按钮后跳转到页面add.php。
<a href="add.php"><input type="button" value="添加数据" /></a><!--做一个添加按钮,点击添加数据,跳转到add.php页面执行。-->
2.做一个add.php页面,该页面是让用户填写要添加的数据,下方有“添加”的提交按钮,点击“提交”按钮跳转到addchuli.php页面。但是在填写数据时,性别要填写0或者1,民族要填写民族代号,后面会有解决方法。
<!--做添加的界面--> <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><!--做个添加按钮--> </form>
addchuli.php页面代码,填写完数据以后点击“添加”,跳转到此页面处理,处理完以后再跳转回主页面。
<?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}')";//波尔型数据往里添加时不能有‘’,添加字符串的话永远返回的是true。 $db->query($sql); header("location:main.php");//往数据库里添加完数据以后再返回主页面。
3.解决b中提到的缺陷。并且将性别选项做成单选按钮,将民族做成下拉菜单。
<!--做添加的界面--> <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>";//表单提交的时候是提交的value值,$v[1]仅仅是显示用的,value值$v[0]才是要提交的数据,下拉菜单选中哪一项就提交哪一项的value值。 } ?>
</select>
</div> <div>生日:<input type="text" name="birthday" /></div> <div><input type="submit" value="添加" /></div><!--做个添加按钮--> </form>