PHP基础教程

PHP属于后端语言,后端的核心在于与数据库交互。
常见的后端语言:ASPASPXPHPJSP

什么是PHP?

  1. PHP(超文本预处理器)是一种通用开源脚本语言,是动态语言的一种,动态语言还包括ASP、ASPX、JSP
  2. PHP语法吸收了C、java、Perl的特点,主要用于web开发领域。
  3. PHP可以将程序嵌入到前端代码(HTML、CSS、JS)执行。
  4. PHP支持几乎所有流行的数据库以及操作系统。

使用场景

网站需要动态操作的,如注册,登陆、查询。
网站需要生成静态文件确保安全的。
需要快速看见效果的项目。
部分游戏服务端(swoole扩展)
……

基本语法

  • PHP头部标记风格
1. <?php 这里写代码?>    ##注意:问好和php一定要紧贴,不能带空格

2. <script language = "php">这里写代码</script>

3. <?
   这里写代码     ##前提条件:需要在php.ini的文件中设置打开on,short_open_tag=on,设置后重启apache即可。
   ?>
  • 语句使用分号结尾,不可遗漏。
<?php phpinfo(); ?>
  • 数据类型:String(字符串)、Integer(整型)、Float(浮点型、小数点)、Boolean(布尔型)、Array(数组)、Object(对象)、NULL(空值或者把变量清空)。
  • PHP的变量标识符$,使用时不需要声明,直接使用$变量名。

$a:变量a

  • 常量标识符define【定义后不会改变】

define(常量名,常量值)

<?php
define('a',99);
echo a;
?> 
===========================
99
  • echo后面双引号和单引号的区别:双引号会有解析的作用,而单引号会把单引号内的内容作为字符串直接输出。
  • 调用函数必须使用括号将参数包起来,如md5("admin").
  • PHP输出拼接符.
<?php
echo 'a'.'b';
?>
=======================
ab
<?php
echo '121a' + '2b';
?>
=======================
123
  • PHP注释符://、#、/**/
  • PHP运算符:与C、JAVA一样。

=表示赋值
== 比较数值大小
=== 比较类型且比较数值大小

  • 变量拼接
 $c .= $a  ====> $c = $c.$a   //拼接
<?php
function a($a) {
	$b = $a+1;
	return $b;
}
$a = 10000;
echo a(1);
?>
=========================
2
<?php
$a = 3;
echo '3'.'<br>'.$a;
?>

在这里插入图片描述
换行除了用html中的<br>,在window平台:echo "\r\n";在unix\linux平台相当于 echo "\n";在mac平台中相当于"\r"

PHP函数

自定义函数

function 函数名() {
被执行的代码;
}

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

<?php
a();     // 函数位置不影响,用到后面会自动检索
function a() {
	echo 'aa'.'</br>';       //换行需要借助HTML代码
	echo 'bb';
}
?>
==============================
<?php
echo jia(1,2);
function jia($a,$b) {
	$c = 0;       //可要可不要
	$c = $a + $b;
	return $c;
}
?>

在这里插入图片描述

函数类型

  1. var_dump()——检测数据类型,该函数中显示的字符串规定使用双引号

有一些变量无法输出怎么办?我们可以使用var_dump()去查看其数据类型

<?php
$a = '11';
var_dump($a);
?>
==========================
string(2) "11"

在这里插入图片描述

  1. 使用html语句修改文件编码【一定要写在php代码外面】
<meta charset = 'utf-8'>
<meta charset = 'GBK'>
  1. phpinfo() —— 查看php配置
  2. md5(' ') ——进行md5加密
  3. strstr() —— 查找字符串首次出现的长度
<?php
$a = strstr('25344@example.com','@');
var_dump($a);
?>
=============================

string(12) "@example.com"

在这里插入图片描述
6. strlen() —— 检测字符串的长度

<?php
$a = '25344@example.com';
$b = strlen($a);
echo $b;
?>

===========================
17

在这里插入图片描述
7. .为拼接符

<?php
$a = '25344@example.com';
$b = '64273@example.com';
echo $a.$b;
?>

