PHP学习(后部分)
PHP表单 表单
有一点很重要的事情值得注意,当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元成可 供 PHP 脚本使用。
下面的实例包含了一个 HTML 表单,带有两个输入框和一个提交按钮。
完整代码:
用户登录页面
欢迎
你的年龄是
PHP 获取下拉菜单的数据 PHP 下拉菜单单选
PHP 下拉菜单多选
如果下拉菜单是多选的( =""),我们可以通过将设置 ="q[]" 以数 组的方式获取,以下使用 POST 方式提交,代码如下所示:
完整代码:
login
";
}
?>
单选按钮表单()
PHP 单选按钮表单中 name 属性的值是一致的,value 值是不同的,代码如下所示:
复选框
PHP 复选框可以选择多个值:
完整代码:
";
}
?>
表单验证
在处理PHP表单时我们需要考虑安全性。
eg:必须与可选文本字段,单选按钮,及提交按 钮:
";
echo "邮箱为:".$email."";
echo "爱好为:";
foreach($aihao as $ah){
echo $ah." ";
};
echo "备注为:".$beizhu."";
echo "性别为:".$xingbie."";
?>
这样的代码拥有漏洞
可以进行xss
保护方法: ()方法
() 函数把一些预定义的字符转换为 HTML 实体。
修改后:
";
echo "邮箱为:".$email."";
echo "爱好为:";
if($aihao!=""){foreach($aihao as $ah){echo htmlspecialchars($ah)." ";}}else{echo "没有爱好";}
echo "备注为:".$beizhu."";
echo "性别为:".$xingbie."";
?>
必填以及验证
判断变量是否为空
使用empty()
可结合if判断
PHP文件包含
在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。
和 语句用于在执行流中插入写在其他文件中的有用的代码。
和 除了处理错误的方式不同之外,在其他方面都是相同的:
生成一个致命错误(),在错误发生后脚本会停止执行。
生成一个警告(),在错误发生后脚本会继续执行。
如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 。否 则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 向执行流引用关键文 件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
PHP 和 语句
基础实例
假设您有一个标准的页头文件,名为 ".php"。如需在页面中引用这个页头文件,请使用 /
欢迎来到我的主页!
一些文本。
文件以及文件上传
通过 PHP,可以把文件上传到服务器。
目录结构
|-----upload # 文件上传的目录
|-----index.html # 表单文件
|-----upload.php # php 上传代码
创建一个文件上传表单
供上传文件的 HTML 表单:
创建上传脚本:
";
echo "文件类型: " . $_FILES["file"]["type"] . "
";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
?>
增加防止上传文件报错提示:
0)
{
echo "错误:" . $_FILES["file"]["error"] . "
";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "
";
echo "文件类型: " . $_FILES["file"]["type"] . "
";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
?>
第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"" 或 "error"。
关于$FILES[ ][]理解:
$["file"]["name"] - 上传文件的名称
$["file"]["type"] - 上传文件的类型
$["file"]["size"] - 上传文件的大小,以字节计
$["file"][""] - 存储在服务器的文件的临时副本的名称
$["file"]["error"] - 由文件上传导致的错误代码
$["file"]["error"] - 由文件上传导致的错误代码 上传限制 对于()的理解:
()是一个字符串函数,用于将字符串拆分为数组。它接受两个参数:分隔符和要拆分的字符串。
array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] )
()函数将字符串按照指定的分隔符进行拆分,并返回一个包含拆分后的子字符串的数组。每个子字符串都是根据分隔符进行切割的结果。
eg:
$aaa)
{echo $aa.":".$aaa."
";
}
?>
结果:
对于end()的理解:
end()函数用于将内部指针移动到数组的最后一个元素,并返回该元素的值。它通常与数组相关联,用于访问数组中的最后一个元素。
eg:
$fruits = array('apple', 'banana', 'orange');
$lastFruit = end($fruits);
echo $lastFruit; // 输出 "orange"
注:每次调用end()函数都会将内部指针移动到数组的最后一个元素。如果想要多次使用同一个数组的最后一个元素,可以将其存储在一个变量中,而不是多次调用end()函数。
对于()的理解:
用于检查一个值是否存在于数组中,
代码框架:
in_array(value, array, strict): bool
注:函数返回一个布尔值,如果找到匹配的值,则返回true;否则返回false。
eg:
$fruits = array('apple', 'banana', 'orange'); if (in_array('apple', $fruits)) { echo "找到了苹果!";
} else { echo "没有找到苹果。";
}
保护完整代码:
0)
{
echo "错误:: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "
";
echo "文件类型: " . $_FILES["file"]["type"] . "
";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "非法的文件格式";
}
?>
对于同时检查文件类型和其后缀名称的理解: 文件类型和后缀名是文件属性的两个不同方面。文件类型通常由文件的内部内容决定,例如文件的元数据或文件内容本身的类型。而后缀名则是由操作系统根据文件的元数据(如MIME类型)或文件的内部结构来识别的。有时候,文件类型和后缀名可能会不一致,比如一个文本文件可能会被命名为“.jpg”。在这种情况下,仅检查文件类型可能会遗漏这种不一致性,从而允许不符合要求的文件上传。通过同时检查文件后缀名,可以增加一层保障,确保上传的文件类型与允许的类型完全匹配。用户可能会尝试通过修改文件后缀名来尝试绕过文件类型检查。例如,用户可能会将一个非图片文件的后缀名更改为“.jpg”,尝试欺骗服务器该文件是一个图片。通过检查文件后缀名,可以防止这种情况的发生。 保存被上传的文件 对于()的理解
()函数用于检查一个文件或目录是否存在
语法:
bool file_exists ( string $filename )
注:参数$是要检查的文件或目录的路径。可以是一个相对路径或绝对路径。
如果文件或目录存在,则返回true;否则返回false。
eg:
$filename = 'example.txt';
if (file_exists($filename)) { echo "文件存在";
} else { echo "文件不存在";
}
注:()函数仅检查文件或目录是否存在,而不验证文件的权限或其他属性。如果需要进一步验证文件的属性,可以使用其他函数,如()或()
**()函数用于检查指定的路径是否是一个文件。如果路径存在并且是一个文件,则返回true;否则返回false。
**()函数用于检查指定的路径是否是一个目录。如果路径存在并且是一个目录,则返回true;否则返回false。
对于()的理解:
()函数用于将通过HTTP上传的文件移动到指定的目标位置。
语法:
bool move_uploaded_file ( string $source , string $destination )
$source = $_FILES['file']['tmp_name']; // 获取上传文件的临时位置
$destination = 'uploads/' . $_FILES['file']['name']; // 指定目标位置,假设文件上传目录为"uploads" if (move_uploaded_file($source, $destination)) { echo "文件移动成功!";
} else { echo "文件移动失败!";
}
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。
这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位 置:
完整代码:
0)
{
echo "错误:: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "
";
echo "文件类型: " . $_FILES["file"]["type"] . "
";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
";
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 "非法的文件格式";
}?>
运行结果:
常用于识别用户。
常用于识别用户。 是一种服务器留在用户计算机上的小文件。每当同一台计算机通 过浏览器请求页面时,这台计算机将会发送 。通过 PHP,您能够创建并取回 的 值。
创建方法:
() 函数用于设置 。
(name, value, , path, );
参数
描述
name
必需。规定 的名称。
value
必需。规定 的值。
可选。规定 的有效期。
path
可选。规定 的服务器路径。
可选。规定 的域名。
可选。规定是否通过安全的 HTTPS 连接来传输 。
eg:
创建名为 "user" 的 ,并为它赋值 ""。我们也规定了此 在一小时后过期:
注:在发送 时, 的值会自动进行 URL 编码,在取回时进行自动解码。(为 防止 URL 编码,请使用 () 取而代之。)
另一种设置时间的方法:
取回值的方法:
PHP 的 $ 变量用于取回 的值。
对于isset()的理解
isset()函数用于检查一个变量是否已设置并且不为null。它接受一个或多个参数,每个参数都可以是一个变量或一个数组元素。
isset()函数返回一个布尔值,如果变量已设置且不为null,则返回true;否则返回false。
故而可用其判断用户是否登录
";
else
echo "普通访客!
";
?>
删除的方法:
当删除 时,您应当使过期日期变更为过去的时间点。
eg:
()
PHP 变量用于存储关于用户会话()的信息,或者更改用户会话()的设 置。 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
深入解释:
的工作机制:
为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 中,或者通过 URL 进行传导。
开始 PHP
把用户信息存储到 PHP 中之前,首先必须启动会话。
():用于启动会话
注:() 函数必须位于 标签之前:
上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配 一个 UID。
存储 变量
存储和取回 变量的方法是使用 PHP $ 变量:
eg:创建了一个简单的 page-view 计数器。isset() 函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,我们累加计数器。如果 "views" 不存在,则创建 "views" 变量, 并把它设置为 1:
销毁
删除某些 数据,可以使用 unset() 或 () 函数。
对于unset()理解
unset()是一个用于销毁指定变量的函数。它用于释放由isset()函数或变量本身分配的内存
注:unset()函数的作用是重置变量的值,将其设置为null,并释放变量所占用的内存。当使用unset()函数后,被销毁的变量将不再可用。
语法:
unset($variable);
其中$是要销毁的变量。
eg:指定销毁某变量
对于()理解
用于销毁当前活动的会话中的所有数据,并结束会话
作用具体解释:
销毁所有会话数据:当你调用()函数时,会话中存储的所有数据都将被销毁。这意味着会话中保存的用户信息、购物车内容、登录状态等都将被清除。结束会话:()函数还会结束当前会话。这意味着在服务器端,与当前会话相关的资源将被释放,例如会话 ID 将被删除,相关的服务器端数据也将被清除。删除 :如果会话是通过 进行的,()函数还会删除与当前会话关联的 。这意味着在客户端,与会话相关的 将被删除,使得下一次访问网站时需要重新创建新的会话。
需要注意的是,()只会销毁当前会话的数据,并不会关闭整个 PHP 会话机制。这意味着你可以在之后重新开始一个新的会话。
这个函数常用于用户登出、会话过期或者你希望立即结束当前会话并清除所有相关数据的情况下。
eg:
实验:简单的注册页面
后端代码:
";
echo "你注册的用户为:".$name."";
echo "你注册的手机号码:".$shouji."";
?>
">
前端代码:
NUC登录系统 注册
PHP数据库 MYSQL 简介
通过 PHP,可以连接和操作数据库。
MySQL 是跟 PHP 配套使用的最流行的开源数据库系统
mysql解释:
MySQL 是一种在 Web 上使用的数据库系统。
MySQL 是一种在服务器上运行的数据库系统。
MySQL 不管在小型还是大型应用程序中,都是理想的选择。
MySQL 是非常快速,可靠,且易于使用的。
MySQL 支持标准的 SQL。 MySQL 在一些平台上编译。
MySQL 中的数据存储在表中。表格是一个相关数据的集合,它包含了列和行。
在分类存储信息时,数据库非常有用。
eg:一个公司的数据库可能拥有以下表:
PHP + MySQL
PHP 与 MySQL 结合是跨平台的。(您可以在 上开发,在 Unix 平台上应用。)
查询
查询是一种询问或请求。
通过 MySQL,我们可以向数据库查询具体的信息,并得到返回的记录集。
MYSQL 连接 PHP 连接 MySQL 俩种方式:
("i" 意为 )
**PDO (PHP Data **)
注:习惯哪个用哪个
和 PDO 有它们自己的优势:
PDO 应用在 12 种不同数据库中
只针对 MySQL 数据库
建议:
如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和 部分查询语句即可。
使用 , 如果不同数据库,你需要重新编写所有代码,包括查询。 两者都是面向对象, 但 还提供了 API 接口。
两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要 的。
和 PDO 连接 MySQL 实例
在本章节及接下来的章节中,我们会使用以下三种方式来演示 PHP 操作 MySQL:
(面向对象)
(面向过程)
PDO
安装
()
()是一个 PHP 内置函数,用于输出关于 PHP 安装和配置的信息。它可以提供有关 PHP 版本、服务器配置、扩展模块和 PHP 配置选项的详细信息。
可以通过 () 查看是否安装成功:
连接 MySQL
在我们MySQL 数据库前,我们需要先连接到数据库服务器:
new ()用法:
new ()是 PHP 中用于建立 MySQL 数据库连接的函数。
语法:
mysqli_connect(string $host = '', string $username = '', string $password = '', string $database = '', int $port = 0, string $socket = '')
参数说明:
注:通过判断$conn->的值来检查连接是否出现错误。如果$conn->为 true,表示连接尝试失败,可以通过$conn->error属性获取错误的具体原因。如果$conn->为 false,表示连接成功。
new PDO()用法:
使用new PDO可以创建一个与数据库连接的对象。PDO(PHP Data )是一个用于与数据库交互的扩展库。通过使用PDO,你可以使用统一的方式连接和操作不同类型的数据库,如MySQL、、等。
对于try和catch的简单理解:
try{代码}catch{前面代码报错,执行}
对于理解:
函数通常用于从消息队列中获取消息。消息队列是一种在应用程序之间传递消息的机制,通常用于异步通信和任务处理。
基本用法:
// 连接数据库
$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=;=。
在try块中,我们尝试创建一个新的PDO对象并存储在$pdo变量中。如果连接失败,会抛出一个异常,你可以在catch块中处理这个异常并输出错误信息。
一旦你成功连接到数据库,你可以使用$pdo对象执行SQL查询和其他数据库操作。例如,执行查询可以使用$pdo->query($sql)方法,执行插入、更新或删除操作可以使用$pdo->exec($sql)方法
实例:
实例 (MySQLi - 面向对象):
connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
//检查连接
if (mysqli_connect_error()) {
die("数据库连接失败: " . mysqli_connect_error());
}
实例 (MySQLi - 面向过程)
实例 (PDO)
getMessage();
}
?>
//try{代码}catch{前面代码报错,执行}
关闭连接
连接在脚本执行完后会自动关闭。你也可以使用以下代码来关闭连接:
实例 (MySQLi - 面向对象)
$conn->close();
实例 (MySQLi - 面向过程)
mysqli_close($conn);
实例 (PDO)
$conn = null;
创建数据库与表,插入数据
数据库存有一个或多个表。
你需要 权限来创建或删除 MySQL 数据库
数据库的整体结构如下:
电脑(服务器)->数据库软件(mysql、mssql、甲骨文、....)-> 数据库-> 表->字段
数据库进入方法:
1、直接进入
2、使用软件连接
3、使用 //注意,PHP版本要高于7.0才可以直接使用 进入sql代码,在mysql的bin路径输入 .\mysql.exe -h 127.0.0.1 -u root -p
数据库操纵语句
查询MySQL内的数据库
show ;
创建库
kkk;
删除库
drop 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 值是不允许的。
# value - 设置默认值
# - 使用无符号数值类型,0 及正数
#AUTO - 设置 MySQL 字段的值在新增记录时每次自动增长 1
# KEY - 设置数据表中每条记录的唯一标识。 通常列的 KEY 设置为 ID 数 值,与 一起使用。
查看表的框架
增加数据
into (user,pass,phone) ('admin','','');
删除数据
from where user="admin";
接下来开始PHP联动
首先php创建数据库
对于.()
执行某个针对数据库的查询。第一个参数是连接数据库的变量,第二个参数是对数据库进行操作的变量
对于()的理解:
执行某个针对数据库的查询。第一个参数是连接数据库的变量,第二个参数是对数据库进行操作的变量
eg:
"; echo "邮箱:" . $row["email"] . "
"; // 处理其他字段...
} // 关闭连接
mysqli_close($link);
?>
对于理解:
是一个函数,用于获取与连接关联的最后一个错误消息。它接受一个连接对象作为参数,并返回一个字符串,其中包含与该连接关联的最后一个错误消息。
eg:
实例:
面向过程:
//面向过程
接下来连接数据的文件我们分开,然后包含引用
conn.php
其他需要调用该文件的php
面向对象:
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:
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE myDBPDO";
// 使用 exec() ,因为没有结果返回
$conn->exec($sql);
echo "数据库创建成功
";
}
catch(PDOException $e)
{
echo $sql . "
" . $e->getMessage();
}
$conn = null;
?>
创建表(面对过程)
//需要设置进去的库
conn.php 文件 新增
生成表内基本框架
结合注册页面开始完成实验