PHP - 1

学习一下上古语言, 据说渗透测试用得到。

环境搭建

环境搭建推荐用这个: php study(一件配环境) ,这个东西支持macos,windows,linux,还有php的版本管理,很方便。

写代码的话就vscode吧,简单写点不用复杂的ide。

修改了php代码,网页没有实时效果的话,要在phpstudy环境中关闭”缓存插件“

选择apache 和 nginx 做中间件效果都差不多。

php介绍

PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。 在一个php文件中可以包括以下内容: PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码 PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器 PHP 文件的默认文件扩展名是 “.php” php的使用:

  1. PHP 可以生成动态页面内容
  2. PHP 可以创建、打开、读取、写入、关闭服务器上的文件
  3. PHP 可以收集表单数据
  4. PHP 可以发送和接收 cookies
  5. PHP 可以添加、删除、修改您的数据库中的数据
  6. PHP 可以限制用户访问您的网站上的一些页面
  7. PHP 可以加密数据

php命名规范

  • 类名首字母大写 Person
  • 方法名首字母小写 say ,驼峰命名 sayHello
  • 属性名首字母小写 name
  • 常量名全部大写 PI

变量作用域

PHP 有三种不同的变量作用域: global(全局) local(局部) static(静态)

global

global – 全局变量。

与其他语言不同,PHP 中的全局变量默认在函数内不能使用,需要使用 global 关键字。

1$a = "asdfsadf"
2function my_callback_function() {
3    echo 'hello world!'.$a;//报错
4}

如果想要在函数内部访问一个全局变量,需要使用 global 关键字:

1$a = "asdfsadf"
2
3function myfun() {
4    global $a;
5    echo 'hello world!'.$a;
6}
7myfun();

或者使用$GLOBALS['a']

1$a = "asdfsadf"
2
3function myfun() {
4    echo 'hello world!'.$GLOBALS['a'];
5}
6myfun();

local:

函数内部变量默认作用域就是local,函数执行结束后,该变量的值会消失。

1function myTest() {
2    $x=0;
3    echo $x."<br>";
4    $x++;
5}
6myTest();//0
7myTest();//0
8myTest();//0

static 关键字:

static关键字用于函数内部,即使函数执行结束后,该变量的值也不会消失,而是保持原来的值。

1function myTest() {
2    static $x=0;
3    echo $x."<br>";
4    $x++;
5}
6myTest();//0
7myTest();//1
8myTest();//2

php的语法

1<?php your code here ?>

php的变量

1<?php
2$x=5;
3$y=6;
4$z=$x+$y;
5echo $z;
6?>

php 数据类型

php中的数据类型有以下几种: (变量前面的$符号是必须的)

 1<?php 
 2$a = "字符串类型";
 3$b = 1234;//整形
 4$c = -3.1415;//浮点型
 5$d = 8E-3;
 6$e = true;//boolean类型
 7$f = array("A","B","C");//数组类型
 8
 9$g = NULL;//NULL
10var_dump($a);var_dump($b);var_dump($c);var_dump($d);
11var_dump($e);var_dump($f);var_dump($o);var_dump($g);
12?>

php 的 预定义常量

1__FILE__     文件的完整路径和文件名
2__LINE__     文件中的当前行号
3PHP_VERSION  PHP 的版本号
4PHP_OS       操作系统的名称
 1<?php
 2echo __FILE__;// D:\phpstudy_pro\WWW\k.co\1.php
 3echo "<br/>";
 4echo __LINE__;// 3(当前代码所在行的行号)
 5echo "<br/>";
 6echo PHP_VERSION;// 7.2.10
 7echo "<br/>";
 8echo PHP_OS; //WINNT Linux Darwin
 9echo "<br/>";
10echo DIRECTORY_SEPARATOR;// win\  lin/
11$mydir = 'path' . DIRECTORY_SEPARATOR . 'to' . DIRECTORY_SEPARATOR . 'my' . DIRECTORY_SEPARATOR . 'directory';
12echo $mydir;
13?>

