PHP(Hypertext Preprocessor)超文本预处理器,一种开源的、常运行在服务器上的开源脚本语言,它跨平台、与几乎所有 Web 服务器兼容、与大量的数据库兼容。
PHP 文件可以包含 PHP 代码、HTML 和 JavaScript 代码,在服务端执行,与数据库进行交互后生成 HTML 文件通过 Web 服务器返回给浏览器。
一个 PHP 文件通常包含 HTML 和 PHP 脚本,基本形式为:
<!DOCTYPE html>
<html>
<body>
<?php
echo "Hello World!";
?>
</body>
</html>
与 C/C++、Java、C#、Go 甚至 Python 这些强类型语言不同,PHP 是一种弱类型语言,PHP 有 8 种数据类型:
各种变量的定义方式:
/* 整型 */
$a = 1;
/* 浮点型 */
$b1 = 1.1;
$b2 = 9.9e-10;
$b3 = 5E-10;
/* 字符串 */
$c = "PHP";
/* bool 型 */
$d1 = TRUE;
$d2 = FALSE;
/* 数组 */
$e = array("I", "LOVE", "YOU");
/* 类与对象 */
class F {
......
}
$f = new F;
/* Null */
$g = null;
/* resource 型 */
$h1 = mysqli_connect(...);
$h2 = fopen(...);
?>
由于 PHP 是弱类型语言,故 PHP 有两种比较方式:
==
进行比较,只比较值,不比较数据类型。===
进行比较,既比较值,又比较数据类型。
if (TRUE == "TRUE") {
echo "相等1";
} else if (TRUE === "TRUE") {
echo "相等2";
}
// 将输出:相等1
?>
PHP 常量的定义需要使用 define()
函数,函数用法为:
bool define(string $name, mixed $value [, bool $case_insensitive = false])
/* $name 为常量名,$value 为常量值,$case_insensitive 表示常量名是否大小写不敏感 */
define("A", "123", TRUE);
echo a;
echo A;
/* 将输出两次 123
* 若没有设置为大小写不敏感,则 echo a 将报错
*/
?>
PHP 一个变量需要在变量名前加上符号 $
,变量名是区分大小写的,例如:
$x = 7;
$y = 7.7;
$zz = "Hello PHP!";
$ZZ = "Hi PHP!"
?>
PHP 在局部使用全局变量:
使用 global 关键字声明全局变量,如:
$a = 5;
$b = 10;
function Maxab() {
global $a, $b; // 声明使用全局变量 a 和 b
if ($a >= $b) {
return $a;
} else {
return $b;
}
}
?>
使用 $GLOBALS
超级全局变量数组直接调用变量,如:
$a = 5;
$b = 10;
function Maxab() {
if ($GLOBALS["a"] >= $GLOBALS["b"]) {
return $GLOBALS["a"];
} else {
return $GLOBALS["b"];
}
}
?>
$GLOBALS
是包含了全部变量的数组,除了 $GLOBALS
之外,PHP 还有几个超级全局变量:
$_SERVER
:存储服务器信息和执行环境。$_REQUEST
:收集 HTML 表单提交的数据,包括 get 和 post 方式提交的数据以及 cookie。$_POST
:收集 HTML 表单使用 post 方式提交的数据。$_GET
:收集 HTML 表单使用 get 方式提交的数据,或 URL 提交的数据。$_FILES
:存储上传文件的信息。$_ENV
:存储服务器的环境变量。$_COOKIE
:存储 cookie 信息。$_SESSION
:存储 session 信息。PHP 中需掌握三种字符串操作:
并置运算符 .
用于连接两个字符串,如:
$str1 = "Hel";
$str2 = "leo";
echo $str1 . $str2; // 将输出 Hello
?>
strlen()
函数,同 C 语言,返回字符串的长度。
strpos()
函数,在字符串内查找一段文本,若查找到会返回该文本第一次出现的位置,若未查找到则返回 FALSE
,如:
echo strpos("Hello Hello", "Hello");
?>
字符串既可以用单引号也可以用双引号,二者的主要区别:
PHP 中数组类型:
定义方式如下:
/* 数值数组 */
$a = array("1", "2", "3");
echo a[0];
echo a[1];
echo a[2];
foreach ($a as $value) {
echo $value;
}
/* 关联数组 */
$b = array("a" => "1", "b" => "2", "c" => "3");
echo b['a'];
echo b['b'];
echo b['c'];
foreach ($b as $x => $x_value) {
echo $x;
echo "
";
echo $x_value;
}
/* 多维数组 */
$c = array(
"c1" => array(
array("1", "2", "3"),
array("4", "5", "6")
),
"c2" => array(
array("7", "8", "9"),
array("10", "11", "12")
)
)
?>
常用函数:
count()
:可以返回数组的长度。sort()
:进行升序排序。rsort()
:进行降序排序。asort()
:根据关联值进行升序排序。ksort()
:根据关联键值进行升序排序。arsort()
:根据关联值进行降序排序。krsort()
:根据关联键值进行降序排序。PHP 中的选择语句与 C 语言完全相同,使用 if-else
语句或 switch-case
语句。
/* if-else 语句 */
if (condition1) {
statement
} else if (condition2) {
statement
}
/*
* ......
*/
else {
statement
}
/* switch-case 语句 */
switch (expression) {
case value1:
statement
case value2:
statement
/*
* ......
*/
break; // 遇到 break 才会终止
default:
statement
}
?>
PHP 中的循环语句在 C 语言提供的 while
、do while
、for
的基础上又提供了一种 foreach
。
/* while 型 */
while (condition) {
statement
}
/* do-while 型 */
do {
statement
} while (condition)
/* for 型 */
for (initializing; condition; addition) {
statement
}
/* foreach 型用于遍历数组 */
$a = array ("1", "2", "3");
foreach ($a as $value) {
echo $value;
} // 将输出 123
?>
PHP 内建了大量的函数,功能强大,在下文会列举几个关键函数。
PHP 是脚本语言,直接由 PHP 解释器解释执行,不需要进行编译,故函数可以在代码中的任意位置定义,不需要在调用前进行声明,函数的定义方法:
function function_identifier(parameter_list) {
statement
return ... ; // 返回值
}
?>
PHP 面向对象的使用方法与 C++ 类似:
class php_class {
/* 成员变量 */
public $var1;
// var $var1;
protected $var2;
private $var3;
/* 构造函数 */
function __construct($par1, $par2) {
$this->var1 = $par1;
$this->var2 = $par2;
}
/* 析构函数 */
function __destruct() {
echo "销毁对象" . this->name;
}
/* 成员函数 */
function fun($par) {
echo $par;
}
};
/* 声明对象 */
$obj = new php_class(1, 2);
/* 调用成员函数 */
$obj -> fun(1);
/* 继承 */
class child_class extends php_class {
statement
};
/* 接口 */
// 声明接口
interface A {
public function fun(parameter_list);
};
// 实现接口
class a implements A {
public function fun(parameter_list) {
statement
}
};
/* 抽象类 */
// 定义抽象类
abstract class B {
abstract protected function fun1(parameter_list);
public function fun2();
};
class b extends B {
protected function fun1(parameter_list) {
statement
}
};
?>
使用 header()
函数向浏览器发送 HTTP 报头,函数原型为:
header(string, replace, http_response_code)
/* string 表示要发送的报头字符串
* replace 表示是否代替原来的报头,默认 TRUE
* http_response_code 可选,表示把 HTTP 响应强制为指定的值
*/
?>
例如想要在新的页面定向到某个 URL:
header("Location: https://cohanbb.github.io/", FALSE);
?>
$_GET[]
和 $_POST[]
两个数组分别用来收集 HTML 使用 get 和 post 方式提交的数据。
例如想要收集 get 方式提交的数据 DEMO:
/* demo.php */
<html>
<form action="demo.php" method="get">
<input type="text" name="DEMO"/>
<input type="submit" name="submit" value="submit"/>
</form>
</html>
<?php
$demo = $_GET["DEMO"];
echo $demo;
?>
何谓 Cookie?
cookie 常用于识别用户,cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。
PHP 使用 setcookie()
函数设置 cookie:
/* 函数原型 */
setcookie(name, value, expire, path, domain);
/* 设置 cookie 并于 3600 秒后过期 */
setcookie("user", "Cohanbb", time() + 3600);
?>
$_COOKIE_
存储设置的 cookie 值:
echo $_COOKIE["user"];
?>
删除 cookie:
/* 将时间设为过去的时间即可删除 cookie */
setcookie("user", "", time() - 1);
?>
何谓 Session?
在计算机上操作某个应用程序时,打开它、做些更改、关闭它,这很像一次对话。你所操作的计算机知道你是谁,它清楚你在何时打开和关闭应用程序。然而由于 HTTP 地址无法保持状态,Web 服务器并不知道你是谁以及你做了什么。
session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。会话信息是临时的,在用户离开网站后将被删除。如果需要永久存储信息,可以把数据存储在数据库中。
session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
PHP 操作 session:
session_start();
/* 设置 session */
$_SESSION["name"] = "Cohanbb";
/* 获取 session */
$name = $_SESSION["name"];
/* 清空 session */
session_unset();
/* 销毁 session */
session_destroy();
?>
PHP 通过 MySQLi
或 PDO
连接和操作数据库,PDO
可以应用在12种不同的数据库,MySQLi
只能应用在 MySQL 数据库,在此仅演示 MySQLi
。
MySQLi
可以面向过程也可以面向对象,写法上有一些差异。
连接数据库
使用 mysqli_connect()
函数连接数据库,或面向对象:
/* 面向过程*/
$conn = my sqli_connect("localhost", "root", "123456");
if (!$conn) {
die("数据库连接失败:" . mysqli_connect_error()));
}
echo "数据库连接成功";
mysqli_close($conn);
/* 面向对象 */
$conn = new mysqli("localhost", "root", "123456");
if ($conn->connect_error) {
die("数据库连接失败:" . $conn->connect_error);
}
echo "数据库连接成功";
$conn->close();
?>
使用 SQL 语句
使用 mysqli_query()
函数连接 SQL 语句,或面向对象:
/* 面向过程 */
$sql = "SELECT * FROM users";
if (!mysqli_query($conn, $sql)) {
die("查询失败");
}
/* 面向对象 */
$sql = "SELECT * FROM users";
if (!($conn->query($sql))) {
die("查询失败");
}
?>
其他常用函数
使用 mysqli_error()
函数返回最近调用函数的最后一个错误的描述。
使用 mysqli_errno()
函数返回最近调用函数的最后一个错误代码。
使用 mysqli_affected_rows()
函数返回上一个 SQL 语句影响的行。
使用 mysqli_real_escape_string()
函数转义 SQL 语句中的特殊字符,可用于防注入。
使用 mysqli_fetch_xxx()
函数从查询结构中返回一些数据:
mysqli_fetch_all()
从结果集中取得所有行作为关联/数值数组mysqli_fetch_array()
从结果集中取得一行作为关联/数值数组mysqli_fetch_assoc()
从结果中取得一行作为关联数组mysqli_fetch_object()
从结果中取得一行作为对象PHP 有四种文件包含方式:
include
include_once
require
require_once
其中 include
和 require
的区别是,二者处理错误的方式不同,前者生成一个警告,出错后脚本继续执行,后者生成一个致命错误,脚本停止执行。
后面带上 _once
的作用是如果之前已经包含了该文件,则不会再次包含,即防止多次包含同一个文件。
常用文件包含语句:
/* 普通方式包含 */
include "file.php";
require "file.php";
include_once "file.php";
require_once "file.php";
/* get 方式传参包含 */
$file = $_GET["FILE"];
include($file);
require($file);
?>
PHP 中使用 fopen()
函数打开文件,fwrite()
函数写入文件,fclose()
函数关闭文件,用法如下:
$file = fopen("test.txt", "r"); // 以只读方式打开 test.txt 文件
$str = "123";
fwrite($file, "str");
fclose($file);
?>
fopen()
函数第二个参数表示打开文件的模式:
Patterns | Descriptions |
---|---|
r | 只读,从文件开头开始。 |
r+ | 读写,从文件开头开始。 |
w | 只写,且清空文件内容,若文件不存在则新建。 |
w+ | 读写,且清空文件内容,若文件不存在则新建。 |
a | 只写,从文件末尾进行追加,若文件不存在则新建。 |
a+ | 读写,从文件末尾进行追加,若文件不存在则新建。 |
x | 只写,创建一个新文件,若文件已存在则返回 FALSE 并报错。 |
x+ | 读写,创建一个新文件,若文件已存在则返回 FALSE 并报错。 |
PHP 使用 $_FILES
超级全局变量进行文件上传,$_FILES
是一个二维数组,结构如下:
$_FILES = array(
/* 假设 filename 为 HTML 表单中 的值 */
"filename" => array(
"name" => 被上传的文件名称
"type" => 被上传的文件类型
"tmp_name" => 被上传的文件在服务器中暂时的路径和名称
"error" => 上传过程有无错误
"size" => 被上传文件的大小
)
);
在此我给出一个简单的文件上传程序:
<html>
<body>
<form action="upload.php" method="post">
<label>请上传文件:label>
<input type="file" name="filename" />
<br />
<input type="submit" name="submit" value="确认上传" />
form>
body>
<html>
upload.php
<?php
/* 限制上传文件的类型和大小 */
if ((($_FILES["filename"]["type"] == "image/gif")
|| ($_FILES["filename"]["type"] == "image/jpeg")
|| ($_FILES["filename"]["type"] =="image/pjpeg"))
&& ($_FILES["filename"]["size"] < 20000)) {
if ($_FILES["filename"]["error"]) {
echo "错误:" . $_FILES["filename"]["error"] . "
";
} else {
/* 输出上传的文件信息 */
echo "文件名:" . $_FILES["filename"]["name"] . "
";
echo "文件类型:" . $_FILES["filename"]["type"] . "
";
echo "文件大小" . ($_FILES["filename"]["size"] / 1024) . "Kb
";
echo "文件副本:" . $_FILES["filename"]["tmp_name"] . "
";
/* 将文件存储在服务器 */
if (file_exists("upload/" . $_FILES["filename"]["name"])) {
echo $_FILES["filename"]["name"] . "已经存在";
} else {
move_uploaded_file($_FILES["filename"]["tmp_name"], "upload/" . $_FILES["filename"]["name"]);
echo "文件存储在" . "upload/" . $_FILES["filename"]["name"];
}
}
} else {
echo "无法上传该文件";
}
?>
PHP 调用系统命令函数:
system()
:执行系统命令,输出执行结果。passthru()
:与 system()
函数相似。exec()
:执行系统命令,无回显,返回最后一行结果。shell_exec()
:执行系统命令,返回完整的输出结果。popen(command, mode)
:command 为执行的命令,mode 规定连接模式,可以是 r(只读)、w(只写)等。proc_open()
:不直接返回执行结果,返回一个文件指针。pcntl_exec()
:执行发生错误返回 FALSE,无错误不返回。命令执行的例子:
$ip = $_GET["ip"];
$command = "ping -c 3 $ip";
system("$command");
?>
以网络安全为目的,常在 PHP 程序中使用 Filter
函数对外部数据进行过滤,外部数据指表单提交的数据、cookie、Web 服务器信息、数据库查询结果等。
常用的过滤函数:
filter_var()
:对单一的变量使用指定过滤器过滤。filter_var_array()
:对多个变量使用多个过滤器过滤。filter_input()
:获取一个表单输入的内容,并指定过滤器进行过滤。filter_input_array()
:获取多个表单输入的内容,并通过多个过滤器进行过滤。下面的例子使用 filter_var()
进行过滤:
$int = 777;
if (!filter_var($int, FILTER_VALIDATE_INT)) {
echo "不是合法的整数";
} else {
echo "是合法整数";
}
?>