渗透测试学习1:PHP

一.基础部分

变量

变量规则:变量以$开头,变量名称以以字母或下划线开头,变量名称只包含字母数字字符和下划线,大小写敏感
三种作用域:
函数之外声明的变量拥有 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 <br>";
}

数组

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] 的数组中存储了所有全局变量,变量的名字就是数组的键,可在任意位置访问全局变量(从函数或方法中均可)。例子:

<?php 
$x = 75; 
$y = 25;

function addition() { 
 $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}

addition(); 
echo $z;  // $z=100
?>

$_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。
截自w3school
$_REQUEST 用于收集 HTML 表单(包括post和get)提交的数据。例子:

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php 
$name = $_REQUEST['fname']; //获取我们输入的fname
echo $name; 
?>

</body>
</html>

$_POST 广泛用于收集提交 method=“post” 的 HTML 表单后的表单数据,也常用于传递变量。例子:

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php 
$name = $_POST['fname'];
echo $name; 
?>

</body>
</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 实体。例子:

<?php
// 定义变量并设置为空值
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);//调用过滤来提高安全性
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}
//过滤函数
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

表单验证 - 必填字段

制作必填输入字段方法:
输入部分:为每个 $_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: <input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span> //若错误则输出nameErr

表单验证 - 验证 E-mail 和 URL

验证名字:

$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。

三.高级部分

多维数组

多维数组指的是包含一个或多个数组的数组。
例子:

<?php
$cars = array
   (
   array("Volvo",33,20),
   array("BMW",17,15),
   array("Saab",5,2),
   array("Land Rover",15,11)
   );
   
echo $cars[0][0].": 库存:".$cars[0][1].", 已售:".$cars[0][2].".<br>";//
echo $cars[1][0].": 库存:".$cars[1][1].", 已售:".$cars[1][2].".<br>";
echo $cars[2][0].": 库存:".$cars[2][1].", 已售:".$cars[2][2].".<br>";
echo $cars[3][0].": 库存:".$cars[3][1].", 已售:".$cars[3][2].".<br>";
?>

日期和时间

date(format,timestamp)
format:必需。规定时间戳的格式。
timestamp:可选。规定时间戳,默认是当前时间和日期。
日期:
d - 表示月里的某天(01-31)
m - 表示月(01-12)
Y - 表示年(四位数)
1 - 表示周里的某天
其他字符,比如 “/”, “.” 或 “-” 也可被插入字符中,以增加其他格式。例子

<?php
echo "今天是 " . date("Y/m/d") . "<br>";//今天是 2021/02/25
echo "今天是 " . date("Y.m.d") . "<br>";//今天是 2021.02.25
echo "今天是 " . date("Y-m-d") . "<br>";//今天是 2021-02-25
echo "今天是 " . date("l");//今天是 Thursday
?>

时间:
h - 带有首位零的 12 小时小时格式
i - 带有首位零的分钟
s - 带有首位零的秒(00 -59)
a - 小写的午前和午后(am 或 pm)
例子:

<?php
echo "现在时间是 " . date("h:i:sa");//当前时间是 11:22:50am
?>

Include 文件

include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。(程序员为了减少工作量而吧相同的部分写入一个文件。)
include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。
include 和 require 语句是相同的,除了错误处理方面:
require 会生成致命错误(E_COMPILE_ERROR)并停止脚本。
include 只生成警告(E_WARNING),并且脚本会继续。

include 'filename';
或
require 'filename';

例子:我们有一个名为 “footer.php” 的标准的页脚文件如下:

<?php
echo "<p>Copyright © 2006-" . date("Y") . " W3School.com.cn</p>";
?>

如需在一张页面中引用这个页脚文件,请使用 include 语句:

<html>
<body>

<h1>欢迎访问我们的首页!</h1>
<p>一段文本。</p>
<p>一段文本。</p>
<?php include 'footer.php';?>//Copyright © 2006-2021 W3School.com.cn