====================
25344@example.com64273@example.com

在这里插入图片描述
8. die() —— 输出一条消息,并退出当前脚本。

@$username = $_REQUEST['uname'];     
	@$password = $_REQUEST['pwd'];
	if(isset($_REQUEST['uname']) and isset($_REQUEST['pwd'])) {     //isset检验变量是否存在
		$cnno = mysqli_connect('127.0.0.1','root','root','test');    //连接数据库
		$sql = "select * from admin where username = '$username' and password = '$password'";
		$safelogin = $username.$password;
		if(strstr($safelogin,'or')) {
			die('非法攻击');
		}

在这里插入图片描述
9. ."<br>" —— php换行

<?php
$email = '25344@example.com';
$domain = strstr($email,'@');
echo $domain."<br>";
$user1 = strstr($email,'@',false);
echo $user1."<br>";
$user2 = strstr($email,'@',true);
echo $user2;
?>

========================
@example.com
@example.com
25344

在这里插入图片描述

条件分支语句

  • C、JAVA相同(if语句、if...else..、switch
<?php
$a = 3;
if($a=1/'0abc') {    ##均可输出1,原理即为只要不等于0或者null,则为true
	echo 1;
}
?>

在这里插入图片描述

PHP获取表单[表单是HTML的重要组成部分]

下面严重区分大小写:

$_GET[ ]数组获取get方式提交的内容,接受get传参。
$_POST[ ]数组获取post方式提交的内容;
$_COOKIE[ ] 数组获取cookie
$_REQUEST[ ]获取get | post | cookie

<?php
$a = $_GET[1];     ##其中,中括号表示数组的键,表示大柜子中的小柜子
echo $a;
?>

在这里插入图片描述

<?php
$a = 1;
echo $a;
?>
<meta charset = 'utf-8'/>
<form action = 'test.php' method = 'POST'>
	<input type = 'text' name = 'id'/>
	<input type = 'submit'/>
	</form>
<?php
$b = 2;
echo $b.$a;
?>

在这里插入图片描述

  • 利用表单提交post请求
<meta charset = 'utf-8'/>
<form action = 'test.php' method = 'POST'>
	<input type = 'text' name = 'id'/>
	<input type = 'submit'/>
	</form>
<?php
$a = $_POST['id'];
echo $a;
?>

在这里插入图片描述

  • HEAD传参一般不传数据,后续详细讲解。

PHP操作mysql

数据库 => 库、表、字段(列)、数据(记录、行)
desc 表名:查看表中的字段

连接数据库

$conn = mysqli_connect("127.0.0.1","root","root","db_name");    ##地址、账号、密码、数据库名称(可写可不写)
$conn = mysqli_connect("addr","usr","password");

选择数据库

mysqli_select_db($conn,"db_name");    ##conn可以替换成任何字母

执行sql语句

$result = mysqli_query($conn,"SQL语句");

遍历查询结果

$row = mysqli_fetch_row();      ##返回一行
$table = mysqli_fetch_all();    ##返回全部内容(一个表)
$row = mysqli_fetch_array($_result);

关闭数据库连接

 mysqli_close($conn)

表单验证

什么是表单【form】?

表单在网页中主要负责数据采集功能。
一个表单有三个基本组成部分
表单标签:这里面包含了处理表单数据所用动态脚本的URL以及数据提交到服务器的方法。

表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。

表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的动态脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。

 <form  action="https://www.baidu.com/"  method="GET"  target=_blank>        
  ##表单标签【不写传参方式则默认为get,action不写默认提交到本地(可以写网页路径或者相对路径)】

 <input name = "wd"/>        //表单域【采集数据输入框】
 <input type = "submit">
 </form>
 
===============================
类似于get传参$_GET['wd']

在这里插入图片描述
在这里插入图片描述

使用场景

登录框
搜索框
留言框
上传框
……(各种框)
在这里插入图片描述

应用

表单验证的基本流程——在登陆页面提交信息,提交到后端数据库验证,然后返回信息到其他或原有页面

<meta charset = 'utf-8' />
<form><center>
	用户登录<br>
	账号:<input type = 'text' name = 'uname'>
	<br>
	密码:<input type = 'password' name = 'pwd'>
	<br>
	<input type = 'submit'  value = '登录'>
</form></center>

<?php
	@$username = $_REQUEST['uname'];     
	@$password = $_REQUEST['pwd'];
	if(isset($_REQUEST['uname']) and isset($_REQUEST['pwd'])) {     //isset检验变量是否存在
		$cnno = mysqli_connect('127.0.0.1','root','root','test');    //连接数据库
		$sql = "select * from admin where username = '$username' and password = '$password'";
		echo $sql;	 //输出后台数据库执行的代码
		$b = mysqli_query($cnno,$sql);   //执行数据库语句
		$c = mysqli_fetch_array($b);    //取一行把对象变成数组
		echo "你的密码是:".$c['password'];
		if($username==$c['username']){
			echo '登录成功';
		}
		else{
			echo '账户密码错误';
		}		
	}	
?>
  1. 本代码中存在sql注入漏洞【用户输入的数据被当作SQL代码执行】,其中的sql注入语句为admin" or 1=1 -- qwe或者admin" or "1"="1
  2. 防御方法:检测传参内容,然后进行拦截。
  3. 这条语句与后台数据库的交互
select *from admin where username="admin" and password ="  "or 1=1 -- qwe  " 
//其中--空格 为注释,# 为mysql数据库特有的注释

select *from admin where username="admin" and password ="  "or "1"="1  " 

正则表达式【互通于各种语言】

初识sql注入

  1. 两个关键条件:第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据然后进行执行。
  2. 现在常见的防护软件主流核心就是通过正则来过滤传参
  3. 防御手段:可以使用die函数。

什么是正则表达式

  1. 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regexregexpRE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

  2. 特点

  • 灵活性、逻辑性和功能性非常强;
  • 可以迅速地用极简单的方式达到字符串的复杂控制。
  • 对于刚接触的人来说,比较晦涩难懂。
  1. 用途
  • 判断字符串是否符合某一规则(判断是否符合手机号、邮箱规则)。
  • 从一个字符串中找出符合规则的所有子字符串(取HTML标签名)。

PHP中的正则表达式

PHP中使用正则规则一定要加代表正则的标识/ /

  • preg_match_all(正则表达式、匹配字符串)
    返回匹配到的次数

  • preg_replace (正则表达式、替换成什么、匹配字符串)
    返回替换后的结果

<?php
$a = 12345678999999;
var_dump(preg_match_all('/9/',$a));
echo "<br>";
var_dump(preg_match('/9/',$a));
echo "<br>";
var_dump(preg_replace('/1/','gyy',$a));
?>

=============================
int(6)
int(1)
string(16) "gyy2345678999999"

在这里插入图片描述

常用转义字符

数字:\d
非数字:\D
空白字符(空格、制表符、换页符等):\s
非空白字符:\S
单词字符(26个英文字母不区分大小写】+数字+下划线_):\w
非单词字符:\W

<?php
$a = '12aaaaaaa';
var_dump(preg_match_all('/\d/',$a));  //过滤非数字
echo "<br>";
var_dump(preg_match_all('/\D/',$a));   //过滤数字
?>

============
int(2)
int(7)

自定义字符结合

  1. 字符集合:[单个字符或字符区间],用于匹配集合内字符
  • [a-z]表示a-z26个小写字母
  • [0-9a-z]表示0-9这10个数字和a-z26个小写字母
  • [135a-h]表示包含数字1,3,5和字母a-h这8个字母
    注意:两个不同字符段间请勿使用,隔开。
  1. 非集:[^单个字符或字符区间],用于匹配非集合内字符。
    如:
  • [^0-9]表示匹配所有非数字字符。
  • [^a-zA-Z]表示匹配所以非字母字符。

关键字

() => 和数学一样很像,代表这是一个整体。

^ => 匹配输入字符串的开始位置【中括号中意为取反,其余情况为开头】

$ => 匹配输入字符串的结尾位置

. => 通配符[代表任意字符][不匹配换行]

* => 匹配0次或者多次【即自身的0次也会算进去】

+ => 匹配1次或者多次,只能连续

\ => 转义字符

| => 两项之间的一个选择。

<?php
$a = '12ayy';
echo "<br>";
var_dump(preg_match_all('/y/',$a));    //运行结果int(2),匹配到两次y 
echo "<br>";
var_dump(preg_match_all('/y*/',$a));    //运行结果int(1)
echo "<br>";
var_dump(preg_match_all('/y*/',$b));
echo "<br>";  
var_dump(preg_match_all('/^y/',$a));      //匹配开头,运行结果int(0)

$b = '0-9';
echo "<br>";
var_dump(preg_match_all('/^0-9$/',$b));       //开头和结尾都匹配,运行结果int(1)

$c = '0';
echo "<br>";
var_dump(preg_replace('/^[0-9]$/','gyy',$c));   //区间写反会发生报错,运行结果过是int(1),区间均表示一个字符
?>

$d = 'gyy123nuc';
echo "<br>";
var_dump(preg_replace('/gyy.nuc/','gyy',$d));   //运行结果:string(9) "gyy123nuc"
+的用法
<?php
$a = 'yya';
var_dump(preg_match_all('/y/',$a,$b1));    //int(2)
var_dump($b1);  //array(1) { [0]=> array(2) { [0]=> string(1) "y" [1]=> string(1) "y" } }
"<br>";

var_dump(preg_match_all('/y+a/',$a,$b2));   //int(1)
var_dump($b2);    //array(1) { [0]=> array(1) { [0]=> string(3) "yya" } }
"<br>";

$a1 = 'yyayyyy';
var_dump(preg_match_all('/y+/',$a1,$b3));   //int(6) 
var_dump($b3);        
//array(1) { [0]=> array(6) { [0]=> string(1) "y" [1]=> string(1) "y" [2]=> string(1) "y" [3]=> string(1) "y" [4]=> string(1) "y" [5]=> string(1) "y" } }
?>
*的用法
<?php
$a = 'y';
var_dump(preg_match_all('/y*/',$a,$b1));    //int(2)
var_dump($b1);     //array(1) { [0]=> array(2) { [0]=> string(1) "y" [1]=> string(0) "" } }
"<br>";

$a1 = 'abc';
var_dump(preg_match_all('/y*/',$a1,$b2));     //int(4)
var_dump($b2);        
//array(1) { [0]=> array(4) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" } }
?>

$a2 = 'a1b11b';
var_dump(preg_match_all('/a.*b/',$a2,$b3));       //int(1)
var_dump($b3);      //array(1) { [0]=> array(1) { [0]=> string(6) "a1b11b" } }

注意.*能匹配换行之外的一切,能匹配任意一切。如果想要ab中间的一切,可以使用a.*b来过滤;想要设置密码以zkeq开头,则使用zkeq.*来过滤。.*容易出现一个异常的失控,正常情况下使用.+

限定符+修饰符

限定符:
{n} => 例如: 0{8} 意思是指 只有连起来8个0才会被匹配

{n,} =>例如: 0{2,} 意思是 只要有2个0及其以上的就会被匹配

{n,m} => 例如: 0{2,4} 意思是最少匹配2个0,最多匹配4个0
注:被匹配时,默认匹配最多的次数

修饰符:

 /i    => 不区分大小写
/A    => 匹配规则必须从头开始匹配
/s     => .将匹配一切字符
/x     => 正则表达式中的空白字符会被忽略
<?php
$a = 'A';
var_dump(preg_match_all('/a/i',$a));        //int(1)
"<br>";      
?>

靶场练习

在这里插入图片描述
分析靶场代码,if语句中如果变量regular不为0时才能输出key值也就是flag。分析preg_match函数中的代码,zkeq.*说明get传参传入的id值需要用zkeq开头,trim函数删除字符两端的空白字符和预定义字符。{2,9}说明key后面至少2个字符,最多9个字符。\/.*\/表示//,其中\表示转义,则最后id的参数值为zkaqkeybb://keykey,即可得到flag

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