php 的数字

 1$a = 120 //十进制
 2$a = 0b110 //二进制
 3$a = 0120 	//八进制
 4$a = 0x120	//十六进制
 5
 6// 使用echo输出时。默认输出为十进制
 7decbin() // 十进制转二进制
 8decoct() // 十进制转八进制
 9dechex() // 十进制转十六进制
10
11bindec() // 二进制转十进制
12bin2hex() //二进制转十六进制    
13
14octdec() // 八进制转十进制
15hexdec() // 十六进制转十进制

循环

1for($i=0;$i<strlen($str);$i++){
2    echo $i.":";
3    echo $str[$i];
4    echo "<br>";
5}

php的字符串

用单引号或者双引号括起来的内容都是字符串

双引号中可以使用变量。

字符串相加使用.

常用函数:

  • strlen、strpos、explode、substr
  • 长度、位置、分割、截取
 1$str = "Hello World";
 2echo $str;
 3echo $str[0];
 4
 5//str1 + str2
 6echo $str." love ".$str;
 7echo "<br/>";
 8
 9echo "love $str";//变量解析
10echo "<br/>";
11echo 'love $str';//变量不解析
12echo "<br/>";

字符串 常用的函数

strlen():此函数用于返回字符串的长度。例如:

1$str = "Hello World";
2echo strlen($str); // 输出 11

strpos():此函数在字符串中查找第一次出现指定字符或字符串的位置。例如:

1$str = "Hello World";
2echo strpos($str, "World"); // 输出 6

substr():此函数返回字符串的子串。例如:

1$str = "Hello World";
2echo substr($str, 0, 5); // 输出 Hello

str_replace():此函数用于替换字符串中的某些字符。例如:

1$str = "Hello World";
2echo str_replace("World", "PHP", $str); // 输出 Hello PHP

字符串加密函数

好的,下面举例说明一下这几种加密函数的用法:

md5()函数:

1$str = 'Hello World!';
2$encrypted_str = md5($str);
3echo $encrypted_str;
4// 输出结果:b10a8db164e0754105b7a99be72e3fe5

sha1()函数:

1$str = 'Hello World!';
2$encrypted_str = sha1($str);
3echo $encrypted_str;
4// 输出结果:0a4d55a8d778e5022fab701977c5d840bbc486d0

base64_encode()函数:

1$str = 'Hello World!';
2$encoded_str = base64_encode($str);
3echo $encoded_str;
4// 输出结果:SGVsbG8gV29ybGQh

password_hash()和password_verify()函数:

 1$password = 'mypassword';
 2$hashed_password = password_hash($password, PASSWORD_DEFAULT);
 3echo $hashed_password; // 输出生成的哈希值
 4
 5// 验证输入密码是否与哈希值匹配
 6
 7$input_password = 'mypassword';
 8if (password_verify($input_password, $hashed_password)) {
 9    echo 'Password is valid!';
10} else {
11    echo 'Invalid password.';
12}

关于对称加密算法和非对称加密算法,它们的用法相对复杂,需要使用特定的算法和密钥进行加密和解密。

php特有的 @、define

抑制符

@ 符号是一个错误控制运算符,可以用来抑制代码中的错误或警告信息。使用 @ 符号会使 PHP 引擎忽略后面的表达式中的任何错误提示,并且不会将这些错误信息输出到浏览器端。

@ 符号并不能完全屏蔽所有的错误提示,一些致命错误依然会导致 PHP 引擎停止执行。

1<?php
2echo "Hello World";
3@print "Hello World";
4?>

php的常量

php 使用 define() 函数来定义常量。

1<?php
2define("GREETING", "欢迎访问 k.com");
3function myTest() {
4    $GREETING = "Hello world!";//修改失败
5    echo GREETING;
6}
7myTest();
8?>

php引用 include

include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。

  • require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
  • include 只生成警告(E_WARNING),并且脚本会继续

除了include php文件外,还可以include html文件,比如引入 header 、 footer之类的。

语法

两种都可以

1include 'filename';
2include('filename');

php 函数

使用关键字 function 来声明一个函数。

1function sayHi() {
2    echo "Hello world!";
3}
4sayhi();//函数名对大小写不敏感

