WEB安全PHP基础

0x001 PHP基础教程


1. PHP 简介

PHPPHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言,吸纳JavaPerl多个语言的特色发展出自己的特色语法,并根据它们的长项持续改进提升自己,例如java的面向对象编程,该语言当初创建的主要目标是让开发人员快速编写出优质的web网站。PHP同时支持面向对象和面向过程的开发,使用上非常灵活。

2. PHP 安装

在自己电脑上安装 PHP 环境练习,可以安装 phpstudy ,里面提供了多种服务器环境,而且使用比较简单。

其他安装方法可以前往 PHP官网 查看。

3. PHP 语法

php 脚本可以放置于文档中的任何位置

基础语法

<?php
    // 此处是php代码
?>

PHP 语句以分号结尾( ; )。PHP 代码块的关闭标签也会自动表明分号(因此在 PHP 代码块的最后一行不必使用分号)。

PHP中的注释

<?php
    // 单行注释
    
    # 单行注释
    
    /*
    这是多行注释
    */
?>

PHP大小写敏感

4. PHP变量

变量是存储信息的容器:

PHP 变量规则:

  • 变量以 $ 符号开头,其后是变量的名称
  • 变量名称必须以字母或下划线开头
  • 变量名称不能以数字开头
  • 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
  • 变量名称对大小写敏感($y 与 $Y 是两个不同的变量)

注释:PHP 变量名称对大小写敏感!

<?php
    $txt="Hello world!";
    $x=5;
    $y=10.5;
?>

注释:如果您为变量赋的值是文本,请用引号包围该值。

PHP 变量作用域

在 PHP 中,可以在脚本的任意位置对变量进行声明。

变量的作用域指的是变量能够被引用/使用的那部分脚本。

PHP 有三种不同的变量作用域:

  • local(局部)
  • global(全局)
  • static(静态)

Local 和 Global 作用域

  • 函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
  • 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
<?php
    $x=5; // 全局作用域
    
    function myTest() {
      $y=10; // 局部作用域
      echo "<p>测试函数内部的变量:</p>";
      echo "变量 x 是:$x";
      echo "<br>";
      echo "变量 y 是:$y";
    } 
    
    myTest();
    
    echo "<p>测试函数之外的变量:</p>";
    echo "变量 x 是:$x";
    echo "<br>";
    echo "变量 y 是:$y";
?>

5. PHP echo 和 print

在 PHP 中,有两种基本的输出方法:echo 和 print。

echo 和 print 的区别:

  • echo - 能够输出一个以上的字符串
  • print - 只能输出一个字符串,并始终返回 1

echo 语句

<?php
    $test = "Hello World"
    
    // 输出字符串
    echo "hello world";
    // 输出变量
    echo "$test";
?>

echo 是一个语言结构,有无括号均可使用:echo 或 echo()。

print 语句

<?php
    $demo = "hello world"
    
    // 输出字符串
    print "Hello World";
    // 输出变量
    print $demo;
?>

print 也是语言结构,有无括号均可使用:print 或 print()。

6. PHP 数据类型

PHP 数据类型为:字符串、整数、浮点数、逻辑、数组、对象、NULL。

6.1 PHP 字符串

字符串可以是引号内的任何内容,即可以使用单引号或者双引号

<?php
    echo "hello world";
    echo 'Hello World';
?>
6.2 PHP 整数

整数是没有小数点的数字

整数规则:

  • 整数必须有至少一个数字(0-9)
  • 整数不能包含逗号或空格
  • 整数不能有小数点
  • 整数正负均可
  • 可以用三种格式规定整数:十进制、十六进制(前缀是 0x)或八进制(前缀是 0)
<?php
    $a = 3567;
    $b = -786;
    $c = 0x8C;
    $d = 047;
    var_dump($a); 
    var_dump($b); // 负数
    var_dump($c); // 十六进制
    var_dump($d); // 八进制
?>

var_dump() 函数会返回变量的数据类型和值。

6.3 PHP 浮点数

浮点数是有小数点或指数形式的数字。

<?php
    $x = 10.365;
    var_dump($x);

    $y = 2.4e3;
    var_dump($x);

    $z = 8E-5;
    var_dump($x);
?>
6.4 PHP 逻辑

逻辑是 true 或 false。

$x=true;
$y=false;

逻辑常用于条件测试。

6.5 PHP 数组

数组在一个变量中存储多个值。

<?php 
    $cars=array("Volvo","BMW","SAAB");
    var_dump($cars);
?>
6.6 PHP 对象

对象是存储数据和有关如何处理数据的信息的数据类型。

在 PHP 中,必须明确地声明对象。

首先我们必须声明对象的类。对此,我们使用 class 关键词。类是包含属性和方法的结构。