</body>
</html>

文件处理

readfile() 函数读取文件,并把它写入输出缓冲。
例子:

<?php
echo readfile("webdictionary.txt");
?>

文件打开/读取/关闭

打开文件:
打开文件的更好的方法是通过 fopen() 函数,此函数比readfile() 函数有更多选项。
fopen() 的第一个参数包含被打开的文件名,第二个参数规定打开文件的模式。例子:

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fread($myfile,filesize("webdictionary.txt"));
fclose($myfile);
?>

参数:
在这里插入图片描述

读取文件:
fread() 函数读取打开的文件,fread() 的第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数。

读取单行文件:
fgets() 函数用于从文件读取单行。

读取单字符:
fgetc() 函数用于从文件中读取单个字符。

关闭文件:
fclose() 函数用于关闭打开的文件。

检查 End-Of-File:
feof() 函数检查是否已到达 “end-of-file” (在操作系统中表示资料源无更多的资料可读取)。

文件创建/写入

创建文件:
fopen() 函数也用于创建文件,用 fopen() 打开并不存在的文件,此函数会创建文件,假定文件被打开为写入(w)或增加(a)。

写入文件:
fwrite() 函数用于写入文件,fwrite() 的第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串。

文件上传

创建一个文件上传表单:

<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">/*在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。*/
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 输入文件
<br />
<input type="submit" name="submit" value="Submit" />//提交按钮
</form>

</body>
</html>

创建上传脚本

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";//由文件上传导致的错误代码
  }
else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";//被上传文件的名称
  echo "Type: " . $_FILES["file"]["type"] . "<br />";//被上传文件的名称
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";/*被上传文件的大小,以字节计*/
  echo "Stored in: " . $_FILES["file"]["tmp_name"];//存储在服务器的文件的临时副本的名称
  }
?>

上传限制并保存被上传的文件

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    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 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 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

<html>
<body>

<?php
if (isset($_COOKIE["user"]))/*isset() 函数用于检测变量是否已设置并且非 NULL, $_COOKIE 变量用于取回 cookie 的值。*/
 echo "Welcome " . $_COOKIE["user"] . "!<br />";
else
 echo "Welcome guest!<br />";
?>

</body>
</html>

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

<?php 
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>

Sessions

session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。

开始 PHP Session:
session_start() 函数必须位于html标签之前

<?php session_start(); ?>/*此代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。*/

<html>
<body>

</body>
</html>

存储 Session 变量:
存储和取回 session 变量是使用 PHP $_SESSION 变量

<?php
session_start();
// store session data
$_SESSION['views']=1;
?>

<html>
<body>

<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];//Pageviews=1
?>

</body>
</html>

终结 Session:
删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。

unset() 函数用于释放指定的 session 变量:

<?php
unset($_SESSION['views']);
?>

也可以通过 session_destroy() 函数彻底终结 session(session_destroy() 将重置 session,您将失去所有已存储的 session 数据。):

<?php
session_destroy();
?>

发送电子邮件

mail() 函数用于从脚本中发送电子邮件。

mail(to,subject,message,headers,parameters)

to:必需。规定 email 接收者。
subject :必需。规定 email 的主题。注释:该参数不能包含任何新行字符。
message:必需。定义要发送的消息。应使用 LF (\n) 来分隔各行。
headers:可选。规定附加的标题,比如 From、Cc 以及 Bcc。应当使用 CRLF (\r\n) 分隔附加的标题。
parameters:可选。对邮件发送程序规定额外的参数。
例子:

<?php

$to = "someone@example.com";
$subject = "Test mail";
$message = "Hello! This is a simple email message.";
$from = "someonelse@example.com";
$headers = "From: $from";
mail($to,$subject,$message,$headers);
echo "Mail Sent.";

?>

安全的电子邮件

采用过滤器来防止注入:
过滤器:
FILTER_SANITIZE_EMAIL 从字符串中删除电子邮件的非法字符
FILTER_VALIDATE_EMAIL 验证电子邮件地址