参数、返回值

1function add($x, $y) {
2    $total = $x + $y;
3    return $total;
4}
5echo "1 + 16 = " . add(1,16);

匿名函数

不写函数名称,而是直接附值到一个变量上

1$greet = function($name)
2{
3    echo "Hello $name<br />";
4};
5$greet('World');
6$greet('PHP');

回调函数

和委托类似,回调函数是指在某个特定事件发生时由另外一个函数来“调用”的函数。

1function my_callback_function() {
2    echo 'hello world!';
3}
4call_user_func('my_callback_function');
5call_user_func('my_callback_function', 'parameter1', 'parameter2', 'parameter3');

php的类

关键字 public / protected / private

  • public 公有的,可以在类的内部或者外部被访问
  • protected 受保护的,只能在类的内部被访问,或者被继承的子类访问
  • private 私有的,只能在类的内部被访问,不能被继承的子类访问 如果没有设置这些关键字,默认为public

常量

  • const 常量,不能被修改
  • 可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。

final

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

person类

  • __construct 构造函数
  • __destruct 析构函数(当对象被销毁时调用)
 1class Person{
 2    public $name;//public 或者 protected 或者 private
 3    public $age;
 4    public $sex;
 5
 6    public function __construct($name,$age,$sex){
 7        $this->name = $name;
 8        $this->age = $age;
 9        $this->sex = $sex;
10    }
11
12    public function __destruct(){
13        echo "destruct";
14    }
15
16    public function say(){
17        echo "my name is ".$this->name.",i am ".$this->age." years old,i am ".$this->sex;
18    }
19}

实例化

1$person = new Person("zhangsan",18,"man");
2$person->say();

php的继承

 1class Student extends Person{
 2    public $school;
 3    public function __construct($name,$age,$sex,$school){
 4        parent::__construct($name,$age,$sex);
 5        $this->school = $school;
 6    }
 7    public function say(){
 8        echo "my name is ".$this->name.",i am ".$this->age." years old,i am ".$this->sex.",i am in ".$this->school;
 9    }
10}

子类调用父类方法

子类可以通过parent::方法名()来调用父类的方法。

 1class Student extends Person{
 2    public $school;
 3    public function __construct($name,$age,$sex,$school){
 4        parent::__construct($name,$age,$sex);
 5        $this->school = $school;
 6    }
 7    public function say(){
 8        parent::say(); //调用父类的方法
 9        echo ",i am in ".$this->school;
10    }
11}

php的接口

类实现接口时,必须实现接口中的所有方法。 下面的例子中,Person类实现了PersonInterface接口,它必须实现getName和setName方法,否则会报错。

 1interface PersonInterface{
 2    const NAME = "zhangsan";
 3    public function getName();
 4    public function setName($name);
 5}
 6
 7class Person implements PersonInterface{
 8    private $name;
 9    public $age;
10    public $sex;
11
12    public function __construct($name,$age,$sex){
13        $this->name = $name;
14        $this->age = $age;
15        $this->sex = $sex;
16    }
17    public function getName(){
18        return $this->name;
19    }
20    public function setName($name){
21        $this->name = $name;
22    }
23}
24
25$person = new Person("zhangsan",18,"man");
26var_dump($person);

类可以实现多个接口

下面的例子中,Person类实现了PersonInterface和animalInterface接口,它必须实现接口中的所有方法。

 1interface PersonInterface{
 2    const NAME = "zhangsan";
 3    public function getName();
 4    public function setName($name);
 5}
 6
 7interface animalInterface{
 8    const NAME = "animal";
 9    public function eat();
10    public function sleep();
11}
12
13class Person implements PersonInterface,animalInterface{
14    private $name;
15    public $age;
16    public $sex;
17
18    public function __construct($name,$age,$sex){
19        $this->name = $name;
20        $this->age = $age;
21        $this->sex = $sex;
22    }
23    public function getName(){
24        return $this->name;
25    }
26    public function setName($name){
27        $this->name = $name;
28    }
29    public function eat(){
30        echo "eat";
31    }
32    public function sleep(){
33        echo "sleep";
34    }
35}