<?php
class Car
{
    var $color;
    function Car($color="green") {
        $this->color = $color;
    }
    function what_color() {
        return $this->color;
    }
}
?>
6.7 PHP NULL 值

特殊的 NULL 值表示变量无值。NULL 是数据类型 NULL 唯一可能的值。

NULL 值标示变量是否为空。也用于区分空字符串与空值数据库。

可以通过把值设置为 NULL,将变量清空:

<?php
    $x="Hello world!";
    $x=null;
    var_dump($x);
?>

7. PHP 字符串函数

strlen() 函数返回字符串的长度,以字符计。

<?php
    echo strlen("Hello world!");
?>

strlen() 常用于循环和其他函数,在确定字符串何时结束很重要时。(例如,在循环中,我们也许需要在字符串的最后一个字符之后停止循环)。

str_word_count() 函数对字符串中的单词进行计数:

<?php
    echo str_word_count("Hello world!"); // 输出 2
?>

strrev() 函数反转字符串:

<?php
    echo strrev("Hello world!"); // 输出 !dlrow olleH
?>

strpos() 函数用于检索字符串内指定的字符或文本。

如果找到匹配,则会返回首个匹配的字符位置。如果未找到匹配,则将返回 FALSE。

<?php
    echo strpos("Hello world!","world");
?>

str_replace() 函数用一些字符串替换字符串中的另一些字符。

<?php
    echo str_replace("world", "Kitty", "Hello world!"); // 输出 Hello Kitty!
?>

更多函数详解

8. 常量

常量是单个值的标识符(名称)。在脚本中无法改变该值。

有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)。

注释:与变量不同,常量贯穿整个脚本是自动全局的。

设置变量

使用 define() 函数 - 它使用三个参数:

  • 首个参数定义常量的名称
  • 第二个参数定义常量的值
  • 可选的第三个参数规定常量名是否对大小写不敏感。默认是 false。
<?php
    define("GREETING", "Hello World", true);
    echo greeting;
?>

常量是自动全局的,而且可以贯穿整个脚本使用。

<?php
define("GREETING", "Hello World");

function myTest() {
    echo GREETING;
}
 
myTest();
?>

9. PHP 运算符

9.1 PHP 算数运算符

+(加)、-(减)、*(乘)、/(除)、%(取模)

9.2 PHP 赋值运算符

PHP 赋值运算符用于向变量写值。

PHP 中基础的赋值运算符是 "="。这意味着右侧赋值表达式会为左侧运算数设置值。

=、+=、-=、*=、/=、%=

9.3 PHP 字符串运算符

. 串接
.= 串接赋值

9.4 PHP 递增/递减运算符
运算符 名称 描述
++$x 前递增 $x 加一递增,然后返回 $x
$x++ 后递增 返回 $x,然后 $x 加一递增
--$x 前递减 $x 减一递减,然后返回 $x
$x-- 后递减 返回 $x,然后 $x 减一递减
9.5 PHP 比较运算符

PHP 比较运算符用于比较两个值(数字或字符串):

==	 等于
===	 全等(完全相同)
!=	 不等于
<>	 不等于
!==	 不全等(完全不同)
>	 大于
<	 小于
>=	 大于或等于
<=	 小于或等于
9.6 PHP 逻辑运算符
and	 与
or	  或
xor	 异或
&&	 与
||	 或
!	 非
9.7 PHP 数组运算符
+	 联合
==	 相等
===	 全等
!=	 不相等
<>	 不相等
!==	 不全等

10. PHP 循环语句

10.1 PHP 条件语句
10.1.1 PHP - if 语句

if 语句用于在指定条件为 true 时执行代码。

<?php
    if (条件) {
      当条件为 true 时执行的代码;
    }
?>
10.1.2 PHP - if...else 语句

if....else 语句在条件为 true 时执行代码,在条件为 false 时执行另一段代码。

<?php
    if (条件) {
        条件为 true 时执行的代码;
    } else {
        条件为 false 时执行的代码;
    }
?>
10.1.3 PHP - if...elseif....else 语句

if....elseif...else 语句来根据两个以上的条件执行不同的代码。

<?php
    if (条件) {
        条件为 true 时执行的代码;
    } elseif (condition) {
        条件为 true 时执行的代码;
    } else {
        条件为 false 时执行的代码;
    }
?>

10.2 PHP Switch 语句

使用 Switch 语句可以避免冗长的 if..elseif..else 代码块。

<?php
    switch (expression){
        case label1:
            expression = label1 时执行的代码 ;
            break;  
        case label2:
            expression = label2 时执行的代码 ;
            break;
        default:
            表达式的值不等于 label1 及 label2 时执行的代码;
    }
?>

工作原理:

  1. 对表达式(通常是变量)进行一次计算
  2. 把表达式的值与结构中 case 的值进行比较
  3. 如果存在匹配,则执行与 case 关联的代码
  4. 代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
  5. 如果没有 case 为真,则使用 default 语句