错误处理

基本的错误处理:使用 die() 函数

<?php
if(!file_exists("welcome.txt"))
 {
 die("File not found");//若不存在则提示File not found
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

创建自定义错误处理器:

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() 仅需要一个参数,可以添加第二个参数来规定错误级别。

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr";/*实例:Error: [8] Undefined variable: test*/
 }

//set error handler
set_error_handler("customError");/*规定错误默认处理函数*/

//trigger error
echo($test);
?>

触发错误:
使用trigger_error() 在脚本中用户输入数据的位置,当用户的输入无效时触发错误的很有用的。

<?php
$test=2;
if ($test>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) 来分隔多个头。
例子

<?php
// 如果错误连接至数据库,则向服务器日志发送错误消息
if (!mysqli_connect("localhost","bad_user","bad_password","my_db")) {
    error_log("Failed to connect to database!", 0);
}

// 如果用完 FOO,向管理员发送电邮
if (!($foo = allocate_new_foo())) {
    error_log("Oh no! We are out of FOOs!", 1, "admin@example.com");
}
?> 

异常处理

异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
当前代码状态被保存
代码执行被切换到预定义的异常处理器函数
根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本

异常的基本使用:
正确的处理程序应当包括:
Try - 使用异常的函数应该位于 “try” 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 “throw” 必须对应至少一个 “catch”
Catch - “catch” 代码块会捕获异常,并创建一个包含异常信息的对象
例子

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()/*创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。*/
  .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
  return $errorMsg;
  }
 }

$email = "someone@example...com";

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()。

<?php
class customException extends Exception//类的扩展
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
  .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
  return $errorMsg;
  }
 }

$email = "someone@example...com";

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 类,并返回不同的错误消息

<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}

$email = "someone@example.com";

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” 代码块中再次抛出异常。脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常

<?php
class customException extends Exception
 {
 public function errorMessage()//如果 e-mail 地址不合法,则该函数返回一个错误消息。
  {
  //error message
  $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
  return $errorMsg;
  }
 }

$email = "someone@example.com";

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()
例子

<?php
$con = mysql_connect("localhost","peter","abc123");//建立连接
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

// some code

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 连接发送查询或命令。

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("my_db", $con);

mysql_query("INSERT INTO Persons (FirstName, LastName, Age) 
VALUES ('Peter', 'Griffin', '35')");//插入

mysql_query("INSERT INTO Persons (FirstName, LastName, Age) 
VALUES ('Glenn', 'Quagmire', '33')");//插入

mysql_close($con);
?>

从数据库选取数据

SELECT column_name(s) FROM table_name

例子:

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("my_db", $con);

$result = mysql_query("SELECT * FROM Persons");/*查询Persons的全部*/

while($row = mysql_fetch_array($result))
  {
  echo $row['FirstName'] . " " . $row['LastName'];
  echo "<br />";
  }

mysql_close($con);
?>

选取匹配指定条件的数据

选取匹配指定条件的数据,请向 SELECT 语句添加 WHERE 子句。

SELECT column FROM table
WHERE column operator value

例子:

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("my_db", $con);

$result = mysql_query("SELECT * FROM Persons
WHERE FirstName='Peter'");/*选取FirstName='Peter' 的一行*/

while($row = mysql_fetch_array($result))
  {
  echo $row['FirstName'] . " " . $row['LastName'];
  echo "<br />";
  }

?>

数据排序

ORDER BY 关键词用于对记录集中的数据进行排序。

SELECT column_name(s)
FROM table_name
ORDER BY column_name

例子:

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("my_db", $con);

$result = mysql_query("SELECT * FROM Persons ORDER BY age");/*按年龄升序排列*/

while($row = mysql_fetch_array($result))
  {
  echo $row['FirstName'];
  echo " " . $row['LastName'];
  echo " " . $row['Age'];
  echo "<br />";
  }

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
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值