变量规则:变量以$开头,变量名称以以字母或下划线开头,变量名称只包含字母数字字符和下划线,大小写敏感
三种作用域:
函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。函数内访问全局变量要用得到global关键词。
函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
保留执行完的函数的变量要用到static关键词。
echo - 能够输出一个以上的字符串。
print - 只能输出一个字符串,并始终返回 1。
因为echo无返回值蓑衣echo更快。这两个有无括号都能用
strlen() 函数返回字符串的长度,以字符计。
str_word_count() 函数对字符串中的单词进行计数:
strrev() 函数反转字符串:
strpos(“指定字符串”,“搜索文本”) 函数用于检索字符串内指定的字符或文本。
str_replace(“源文本”,“替换文本”,“指定字符串”) 函数用一些字符串替换字符串中的另一些字符。
设置常量,请使用 define() 函数 - 它使用三个参数:首个参数定义常量的名称、第二个参数定义常量的值、可选的第三个参数规定常量名是否对大小写不敏感。默认是 false。
调用常量直接调用名称即可得出常量的值
基础的就不多赘述,列举一些特殊的:
串接:$txt1 = "Hello" $txt2 = $txt1 . " world!" txt2 包含 "Hello world!"
串接赋值:$txt1 = "Hello" $txt1 .= " world!"$txt1 包含 "Hello world!"
递增递减:++$x,--$x先加减再返回;$x++,$x--先返回再加减
比较:== 等于(类型可不等);===全等(类型相等)
基础的就不多赘述,列举一些特殊的:
foreach :并用于遍历数组中的每个键/值对。
foreach ($array as $value) {
code to be executed;
}
创建的函数以"function" 开头:
function functionName() {
被执行的代码;
}
函数名能够以字母或下划线开头(而非数字),函数名对大小写不敏感,函数名应该能够反映函数所执行的任务。
默认函数值:调用时没参数就会用默认的值,本例中是50.
function setHeight($minheight=50) {
echo "The height is : $minheight
";
}
array() 函数用于创建数组。
count()用于获取数组元素数量(索引例子中是3个)。
三种数组类型:
索引数组 - 带有数字索引的数组(从0开始):
$cars=array("porsche","BMW","Volvo");
或者
$cars[0]="porsche";
$cars[1]="BMW";
$cars[2]="Volvo";
关联数组 - 带有指定键的数组(感觉类似于字典)
$age=array("Bill"=>"35","Steve"=>"37","Elon"=>"43");
或者
$age['Bill']="63";
$age['Steve']="56";
$age['Elon']="47";
多维数组 - 包含一个或多个数组的数组
在高级部分中学习
sort() - 以升序对数组排序
rsort() - 以降序对数组排序
asort() - 根据值,以升序对关联数组进行排序
ksort() - 根据键,以升序对关联数组进行排序
arsort() - 根据值,以降序对关联数组进行排序
krsort() - 根据键,以降序对关联数组进行排序
例子:“Bill”=>“63”;键=>值
__LINE__
文件中的当前行号。
__FILE__
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__FUNCTION__
函数名称。
__CLASS__
类的名称。
__TRAIT__
Trait 的名字。
__METHOD__
类的方法名。
__NAMESPACE__
当前命名空间的名称。
$GLOBALS[index] 的数组中存储了所有全局变量,变量的名字就是数组的键,可在任意位置访问全局变量(从函数或方法中均可)。例子:
$_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。
$_REQUEST 用于收集 HTML 表单(包括post和get)提交的数据。例子:
$_POST 广泛用于收集提交 method=“post” 的 HTML 表单后的表单数据,也常用于传递变量。例子:
$_GET 也可用于收集提交 HTML 表单 (method=“get”) 之后的表单数据,也可以收集 URL 中的发送的数据。
总结: $_REQUEST[“参数”]具用 $_POST[“参数”] $_GET[“参数”]的功能,但是 $_REQUEST[“参数”]比较慢。
$_GET 和 $_POST 用于收集表单数据。
GET 和 POST 都创建数组,此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。
GET 和 POST 被视作 $_GET 和 $_POST。它们是超全局变量,这意味着对它们的访问无需考虑作用域 - 无需任何特殊代码,您能够从任何函数、类或文件访问它们。
$_GET 是通过 URL 参数传递到当前脚本的变量数组。
$_POST 是通过 HTTP POST 传递到当前脚本的变量数组。
GET 方法从表单发送的信息对任何人都是可见的(所有变量名和值都显示在 URL 中)。GET 对所发送信息的数量也有限制。限制在大约 2000 个字符。不过,由于变量显示在 URL 中,把页面添加到书签中也更为方便。
POST 方法从表单发送的信息对其他人是不可见的(所有名称/值会被嵌入 HTTP 请求的主体中),并且对所发送信息的数量也无限制,支持高阶功能,比如在向服务器上传文件时进行 multi-part 二进制输入。
总结:post更安全,get可以把页面添加到书签
PHP执行表单验证来提高安全性。
htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
trim() 函数去除输入数据中不必要的字符(多余的空格、制表符、换行)。
stripslashes() 函数删除用户输入数据中的反斜杠(\)
总结:$_SERVER[“PHP_SELF”] 不安全,容易被xss注入js脚本,需要用到htmlspecialchars() 函数来把特殊字符转换为 HTML 实体。例子:
制作必填输入字段方法:
输入部分:为每个 $_POST 变量添加了一个 if else 语句。这条语句检查 $_POST 变量是否为空(通过 PHP empty() 函数)。如果为空,则错误消息会存储于不同的错误变量中。如果不为空,则通过 test_input() 函数发送用户输入数据。
例子:
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
}
输出部分:在每个被请求字段后面增加了一点脚本。如果需要,会生成恰当的错误消息。例子:
Name:
* //若错误则输出nameErr
验证名字:
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) { //只允许字母和空格
$nameErr = "只允许字母和空格!";
}
验证email:
$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$emailErr = "无效的 email 格式!";
}
验证url:
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%
=~_|]/i",$website)) {
$websiteErr = "无效的 URL";
}
总结:通过preg_match() 函数检索字符串的模式,如果模式存在则返回 true,否则返回 false。
多维数组指的是包含一个或多个数组的数组。
例子:
";//
echo $cars[1][0].": 库存:".$cars[1][1].", 已售:".$cars[1][2].".
";
echo $cars[2][0].": 库存:".$cars[2][1].", 已售:".$cars[2][2].".
";
echo $cars[3][0].": 库存:".$cars[3][1].", 已售:".$cars[3][2].".
";
?>
date(format,timestamp)
format:必需。规定时间戳的格式。
timestamp:可选。规定时间戳,默认是当前时间和日期。
日期:
d - 表示月里的某天(01-31)
m - 表示月(01-12)
Y - 表示年(四位数)
1 - 表示周里的某天
其他字符,比如 “/”, “.” 或 “-” 也可被插入字符中,以增加其他格式。例子
";//今天是 2021/02/25
echo "今天是 " . date("Y.m.d") . "
";//今天是 2021.02.25
echo "今天是 " . date("Y-m-d") . "
";//今天是 2021-02-25
echo "今天是 " . date("l");//今天是 Thursday
?>
时间:
h - 带有首位零的 12 小时小时格式
i - 带有首位零的分钟
s - 带有首位零的秒(00 -59)
a - 小写的午前和午后(am 或 pm)
例子:
include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。(程序员为了减少工作量而吧相同的部分写入一个文件。)
include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。
include 和 require 语句是相同的,除了错误处理方面:
require 会生成致命错误(E_COMPILE_ERROR)并停止脚本。
include 只生成警告(E_WARNING),并且脚本会继续。
include 'filename';
或
require 'filename';
例子:我们有一个名为 “footer.php” 的标准的页脚文件如下:
Copyright © 2006-" . date("Y") . " W3School.com.cn";
?>
如需在一张页面中引用这个页脚文件,请使用 include 语句:
欢迎访问我们的首页!
一段文本。
一段文本。
//Copyright © 2006-2021 W3School.com.cn
readfile() 函数读取文件,并把它写入输出缓冲。
例子:
打开文件:
打开文件的更好的方法是通过 fopen() 函数,此函数比readfile() 函数有更多选项。
fopen() 的第一个参数包含被打开的文件名,第二个参数规定打开文件的模式。例子:
读取文件:
fread() 函数读取打开的文件,fread() 的第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数。
读取单行文件:
fgets() 函数用于从文件读取单行。
读取单字符:
fgetc() 函数用于从文件中读取单个字符。
关闭文件:
fclose() 函数用于关闭打开的文件。
检查 End-Of-File:
feof() 函数检查是否已到达 “end-of-file” (在操作系统中表示资料源无更多的资料可读取)。
创建文件:
fopen() 函数也用于创建文件,用 fopen() 打开并不存在的文件,此函数会创建文件,假定文件被打开为写入(w)或增加(a)。
写入文件:
fwrite() 函数用于写入文件,fwrite() 的第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串。
创建一个文件上传表单:
创建上传脚本
0)
{
echo "Error: " . $_FILES["file"]["error"] . "
";//由文件上传导致的错误代码
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";//被上传文件的名称
echo "Type: " . $_FILES["file"]["type"] . "
";//被上传文件的名称
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";/*被上传文件的大小,以字节计*/
echo "Stored in: " . $_FILES["file"]["tmp_name"];//存储在服务器的文件的临时副本的名称
}
?>
上传限制并保存被上传的文件
0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";
echo "Type: " . $_FILES["file"]["type"] . "
";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
创建 cookie:
setcookie() 函数用于设置 cookie。
setcookie(name,value,expire,path,domain,secure)
name:必需。规定 cookie 的名称。
value:必需。规定 cookie 的值。
expire:可选。规定 cookie 的有效期,单位:秒。
path:可选,规定 cookie 的服务器路径。
domain:可选。规定 cookie 的域名。
secure:可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
取回 Cookie 的值:
$_COOKIE 变量用于取回 cookie 的值。
例子:查看是否设置cookie
";
else
echo "Welcome guest!
";
?>
删除 cookie:
删除 cookie 时,您应当使过期日期变更为过去的时间点。
例子:
session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
开始 PHP Session:
session_start() 函数必须位于html标签之前
/*此代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。*/
存储 Session 变量:
存储和取回 session 变量是使用 PHP $_SESSION 变量
终结 Session:
删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。
unset() 函数用于释放指定的 session 变量:
也可以通过 session_destroy() 函数彻底终结 session(session_destroy() 将重置 session,您将失去所有已存储的 session 数据。):
mail() 函数用于从脚本中发送电子邮件。
mail(to,subject,message,headers,parameters)
to:必需。规定 email 接收者。
subject :必需。规定 email 的主题。注释:该参数不能包含任何新行字符。
message:必需。定义要发送的消息。应使用 LF (\n) 来分隔各行。
headers:可选。规定附加的标题,比如 From、Cc 以及 Bcc。应当使用 CRLF (\r\n) 分隔附加的标题。
parameters:可选。对邮件发送程序规定额外的参数。
例子:
采用过滤器来防止注入:
过滤器:
FILTER_SANITIZE_EMAIL 从字符串中删除电子邮件的非法字符
FILTER_VALIDATE_EMAIL 验证电子邮件地址
基本的错误处理:使用 die() 函数
创建自定义错误处理器:
error_function(error_level,error_message,error_file,error_line,error_context)
error_level:必需。为用户定义的错误规定错误报告级别。必须是一个值数。
error_message:必需。为用户定义的错误规定错误消息。
error_file:可选。规定错误在其中发生的文件名。
error_line :可选。规定错误发生的行号。
error_context:可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
错误级别:
修改错误处理程序:
使用自定义函数来处理所有错误,set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别。
Error: [$errno] $errstr";/*实例:Error: [8] Undefined variable: test*/
}
//set error handler
set_error_handler("customError");/*规定错误默认处理函数*/
//trigger error
echo($test);
?>
触发错误:
使用trigger_error() 在脚本中用户输入数据的位置,当用户的输入无效时触发错误的很有用的。
1)
{
trigger_error("Value must be 1 or below");
}
?>
错误记录:
通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。
error_log(message,type,destination,headers);
message:必需。规定要记录的错误消息。
type:可选。规定错误应该发送到何处。可能的值:
0 - 默认。消息被发送到 PHP 的系统日志,使用操作系统的日志机制或者一个文件,取决于 php.ini 中如何 error_log 指令。
1 - 消息被发送到参数 destination 设置的邮件地址。第四个参数 extra_headers 只有在这个类型里才会被用到。
2 - 不再使用(仅用在 PHP 3 中)
3 - 消息被发送到位置为 destination 的文件里。字符 message 不会默认被当做新的一行。
4 - 消息被直接发送到 SAPI 日志处理程序中。
destination:可选。规定错误消息的目标。该值由 type 参数的值决定。
headers:可选。规定额外的头,比如 From、Cc 和 Bcc。该信息类型使用了 mail() 的同一个内置函数。仅当 message_type 设置为 1 的时候使用。应当使用 CRLF (\r\n) 来分隔多个头。
例子
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
当前代码状态被保存
代码执行被切换到预定义的异常处理器函数
根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
异常的基本使用:
正确的处理程序应当包括:
Try - 使用异常的函数应该位于 “try” 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 “throw” 必须对应至少一个 “catch”
Catch - “catch” 代码块会捕获异常,并创建一个包含异常信息的对象
例子
getLine().' in '.$this->getFile()/*创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。*/
.': '.$this->getMessage().' is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
//输出:Message: Value must be 1 or below
创建一个自定义的 Exception 类:
创建了一个专门的类,当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。新的类是旧的 exception 类的副本,外加 errorMessage() 函数。正因为它是旧类的副本,因此它从旧类继承了属性和方法,我们可以使用 exception 类的方法,比如 getLine() 、 getFile() 以及 getMessage()。
getLine().' in '.$this->getFile()
.': '.$this->getMessage().' is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
多个异常:
可以使用多个 if…else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息
getLine().' in '.$this->getFile()
.': '.$this->getMessage().' is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 “catch” 代码块中再次抛出异常。脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常
getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "[email protected]";
try
{
try
{
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e)
{
//re-throw exception
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
异常总结:
需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
使用多个 catch 代码块可以捕获不同种类的异常。
可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
过滤器用于验证和过滤来自非安全来源的数据。
过滤器函数:
filter_has_var() 函数检查是否存在指定输入类型的变量。
filter_has_var(type, variable)
type :必需。规定要检查的类型。可能的值:INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV
variable:必需。规定要检查的变量。
filter_id() 函数返回指定过滤器的 ID 号。
filter_id(filter_name)
filter_input() 函数从脚本外部获取输入,并进行过滤,本函数用于对来自非安全来源的变量进行验证,比如用户的输入。
filter_input(input_type, variable, filter, options)
input_type:必需。规定输入类型。参见上面的列表中可能的类型。
variable:规定要过滤的变量。
filter :可选。规定要使用的过滤器的 ID。默认是 FILTER_SANITIZE_STRING。过滤器 ID 可以是 ID 名称 (比如 FILTER_VALIDATE_EMAIL),或 ID 号(比如 274)。
options:规定包含标志/选项的数组。检查每个过滤器可能的标志和选项。
filter_input_array() 函数从脚本外部获取多项输入,并进行过滤。
filter_input(input_type, args)
input_type:必需。规定输入类型。参见上面的列表中可能的类型。
args :可选。规定过滤器参数数组。合法的数组键是变量名。合法的值是过滤器 ID,或者规定过滤器、标志以及选项的数组。该参数也可以是一个单独的过滤器 ID,如果是这样,输入数组中的所有值由指定过滤器进行过滤。
filter_list() 函数返回包含所有得到支持的过滤器的一个数组。
filter_list()
filter_var_array() 函数获取多项变量,并进行过滤。
filter_var_array(array, args)
array:必需。规定带有字符串键的数组,包含要过滤的数据。
args :可选。规定过滤器参数数组。合法的数组键是变量名。合法的值是过滤器 ID,或者规定过滤器、标志以及选项的数组。该参数也可以是一个单独的过滤器 ID,如果是这样,输入数组中的所有值由指定过滤器进行过滤。
filter_var() 函数通过指定的过滤器过滤变量。
variable:必需。规定要过滤的变量。
filter:可选。规定要使用的过滤器的 ID。
options:规定包含标志/选项的数组。检查每个过滤器可能的标志和选项。
两种过滤器:
Validating 过滤器:用于验证用户输入,严格的格式规则(比如 URL 或 E-Mail 验证),如果成功则返回预期的类型,如果失败则返回 FALSE
Sanitizing 过滤器:用于允许或禁止字符串中指定的字符,无数据格式规则,始终返回字符串
建立连接:
mysql_connect(servername,username,password);
servername:可选。规定要连接的服务器。默认是 “localhost:3306”。
username:可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。
password:可选。规定登录所用的密码。默认是 “”。
关闭连接:
mysql_close()
例子
创建数据库:
CREATE DATABASE database_name
创建表:
CREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
.......
)
INSERT INTO table_name
VALUES (value1, value2,....)
也可以指定插入的列
INSERT INTO table_name (column1, column2,...)
VALUES (value1, value2,....)
SQL 语句对大小写不敏感。INSERT INTO 与 insert into 相同。
让 PHP 执行该语句,我们必须使用 mysql_query() 函数。该函数用于向 MySQL 连接发送查询或命令。
SELECT column_name(s) FROM table_name
例子:
";
}
mysql_close($con);
?>
选取匹配指定条件的数据,请向 SELECT 语句添加 WHERE 子句。
SELECT column FROM table
WHERE column operator value
例子:
";
}
?>
ORDER BY 关键词用于对记录集中的数据进行排序。
SELECT column_name(s)
FROM table_name
ORDER BY column_name
例子:
";
}
mysql_close($con);
?>
UPDATE table_name
SET column_name = new_value
WHERE column_name = some_value
DELETE FROM table_name
WHERE column_name = some_value