10.3 PHP while 循环

循环语句

  • while - 只要指定条件为真,则循环代码块
  • do...while - 先执行一次代码块,然后只要指定条件为真则重复循环
  • for - 循环代码块指定次数
  • foreach - 遍历数组中的每个元素并循环代码块

PHP while 循环在指定条件为 true 时执行代码块。

<?php
    while (条件为真) {
        要执行的代码;
    }
?>

PHP do...while 循环

do...while 循环首先会执行一次代码块,然后检查条件,如果指定条件为真,则重复循环。

<?php
    do {
        要执行的代码;
    } 
    while (条件为真);
?>

do while 循环只在执行循环内的语句之后才对条件进行测试。这意味着 do while 循环至少会执行一次语句,即使条件测试在第一次就失败了。

10.4 PHP for 循环

如果您已经提前确定脚本运行的次数,可以使用 for 循环。

<?php
    for (init counter; test counter; increment counter) {
        code to be executed;
    }
?>

参数:

  • init counter:初始化循环计数器的值
  • test counter:: 评估每个循环迭代。如果值为 TRUE,继续循环。如果它的值为 FALSE,循环结束。
  • increment counter:增加循环计数器的值

PHP foreach 循环

foreach 循环只适用于数组,并用于遍历数组中的每个键/值对。

<?php
foreach ($array as $value) {
    code to be executed;
}
?>

每进行一次循环迭代,当前数组元素的值就会被赋值给 $value 变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。

11. PHP 函数

PHP 用户定义函数

除了内建的 PHP 函数,我们可以创建我们自己的函数。

函数是可以在程序中重复使用的语句块。

页面加载时函数不会立即执行。

函数只有在被调用时才会执行。

在 PHP 创建用户定义函数

用户定义的函数声明以单词 "function" 开头:

<?php
function functionName(){
    被执行的代码;
}
?>

注释:函数名能够以字母或下划线开头(而非数字)。
注释:函数名对大小写不敏感。
提示:函数名应该能够反映函数所执行的任务。

PHP 函数参数

可以通过参数向函数传递信息。参数类似变量。

参数被定义在函数名之后,括号内部。您可以添加任意多参数,只要用逗号隔开即可。

<?php
function familyName($fname) {
    echo "$fname Zhang.<br>";
}

familyName("Li");
familyName("Hong");
familyName("Tao");
familyName("Xiao Mei");
familyName("Jian");
?>

PHP 默认参数值

<?php
function setHeight($minheight=50) {
    echo "The height is : $minheight <br>";
}

setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
?>

PHP 函数 - 返回值

如需使函数返回值,请使用 return 语句:

<?php
function sum($x,$y) {
    $z=$x+$y;
    return $z;
}

echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>

12. PHP 数组

数组能够在单独的变量名中存储一个或多个值。

在 PHP 中创建数组

array() 函数用于创建数组:

在 PHP 中,有三种数组类型:

  1. 索引数组 - 带有数字索引的数组
  2. 关联数组 - 带有指定键的数组
  3. 多维数组 - 包含一个或多个数组的数组

PHP 索引数组

有两种创建索引数组的方法:

索引是自动分配的(索引从 0 开始):

<?php
    $cars=array("porsche","BMW","Volvo");
?>

或者也可以手动分配索引:

<?php
    $cars[0]="porsche";
    $cars[1]="BMW";
    $cars[2]="Volvo";
?>

获得数组的长度 - count() 函数

count() 函数用于返回数组的长度(元素数):

<?php
    $cars=array("porsche","BMW","Volvo");
    echo count($cars);
?>

遍历索引数组

如需遍历并输出索引数组的所有值,您可以使用 for 循环

<?php
$cars=array("porsche","BMW","Volvo");
$arrlength=count($cars);

for($x=0;$x<$arrlength;$x++) {
    echo $cars[$x];
    echo "<br>";
}
?>

PHP 关联数组

关联数组是使用您分配给数组的指定键的数组。

有两种创建关联数组的方法:

<?php
    $age=array("Bill"=>"35","Steve"=>"37","Elon"=>"43");
?>

或者:

<?php
    $age['Bill']="63";
    $age['Steve']="56";
    $age['Elon']="47";
?>

遍历关联数组

如需遍历并输出关联数组的所有值,您可以使用 foreach 循环

<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");

foreach($age as $x=>$x_value) {
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}
?>

13. PHP 数组排序

数组中的元素能够以字母或数字顺序进行升序或降序排序。

PHP - 数组的排序函数

  • sort() - 以升序对数组排序
  • rsort() - 以降序对数组排序
  • asort() - 根据值,以升序对关联数组进行排序
  • ksort() - 根据键,以升序对关联数组进行排序
  • arsort() - 根据值,以降序对关联数组进行排序
  • krsort() - 根据键,以降序对关联数组进行排序