php的抽象类

抽象类不能被new,只能被继承extend。 抽象类中可以有抽象方法,也可以有普通方法。 抽象方法(abstract)只能在抽象类中定义,抽象方法只有方法名和参数。 抽象类中的抽象方法必须被子类实现,否则子类也必须声明为抽象类。

抽象类abstract· 和接口interface 的区别

  • 抽象类可以有属性和方法,接口只能有方法
  • 抽象类可以有构造函数,接口不能有构造函数
  • 抽象类可以被继承,接口只能被实现
  • 类只能继承一个抽象类,可以实现多个接口
 1abstract class Person{
 2    public $name;
 3    public $age;
 4    public $sex;
 5
 6    public function __construct($name,$age,$sex){
 7        $this->name = $name;
 8        $this->age = $age;
 9        $this->sex = $sex;
10    }
11    abstract public function say();
12    abstract public function eat();
13}

php 命名空间

命名空间的概念

命名空间是一种为了解决命名冲突的机制,它允许你在一个脚本中定义多个同名的类、函数或常量,而不会产生冲突。

使用 namespace 关键字

1namespace MyProject;
2const CONNECT_OK = 1;
3echo CONNECT_OK;
4
5namespace AnotherProject; //尝试注释掉这一行 
6const CONNECT_OK = 2;
7echo CONNECT_OK;

引入命名空间

引用整个命名空间

1<?php
2use AnotherProject;
3$obj = new AnotherProject\Connection();

引入一个元素(类、函数、常量)

1use AnotherProject\Connection as AnotherConnection;
2$obj = new AnotherConnection();

引入多个元素

1use AnotherProject\{
2Connection as AnotherConnection,
3Connection2 as AnotherConnection2
4}
5$obj = new AnotherConnection();
6$obj2 = new AnotherConnection2();

php命名空间实例

t.php

 1namespace carcarplace ;
 2const MYCAR = "BMW";
 3class Car {
 4    public $name;
 5    public $color;
 6    public $brand;
 7    
 8    public function __construct($name,$color,$brand) {
 9    $this->name = $name;
10    $this->color = $color;
11    $this->brand = $brand;
12    }
13    public function getCar() {
14    echo "My car is a " . $this->color . " " . $this->brand . " " . $this->name . ".";
15    }
16}

在 1.php 引用他

1include 't.php';
2use carcarplace\Car;
3$myCar = new Car("M3","Black","BMW");
4$myCar->getCar();

php正则表达式

//preg_match_all() 函数返回所有匹配的数组 //preg_match() 函数返回第一个匹配的数组 //preg_replace() 函数返回替换后的字符串 //preg_split() 函数返回分割后的数组 //preg_grep() 函数返回匹配的数组 //preg_quote() 函数返回转义后的字符串 //preg_last_error() 函数返回最后一个错误代码 //preg_filter() 函数返回过滤后的数组

//preg_match_all() 函数返回所有匹配的数组 //preg_match() 函数返回第一个匹配的数组 //preg_replace() 函数返回替换后的字符串 //preg_split() 函数返回分割后的数组 //preg_grep() 函数返回匹配的数组 //preg_quote() 函数返回转义后的字符串 //preg_last_error() 函数返回最后一个错误代码 //preg_filter() 函数返回过滤后的数组

preg_match_all() 函数

在双斜杠之间的内容是正则表达式模式,

  • i 修饰符用于执行不区分大小写的搜索。
  • g 用于执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
  • 括号是分组标记,用于在匹配中捕获子模式。
1<?php
2$str = "Apples and bananas.";
3$pattern = "/ba(na){2}/i";
4preg_match_all($pattern, $str, $matches);
5print_r($matches);
6?>

php文件操作

读取文件

php 打开并读取文件

1$fp = fopen("test.txt", "r");
2echo fread($fp, filesize("test.txt"));
3fclose($fp);

单行读取文件 - fgets()

可以接受两个参数,文件指针,最大长度,如果不指定最大长度,将读取整行。

