php笔记4.5.操作mysql数据库、session防盗链
实验四:验证用户是否已存在
目的:
熟悉使用select完成按条件查询数据
实验内容:
在上次作业的基础上,实现注册前验证用户名是否已经存在的功能:
如果当前注册的账号名在数据库中已经存在,则提示以下信息:
如果不存在,向数据表中插入记录后并提示注册成功(插入的用户密码要求是经过md5加密后的)
用户注册链接数据库
https://blog.****.net/tanlangqie/article/details/80685429
https://blog.****.net/qq_35661627/article/details/78564319
- 实现注册功能首先必须要有一个可视化的表单—-包含用户名,密码,重复密码等;
- 其次我们要将注册的用户信息存储起来,所以还需要用到mysql数据库;
- 最后需要一个浏览器来可视化表单以及PHP执行的结果。
<html> <head> <meta charset="utf-8" /> <title>用户注册</title> </head> <body> <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>> </body> </html> |
有了可视化的表单以后,就要考虑数据存储的问题了。加入我们要将用户的信息存储到user表中,我们首先得在数据库中创建user表。代码如下:
CREATE TABLE `user` (
`id` int(32) NOT NULL AUTO_INCREMENT,
`username` varchar(30) DEFAULT NULL,
`password` varchar(32) DEFAULT NULL,
`createtime` int(80) DEFAULT NULL,
`createip` varchar(60) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
connect.php
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/6/13 * Time: 19:52 */
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', 'password');
//如果有错误,存在错误号 if (mysqli_errno($conn)) {
echo mysqli_error($conn);
exit; }
mysqli_select_db($conn, 'test'); //选择数据库
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);
?> |
查询信息
//从数据库中提取用户注册信息 $userSQL = "select * from users where user_id=$userID"; $userResult = mysql_query($userSQL); if($user = mysql_fetch_array($userResult)){ echo "您注册的用户名为:".$user["userName"]."<br/><br/>"; echo "您填写的登录密码为:".$user["password"]."<br/><br/>"; echo "性别:".$user["sex"]."<br/><br/>"; echo "爱好:".$user["interests"]."<br/><br/>"; $pictureAdrees="uploads/".$myPictureName; echo "上传的照片:"; echo '<img src="'.$pictureAdrees.'" width="200px">'; echo "<br/><br/>"; echo "备注信息:".$user['remark']; }else{ exit("用户信息注册失败!"); } |
完整报错提示:Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
在$data = mysqli_query($dbc, $query);后加上这样一段代码,就能清楚的知道查询出现了什么问题,
if (!$data) { printf("Error: %s\n", mysqli_error($dbc)); exit(); } |
插入失败,尝试插入语句:
insert into user (username,password,gender,birth_y,birth_m,picture) values('123456','1234aa', '男' ,'1990','1','/homeworkRegister/8bb60abcf5a8fcc3db775abbb8978cc65d60885e.jpeg' ); |
字段名有错
查询不到
select * from user where id='3'; |
实验五:登录功能实现
目的:
熟悉使用select语句完成登录功能
实验内容:
在上次作业的基础上,完成登录页面。
1、制作登录页面(login.php),并将该页面链接到“管理登录”上:
2、当用户点击“登录”按钮后,页面会将数据提交到“loginverify.php”。在“loginverify.php”页面实现以下功能:
(1)验证用户名是否为空
(2)验证密码是否为空
(3)使用select语句从数据库中验证用户名和密码是否正确,如果不正确,显示:
(4)如果用户名和密码正确,则显示登录成功,并提供跳转到首页的链接:
1.通过window.open函数
<div οnclick="window.open('http://blog.sina.com.cn/yangguangjianyu');"></div>
<div οnclick="window.open(*http://www.baidu.com*,*_self*)">在当前窗口跳转至百度</div>
2.通过window.location.href函数
<div οnclick="window.location.href= *http://www.baidu.com*;return false">在当前窗口跳转至百度</div>
实验六:签写留言功能实现(一):页面制作
目的:
熟悉使用insert语句完成数据表中数据的插入和使用session来验证用户的登录状态
实验内容:
在上次作业的基础上,完成签写留言页面。
1、制作签写留言页面(add.php),并将该页面链接到所有的“签写留言”上:
2、当用户填写完信息后,点击“确定”按钮后,跳转到留言验证页面(addverify.php),该页面可以完成:
可验证标题和内容是否为空。若有一项为空则提示错误信息:
实验六:签写留言功能实现(二):加入用户权限管理及注销功能
目的:
熟悉使用insert语句完成数据表中数据的插入和使用session来验证用户的登录状态
实验内容:
1、在上次作业的基础上,为签写留言页面(add.php)添加用户访问权限控制功能,要求只有处于登录状态的用户才能访问add.php页面。例如:
(1)如果用户没有登录就访问add.php页面,会自动提示弹出提示框“请先登录”,并且将页面跳转至登录页(login.php),如图:
(2)若用户已经登录,则显示留言页,并将所有页面导航中的“管理登录”修改为:“退出(用户名)”,并将链接指向“loginout.php”
2、完成“用户退出”功能:该功能只对登录用户开放。当登录用户点击“退出(用户名)”链接时,会跳转到注销页面(loginout.php),该页面会清空存放用户名的session变量,并提示“注销成功”:
3、将留言内容插入数据表
在addverify.php页面中如果接收到的标题和内容均不为空时,将标题、内容、获取的系统时间以及当前登录的用户名(可以从session中获取)存入数据库“liuyan”表中,并显示留言成功。
提示:php获取系统时间的方法
date_default_timezone_set('Asia/Shanghai'); //将时区设置为上海时区
$datetime = date("Y-m-d H:i:s",time()); //获取系统时间并设置相应格式
Session登陆:
http://www.php.cn/jishu/php/411620.html
查询数据库db.php
<?php
$dbName = 'demo'; $host = '127.0.0.1'; $user = 'root'; $password = 'root';
$dsn = "mysql:host=$host;dbname=$dbName"; $pdo = new PDO($dsn, $user, $password);
function sql($table, $field = '*', $where = '') { global $pdo; $sql = 'select' . ' ' . $field . ' ' . 'from' . ' ' . $table . ' where ' . $where; $data = $pdo->query($sql)->fetch(); return $data; } |
检验用户登录信息的代码示例:check.php
<?php session_start(); include "db.php"; @$name = $_POST['username']; @$pas = $_POST['password'];
$row = sql('user', '*', "username = '$name'"); if (!$row) { return "用户名不存在!请检查用户名~~"; }
if ($row['password'] == $pas) { $_SESSION['username'] = "$name"; echo "<script> alert('登录成功!正在跳转...') </script>"; echo "<a href='index.php'>如果跳转失败请点击跳转~~</a>"; header("Refresh:1;url=index.php"); } |
登录成功后跳转的页面代码示例:
index.php
<?php echo "<h1>这里是主页</h1>"; session_start(); $name = $_SESSION['username']; if ($name) { echo "<script> alert(\"尊敬的$name ,欢迎回来!!\"); </script>"; }else{ echo "<script> alert('您还尚未登录!请返回登录~~') </script>"; echo "<a href='index.php'>如果跳转失败请点击跳转~~</a>"; header("Refresh:1;url=login.html"); } |
Echo时单双引号嵌套
里面的”加转义\
判断session中有没有值
<?php // 正确,检查flag下标是否设置 if (isset($_SESSION['flag'])) ... // 错误,会导致警告,下标不存在 if ($_SESSION['flag']) ... // 存储一个session值 $_SESSION['flag'] = 1; // 删除一个session值 unset($_SESSION['flag']); |
PHP防盗链的实现方法
弹框
echo '<script language="JavaScript">;alert("这是");location.href="index.htm";</script>;'; |
完整工程下载地址:https://download.****.net/download/lagoon_lala/11133388