对数组进行升序排序 - sort()

<?php
$cars=array("porsche","BMW","Volvo");
sort($cars);
?>

对数组进行降序排序 - rsort()

<?php
$cars=array("porsche","BMW","Volvo");
rsort($cars);
?>

根据值对数组进行升序排序 - asort()

<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
asort($age);
?>

根据键对数组进行升序排序 - ksort()

<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
ksort($age);
?>

根据值对数组进行降序排序 - arsort()

<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
arsort($age);
?>

根据键对数组进行降序排序 - krsort()

<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
krsort($age);
?>

14. PHP 全局变量 - 超全局变量

超全局变量在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量。

PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。

这些超全局变量是:

  • $GLOBALS
  • $_SERVER
  • $_REQUEST
  • $_POST
  • $_GET
  • $_FILES
  • $_ENV
  • $_COOKIE
  • $_SESSION

$GLOBALS — 引用全局作用域中可用的全部变量

$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。

PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

<?php 
$x = 75; 
$y = 25;
 
function addition() { 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
 
addition(); 
echo $z; 
?>

PHP $_SERVER

$_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。

<?php 
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>

在 $_SERVER 中访问的元素表

元素/代码 描述
$_SERVER['PHP_SELF'] 返回当前执行脚本的文件名。
$_SERVER['GATEWAY_INTERFACE'] 返回服务器使用的 CGI 规范的版本。
$_SERVER['SERVER_ADDR'] 返回当前运行脚本所在的服务器的 IP 地址。
$_SERVER['SERVER_NAME'] 返回当前运行脚本所在的服务器的主机名(比如 www.baudu.com)
$_SERVER['SERVER_SOFTWARE'] 返回服务器标识字符串(比如 Apache/2.2.24)。
$_SERVER['SERVER_PROTOCOL'] 返回请求页面时通信协议的名称和版本(例如,“HTTP/1.0”)
$_SERVER['REQUEST_METHOD'] 返回访问页面使用的请求方法(例如 POST)。
$_SERVER['REQUEST_TIME'] 返回请求开始时的时间戳(例如 1577687494)。
$_SERVER['QUERY_STRING'] 返回查询字符串,如果是通过查询字符串访问此页面。
$_SERVER['HTTP_ACCEPT'] 返回来自当前请求的请求头。
$_SERVER['HTTP_ACCEPT_CHARSET'] 返回来自当前请求的 Accept_Charset头(例如 utf-8,ISO-8859-1)
$_SERVER['HTTP_HOST'] 返回来自当前请求的 Host 头。
$_SERVER['HTTP_REFERER'] 返回当前页面的完整 URL(不可靠,因为不是所有用户代理都支持)
$_SERVER['HTTPS'] 是否通过安全 HTTP 协议查询脚本。
$_SERVER['REMOTE_ADDR'] 返回浏览当前页面的用户的 IP 地址。
$_SERVER['REMOTE_HOST'] 返回浏览当前页面的用户的主机名。
$_SERVER['REMOTE_PORT'] 返回用户机器上连接到 Web 服务器所使用的端口号。
$_SERVER['SCRIPT_FILENAME'] 返回当前执行脚本的绝对路径。
$_SERVER['SERVER_ADMIN'] 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。
$_SERVER['SERVER_PORT'] Web 服务器使用的端口。默认值为 “80”。
$_SERVER['SERVER_SIGNATURE'] 返回服务器版本和虚拟主机名。
$_SERVER['PATH_TRANSLATED'] 当前脚本所在文件系统(非文档根目录)的基本路径。
$_SERVER['SCRIPT_NAME'] 返回当前脚本的路径。
$_SERVER['SCRIPT_URI'] 返回当前页面的 URI。

PHP $_REQUEST

PHP $_REQUEST 用于收集 HTML 表单提交的数据。

<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']; 
    echo $name; 
?>

</body>
</html>

PHP $_POST

PHP $_POST 广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。$_POST 也常用于传递变量。

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

PHP $_GET

PHP $_GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据。

$_GET 也可以收集 URL 中的发送的数据。

<html>
<body>

<a href="test_get.php?subject=PHP&web=W3school.com.cn">测试 $GET</a>

</body>
</html>

当用户点击链接 "测试 $GET",参数 "subject" 和 "web" 被发送到 "test_get.php",然后您就能够通过 $_GET 在 "test_get.php" 中访问这些值了。


0x003 更多教程


想学习更更加深入的内容,请前往:
W3school-PHP教程
菜鸟教程

posted @ 2022-11-17 21:18  Cx330Lm  阅读(46)  评论(0编辑  收藏  举报