下面例子中

  • 使用 fgets() 函数来读取文件中的单行
  • 使用 feof() 函数来检查是否已到达文件末尾
  • 每一行都采用 md5() 函数进行加密,然后输出到浏览器中。
1$fp = fopen("test.txt", "r");
2while(!feof($fp))
3{
4    // echo fgets($fp). "<br />";
5    echo md5(fgets($fp)). "<br />";
6}
7fclose($fp);

写入文件

php 打开并写入文件

1$fp = fopen("test.txt", "w");
2fwrite($fp, "Hello World. Testing!\r\n");
3fwrite($fp, "Hello World. Testing!");
4fclose($fp);
5echo "写入成功";

复制、删除、重命名文件

复制文件 - copy()

1copy("test.txt", "test2.txt");
2echo "复制成功";
1unlink("test2.txt");
2echo "删除成功";

重命名文件 - rename()

1rename("test.txt", "test3.txt");
2echo "重命名成功";

其他常用文件操作函数

is_readable、is_writable、is_executable

filectime、filemtime、fileatime (create、modify、access)

 1$file = 'test.txt';
 2file_exists($file) or die('文件不存在,程序退出!');
 3
 4echo $file.' 文件大小是:'.filesize($file).' 个字节<br>';
 5if(is_readable($file)){
 6    echo $file.' 文件是可读的。<br>';
 7}else{
 8    echo $file.' 文件是不可读的。<br>';
 9}
10if(is_writable($file)){
11    echo $file.' 文件是可写的。<br>';
12}else{
13    echo $file.' 文件是不可写的。<br>';
14}
15if(is_executable($file)){
16    echo $file.' 文件是可执行的。<br>';
17}else{
18    echo $file.' 文件是不可执行的。<br>';
19}
20echo '文件的创建时间是:'.date('Y-m-d H:i:s',filectime($file)).'。<br>';
21echo '文件的修改时间是:'.date('Y-m-d H:i:s',filemtime($file)).'。<br>';
22echo '文件上次的访问时间是:'.date('Y-m-d H:i:s',fileatime($file)).'。<br>';

PHP超级全局变量 - 以及表单

print_r 函数是 PHP 中一个功能强大的函数,可用于打印变量的易读信息。它对于调试代码、理解复杂的数据结构以及查找代码中的错误非常有用。

如果要显示带有换行的内容,需要在输出的 HTML 代码中添加 <pre> 标签

 1<pre>
 2<?php
 3
 4// 定义一个对象
 5class Person {
 6    public $name;
 7    public $age;
 8    public $email;
 9  
10    function __construct($name, $age, $email) {
11      $this->name = $name;
12      $this->age = $age;
13      $this->email = $email;
14    }
15  }
16  
17  // 创建一个 Person 对象并打印信息
18  $person = new Person('John', 30, 'john@example.com');
19  print_r($person);
20
21  ?>
22<pre/>
  • PHP超级全局变量主要有:

* $GLOBALS

该变量用于引用脚本中的全局变量,在函数或方法中使用时非常有用。

1<pre>
2<?php
3$var = "Hello World";
4print_r($GLOBALS);
5?>
6<pre/>

* $_SERVER

