一、匹配数据库登录

步骤:

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" />男<!--将性别作成单选按钮-->
&nbsp;<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>

10月28日下午MySQL数据库的增加、删除、查询(匹配数据库登录和可以增、删、查的显示数据库内容的页面))的更多相关文章

  1. 10月16日下午MySQL数据库CRUD操作(增加、删除、修改、查询)

    1.MySQL注释语法--,# 2.2.后缀是.sql的文件是数据库查询文件. 3.保存查询. 关闭查询时会弹出提示是否保存,保存的是这段文字,不是表格(只要是执行成功了表格已经建立了).保存以后下次 ...

  2. 10月14日下午MySQL数据库基础

    数据库基础 类型: 1.varchar:字符串,用于姓名班级,地址等,地址一般长50,姓名长20 2.int:整数,用于成绩,序号等 3.float:小数 4.bit:布尔型,用于性别等 5.时间也用 ...

  3. 10月17日下午MySQl数据库CRUD高级查询

    高级查询:1.连接查询 #适用于有外键关系的  没有任何关系没法用select * from Info,Nation #同时查询这俩表并把两表每个数据相互组合,形成笛卡尔积 select * from ...

  4. 2016年10月28日 星期五 --出埃及记 Exodus 19:13

    2016年10月28日 星期五 --出埃及记 Exodus 19:13 He shall surely be stoned or shot with arrows; not a hand is to ...

  5. [2018-11-03]2018年10月28日宁波dotnet社区活动回顾及下次活动预告

    离上次活动,有半年了,汗.之后尽量保证每月一次,以组织为主,多邀请嘉宾来分享. 本次活动不足之处 人手不足:由于活动组织事项受限于人手(目前就我一个,这次活动前后我又应邀给大红鹰学院应届生介绍dotn ...

  6. 10月30日上午MySQL数据库的修改(从网页上实现对数据库的更改)

    从网页页面上对数据库进行更改,连接着之前做的增加.删除.查询. 1.先做一个修改页面 <body> <!--这个页面需要让用户看到一些数据,所以不是一个纯php页面,页面效果和增加页 ...

  7. 10月21日上午MySQL数据库学习内容复习

    1.创建数据库create database 数据库名称删除数据库drop database 数据库名称 2.创建表create table 表名(列名 类型(长度) 自增长 主键 非空,)自增长:a ...

  8. 10月16日上午MySQL数据库基础操作(创建、删除)

    以前用的是鼠标在界面上手动创建,这样创建会比较麻烦,而且还会经常出问题.在其它电脑上要用的话还需要重复操作.所以要使用程序代码操作,能通过代码的就不用手动操作. 在数据库界面选择要用的数据库,双击打开 ...

  9. 10月16日上午MySQL数据库作业设计表解析

    作业设计表:多张表存储学生成绩及各种信息 需要从表里面体现: 关于学生的:代号 姓名 性别 年龄 班级 关于课程的:代号 名称 关于老师的:代号 姓名 关于成绩的:例如:闫超--网页--90 要能查看 ...

随机推荐

  1. c#中 命令copy 已退出,返回值为1

    c#中重新生成时,报错:命令"copy ...... " 已退出,返回值为1.   错误截图如下: 解决办法: 点击"项目"右键--"属性" ...

  2. 基于Ajax+div的“左边菜单、右边内容”页面效果实现

    效果演示: ①默认页面(index.jsp): ②:点击左侧 用户管理 标签下的 用户列表 选项后,右边默认页面内容更新为用户列表页(userList.jsp)的内容 : ③:同理,点击 产品管理.订 ...

  3. SQL闲杂知识点汇总【2015年12月】

    2015.12.14 知识点1:DEFAULT VALUES实现插入行 --临时创建临时表 CREATE TABLE [dbo].[tblTmp] ( iTmpID ,) NOT NULL PRIMA ...

  4. openstack 命令行管理 - 目录

    原文http://blog.csdn.net/signmem/article/details/19513775 相关 openstack  命令行管理, 分下面部分进行介绍 openstack 命令行 ...

  5. 使用Sqlserver更新锁防止数据脏读

    有时候我们需要控制某条记录在程序读取后就不再进行更新,直到事务执行完释放后才可以.这时候我们就可以将所有要操作当前记录的查询加上更新锁,以防止查询后被其它事务修改.这种操作只锁定表中某行而不会锁定整个 ...

  6. 自己开发一个 vsts agent 的 task

    vsts 中支持自定义Build/Release的过程Task 目标:做一个可以读取 Xamarin.Android 所生成的 APK 的 基本信息的 task ,包括 package(包名) / a ...

  7. Xamarin Android 所见即所得问题

    运行Xamarin 时出现以下问题. The layout could not be loaded : The operation failed due to an internal error : ...

  8. [Django]登陆界面以及用户登入登出权限

    前言:简单的登陆界面展现,以及用户登陆登出,最后用户权限的问题 正文: 首先需要在settings.py设置ROOT_URLCONF,默认值为: ROOT_URLCONF  = 'www.urls'# ...

  9. WPF系列 自定控件

    引言 WPF中微软提供了一些基本的控件,但是工作中这些基础的控件往往不能满足我们的需求,这个时候我们就需要根据实际的需求去开发自己的控件,但要注意不是所有功能不满足的情况都需要通过自定义控件来实现.实 ...

  10. HDU 1848 Fibonacci again and again【SG函数】

    对于Nim博弈,任何奇异局势(a,b,c)都有a^b^c=0. 延伸: 任何奇异局势(a1, a2,… an)都满足 a1^a2^…^an=0 首先定义mex(minimal excludant)运算 ...