该变量包含与当前运行 PHP 的服务器相关的信息,例如 URL、文件路径、HTTP 头等。

 1Array
 2(
 3    [USER] => kasusa
 4    [COMMAND_MODE] => unix2003
 5    [__CFBundleIdentifier] => com.yourcompany.phpstudy-pro
 6    [PATH] => /usr/bin:/bin:/usr/sbin:/sbin
 7    [LOGNAME] => kasusa
 8    [SSH_AUTH_SOCK] => /private/tmp/com.apple.launchd.hCvBqjuPFw/Listeners
 9    [HOME] => /Users/kasusa
10    [SHELL] => /bin/zsh
11    [TMPDIR] => /var/folders/yr/zk0mghjs43l7b8qz_4mbdy480000gn/T/
12    [__CF_USER_TEXT_ENCODING] => 0x1F5:0x19:0x34
13    [XPC_SERVICE_NAME] => 0
14    [XPC_FLAGS] => 0x0
15    [HTTP_CONNECTION] => keep-alive
16    [HTTP_ACCEPT_ENCODING] => gzip, deflate
17    [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh-Hans;q=0.9
18    [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15
19    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
20    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
21    [HTTP_HOST] => localhost
22    [REDIRECT_STATUS] => 200
23    [SERVER_NAME] => localhost
24    [SERVER_PORT] => 80
25    [SERVER_ADDR] => 127.0.0.1
26    [REMOTE_PORT] => 49565
27    [REMOTE_ADDR] => 127.0.0.1
28    [SERVER_SOFTWARE] => nginx/1.16.1
29    [GATEWAY_INTERFACE] => CGI/1.1
30    [REQUEST_SCHEME] => http
31    [SERVER_PROTOCOL] => HTTP/1.1
32    [DOCUMENT_ROOT] => /Applications/phpstudy/WWW
33    [DOCUMENT_URI] => /1.php
34    [REQUEST_URI] => /1.php
35    [SCRIPT_NAME] => /1.php
36    [CONTENT_LENGTH] => 
37    [CONTENT_TYPE] => 
38    [REQUEST_METHOD] => GET
39    [QUERY_STRING] => 
40    [PATH_TRANSLATED] => /Applications/phpstudy/WWW
41    [PATH_INFO] => 
42    [SCRIPT_FILENAME] => /Applications/phpstudy/WWW/1.php
43    [FCGI_ROLE] => RESPONDER
44    [PHP_SELF] => /1.php
45    [REQUEST_TIME_FLOAT] => 1679464788.7792
46    [REQUEST_TIME] => 1679464788
47)

* $_REQUEST$_POST$_GET

该变量包含了从 GET、POST 和 COOKIE 中收集到的用户提交的数据。它可以轻松地访问所有 HTTP 请求变量。

 1<form action="1.php" method="post">
 2    <p>post</p>
 3    <input type="text" name="name" value="John">
 4    <input type="text" name="age" value="30">
 5    <input type="submit" value="Submit">
 6</form>
 7<form action="1.php" method="get">
 8    <p>get</p>
 9    <input type="text" name="name" value="John">
10    <input type="text" name="age" value="30">
11    <input type="submit" value="Submit">
12</form>
13<pre>
14    <?php
15    echo "_REQUEST:";
16    print_r($_REQUEST);
17    echo "_POST:";
18    print_r($_POST);
19    echo "_GET:";
20    print_r($_GET);
21
22    if (isset($_POST['name']) && isset($_POST['age'])) {
23        echo 'Hello ' . $_POST['name'] . ' you are ' . $_POST['age'] . ' years old.';
24    }
25    ?>
26</pre>

Post 和 Get 是 HTTP 协议中的两种常见请求方法,用于向服务器发送请求并获取响应。

Get 请求通常用于从服务器获取资源,如 Web 页面、图片、视频等。它通过 >URL 参数将数据传递给服务器,因此在浏览器地址栏中可以看到请求的参数。

Post 请求则通常用于将数据发送给服务器,比如提交表单数据、上传文件等。 Post 请求将数据包含在请求体中,并且不会在 URL 中暴露数据,因此更安全。

总体来说,Get 和 Post 的主要区别在于数据传输方式和用途。Get 请求适合请求少量数据,Post 请求适合传输大量数据和敏感数据。

* $_FILES

该变量用于上传文件类型的表单数据。

 1<form action="1.php" method="post" enctype="multipart/form-data">
 2    <p>file</p>
 3    <input type="file" name="file">
 4    <input type="submit" value="Submit">
 5</form>
 6
 7<pre>
 8    <?php
 9    echo "文件名:".$_FILES['file']['name'];
10    print_r($_FILES);
11    ?>
12</pre>

返回值示例:

 1(
 2    [file] => Array
 3        (
 4            [name] => 52.jpg
 5            [type] => image/jpeg
 6            [tmp_name] => /private/var/folders/yr/zk0mghjs43l7b8qz_4mbdy480000gn/T/phpzC0q0A
 7            [error] => 0
 8            [size] => 1032252
 9        )
10)
  • $_FILES[’name’]:上传文件的原始名称。
  • $_FILES[’type’]:上传文件的 MIME 类型。
  • $_FILES[‘size’]:上传文件的大小(以字节为单位)。
  • $_FILES[’tmp_name’]:上传文件的临时存储路径,通常在服务器的临时目录中。
  • $_FILES[’error’]:上传文件时可能发生的错误代码,例如文件过大或文件类型不支持等。如果没有发生错误,则该变量值为 0。

* $_ENV

$_ENV 变量是在服务器端设置的,通常由操作系统或 Web 服务器配置文件中的设置传递给 PHP 的。

在 Linux 系统中,你可以使用 export 命令来设置环境变量。例如,要将名为 API_KEY 的环境变量设置为一个 API 密钥值,可以执行以下命令:

1export API_KEY=your_api_key_value

在 Windows 系统中,可以通过控制面板的"系统"->“高级系统设置”->“环境变量"来设置环境变量。

在 PHP 脚本中,你可以使用 $_ENV 数组来访问这些设置的变量。例如,要获取上面设置的 API 密钥,你可以使用以下代码:

1Copy Code
2$apiKey = $_ENV['API_KEY'];

需要注意的是,不同的 Web 服务器和操作系统可能有不同的方法来设置环境变量。

该变量可用于读取用户在浏览器中存储的 cookie 数据。

1if (isset($_COOKIE['username'])) {
2    // do something with the cookie value
3    print_r($_COOKIE);
4}

* $_SESSION

该变量可用于存储并访问会话数据,直到用户关闭浏览器为止。

php 目录操作

创建目录mkdir()

1mkdir("test");
2echo "创建成功";

删除目录rmdir()

1rmdir("test");
2echo "删除成功";

遍历目录

opendir 打开目录 is_dir() 判断是否是目录 readdir() 读取目录 closedir() 关闭目录

 1$dir = opendir("/");
 2while($file = readdir($dir))
 3{
 4    $fullpath = "/".$file;
 5    //输出是目录还是文件
 6    if(is_dir($fullpath))
 7        echo "📁dir: ";
 8    else
 9        echo "file: ";
10    //输出文件名
11    echo $file. "<br />";
12}
13closedir($dir);

demo php文件浏览器:

我让chatgpt帮我写的

 1// 设置要浏览的目录路径
 2$dir_path = "/";
 3
 4// 如果有文件夹名称参数,更新要浏览的目录路径
 5if (isset($_GET['folder'])) {
 6    $folder_path = $_GET['folder'];
 7    // 将相对路径转换成绝对路径
 8    $dir_path .= "/". ($folder_path == '.' ? '' : $folder_path);
 9}
10
11// 遍历目录并获取文件名和大小
12$files = array();
13if ($handle = opendir($dir_path)) {
14    while (false !== ($entry = readdir($handle))) {
15        if ($entry != "." && $entry != "..") {
16            $fullpath = $dir_path . "/" . $entry;
17            if (is_dir($fullpath)) {
18                $files[] = array(
19                    'name' => $entry,
20                    'type' => 'dir'
21                );
22            } else {
23                $files[] = array(
24                    'name' => $entry,
25                    'type' => pathinfo($fullpath, PATHINFO_EXTENSION)
26                );
27            }
28        }
29    }
30    closedir($handle);
31}
32
33// 输出文件列表
34echo "<ul>";
35echo "<p>pwd:$folder_path</p>";
36if ($folder_path != '') {
37    // 添加返回上一级目录链接(除了根目录)
38    echo "<li><a href=\"?folder=".dirname($folder_path)."\">..</a></li>";
39}
40foreach ($files as $file) {
41    if ($file['type'] == 'dir') {
42        echo "<li><a href=\"?folder=" . $folder_path . "/" . $file['name'] . "\">" . $file['name'] . "</a></li>";
43    } else {
44        echo "<li>" . $file['name'] ."</li>";
45    }
46}
47echo "</ul>";

php链接mysql数据库

mysqli 和 mysql

  • 从 PHP 5.5.0 版本开始,mysql 扩展已经废弃,从 PHP 7.0.0 版本开始,mysql 扩展已被移除
  • mysqli 则是 MySQLi(MySQL improved)的缩写,是官方推荐的用于连接 MySQL 数据库的扩展

面向过程方式

面向过程方式下,连接 MySQL 数据库通常使用 mysqli_connect() 函数,该函数的参数分别为数据库服务器的地址、用户名、密码和数据库名,返回一个 MySQL 连接标识符,如果连接失败则返回 FALSE。

 1<?php
 2$host = "localhost";
 3$user = "root";
 4$password = "root";
 5$database = "mysql";
 6$conn = mysqli_connect($host, $user, $password, $database);
 7
 8// 检查连接是否成功
 9if (!$conn) {
10    die("Connection failed: " . mysqli_connect_error());
11}
12
13// 执行查询语句
14$sql = "SELECT User FROM user";
15echo $sql . "<br>";
16$result = mysqli_query($conn, $sql);
17
18// 处理查询结果
19while ($row = mysqli_fetch_assoc($result)) {
20    echo "User: " . $row["User"] . "<br>";
21}
22
23// 关闭数据库连接
24mysqli_close($conn);

使用 fetch_assoc 方法从 $result 结果集中获取一行数据,并将其赋值给 $row 变量,如果没有数据了,则返回 FALSE。(一行一行的获取,直到没有数据为止)

如果使用 fetch_row 方法,则返回的是一个索引数组,如果使用 fetch_array 方法,则返回的是一个关联数组和索引数组的结合

面向对象方式

面向对象方式下,连接 MySQL 数据库通常使用 mysqli 或者 PDO 类。这些类封装了数据库连接和操作,更加易于维护和扩展

基本上就是,全都是调用属性和方法。

连接数据库,查询

 1<?php
 2// 使用 mysqli_connect() 函数连接 MySQL 数据库
 3$host = "localhost";
 4$user = "root";
 5$password = "root";
 6$database = "mysql";
 7$conn = new mysqli($host, $user, $password, $database);
 8
 9// 检查连接是否成功
10if ($conn->connect_error) {
11    die("Connection failed: " . $conn->connect_error);
12}
13
14// 执行查询语句
15$sql = "SELECT * FROM user";
16$result = $conn->query($sql);
17
18// 处理查询结果
19while ($row = $result->fetch_assoc()) {
20    echo "User: " . $row["User"] . "<br>";
21}
22
23// 关闭数据库连接
24$conn->close();

建表

 1$conn = new mysqli($host, $user, $password)
 2$conn->select_db($database);
 3// 执行查询语句
 4$sql = "CREATE TABLE MyGuests (
 5    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 6    firstname VARCHAR(30) NOT NULL,
 7    lastname VARCHAR(30) NOT NULL,
 8    email VARCHAR(50),
 9    reg_date TIMESTAMP
10    )";
11
12$conn->query($sql);

与表单form联动

 1<form action="1.php" method="get">
 2    firstname
 3    <input type="text" name="name" placeholder="firstname">
 4    <input type="submit" value="search">
 5</form>
 6
 7<?php
 8// 使用 mysqli_connect() 函数连接 MySQL 数据库
 9$host = "localhost";
10$user = "root";
11$password = "root";
12$database = "test";
13$conn = new mysqli($host, $user, $password, $database);
14
15// 检查连接是否成功
16if ($conn->connect_error) {
17    die("Connection failed: " . $conn->connect_error);
18}
19//if isset post
20if (isset($_GET['name'])) {
21    // 执行查询语句
22    $conn->select_db("test");
23    $sql = "select * from MyGuests where firstname = '" . $_GET['name']."'";
24    echo "sql:".$sql."<br>";
25    $result=$conn->query($sql);
26
27    // // 处理查询结果
28    while ($row = $result->fetch_assoc()) {
29        //id firstname lastname email
30        echo "id: " . $row["id"] . "; Name: " . $row["firstname"] . " " . $row["lastname"] . "<br>";
31    }
32}
33
34// 关闭数据库连接
35$conn->close();

PHP - 2
国内测速网站推荐