IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP基础学习记录以及使用PHP搭建 “最最简单” 的留言板 -> 正文阅读

[PHP知识库]PHP基础学习记录以及使用PHP搭建 “最最简单” 的留言板

学习php前,应当对html和css有简单的基础了解,可以参考: HTML和CSS简单学习整理。安装环境的话windows可以参考: PHP——学前知识储备与环境选择。不过这里笔者是以linux为学习环境,linux的环境搭建参考: 从入坑到不放弃-----centos7系统软件安装方法及网站环境搭建
本博文的重点在于语法学习和PHP表单,文件的处理

PHP基础语法(理解)

语法部分参考于菜鸟教程:https://www.runoob.com/php/php-syntax.html

PHP 脚本可以放在文档中的任何位置。
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
通过 PHP,有两种在浏览器输出文本的基础指令:echo 和 print。

PHP变量

<?php
$x=1;
$y=2;
$z=$x+$y;
echo $z;
?>//运行结果为3

PHP 变量规则:
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)

PHP global 关键字

global 关键字用于函数内访问全局变量

<?php
$x=1;
$y=2;
function myTest()
{
    global $x,$y;
    $y=$x+$y;
}
myTest();
echo $y; // 输出 3
?>
//或者写成下面这样也可
/*<?php
$x=1;
$y=2;
function myTest()
{
    $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
} 
myTest();
echo $y;//输出 3
?>*/

Static 作用域

当一个函数完成时,它的所有变量通常都会被删除。如果希望某个局部变量不要被删除,请在第一次声明变量时使用 static 关键字

<?php
function myTest()
{
    static $x=0;
    echo $x;
    $x++;
    echo PHP_EOL;    // 换行符
}
 
myTest();
myTest();
myTest();
?>//输出结果为 0, 1, 2
//该变量仍然是函数的局部变量。

echo 语句

<?php
$test1="冰冰雪聪明";
$test2="胖头鱼";
$bingbing=array("孩怕","咕咕","哒咩");
echo $test1;
echo "<br>";
echo "冰冰说 $test2 好吃";
echo "<br>";
echo "我有一点 {$bingbing[0]}";
?>
/*上述代码运行结果
冰冰雪聪明
冰冰说 胖头鱼 好吃
我有一点 孩怕
*/

PHP 定界符 EOF
PHP EOF是一种在命令行 shell 和程序语言里定义一个字符串的方法。
EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。

<?php
$name="bingbing";
$a= <<<EOF
        "wang"$name
        "123456789"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>
/*
运行结果
 "wang"bingbing
        "123456789"

*/

整型

<?php 
$x = 6666;
var_dump($x);
echo "<br>"; 
$x = -1; // 负数
var_dump($x);
echo "<br>"; 
$x = 0x2C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 035; // 八进制数
var_dump($x);
?>  
 
/*
PHP var_dump() 函数
var_dump() 函数用于输出变量的相关信息。
上面代码的运行结果

int(6666)

int(-1)

int(44)

int(29)
   

*/

浮点型

<?php 
$x = 3.1415926;
var_dump($x);
echo "<br>"; 
$x = 1.1e2;
var_dump($x);
echo "<br>"; 
$x = 2E-5;
var_dump($x);
?>

/*
上面的代码运行结果
float(3.1415926)

float(110)

float(2.0E-5)

*/

NULL 值
NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。

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

/*
运行结果为:NULL
*/

类型比较

松散比较:使用两个等号 == 比较,只比较值,不比较类型。
严格比较:用三个等号 === 比较,除了比较值,也比较类型。

常量

<?php
define("BINGBING", "不愧是我王冰冰");
function myTest() 
{
    echo BINGBING;
} 
myTest();    // 输出 "不愧是我王冰冰"
?>
/*
上述的运行结果:不愧是我王冰冰
*/

字符串变量

<?php
$txt="Hello world!";
echo $txt;
?>
/*
输出为 Hello world!
*/
<?php
echo strlen("Hello world!");
?>
/*
strlen() 函数返回字符串的长度(字节数)
上面的代码将输出:12
*/
<?php
echo strpos("Hello world!","world");
?>
/*
上面的代码将输出:6
strpos() 函数用于在字符串内查找一个字符或一段指定的文本
*/

数组

<?php
$bingbing=array("i","love","bingbing");
echo $bingbing[0] . "  " . $bingbing[1] . "   " . $bingbing[2] . ".";
?>
/*
运行结果
i  love   bingbing.
*/
<?php
$bingbing=array("i ","love","bingbing");
echo count($bingbing);
?>
/*
获取数组的长度 - count() 函数
上面的代码运行结果为: 3
*/

关联数组

<?php
$age=array("bingbing"=>"18","Ben"=>"37","Joe"=>"43");
echo "bingbing is " . $age['bingbing'] . " years old.";
?>

/*
运行结果 :bingbing is 18 years old.
关联数组是使用分配给数组的指定的键的数组
*/

遍历关联数组

<?php
$age=array("bingbing"=>"18","xiaolang"=>"100","makabaka"=>"20");

foreach($age as $x=>$x_value)
{
    echo "name=" . $x . ", old=" . $x_value;
    echo "<br>";
}
?>
/*
运行结果:
name=bingbing, old=18
name=xiaolang, old=100
name=makabaka, old=20

遍历并打印关联数组中的所有值,使用 foreach 循环
*/

数组排序
参考链接:https://www.runoob.com/php/php-ref-array.html

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

<?php
$bingbing=array("c","b","a"); 
sort($bingbing); 
print_r($bingbing);
?>
/*
运行结果
Array
(
    [0] => a
    [1] => b
    [2] => c
)
对数组进行升序排列
*/
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); 
asort($age); 
print_r($age); 
?>
/*
上述代码运行结果: Array ( [Peter] => 35 [Ben] => 37 [Joe] => 43 )
*/
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
arsort($age);
?>
/*
运行结果:Array ( [Joe] => 43 [Ben] => 37 [Peter] => 35 )
arsort() - 根据数组的值,对数组进行降序排列
*/

超级全局变量
$GLOBALS

<?php 
$x = 1; 
$y = 2;
function addition() 
{ 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
addition(); 
echo $z; 
?>
/*
运行结果: 3
*/

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

<!DOCTYPE html>
<html>
<body>

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

<?php 
$name = htmlspecialchars($_REQUEST['fname']); 
echo $name; 
?>

</body>
</html>

在这里插入图片描述
更多参考:https://www.runoob.com/php/php-superglobals.html

PHP实现冒泡排序

<?php
$arr = array(3,1,4,1,5,9,2,6);
for($i = count($arr)-1;$i>=0;$i--)
{
    for($j = 0 ; $j < $i ; $j++)
	{
        if($arr[$j+1] > $arr[$j] )
		{
            $aa = $arr[$j+1];
            $arr[$j+1] = $arr[$j];
            $arr[$j] = $aa;
        }
    }
}
print_r($arr);
?>

运行结果:
在这里插入图片描述
函数
在 PHP 中,提供了超过 1000 个内建的函数,参考连接:https://www.runoob.com/php/php-ref-array.html

<?php
function writeName($fname,$punctuation)
{
    echo $fname . " 皮卡皮卡" . $punctuation . "<br>";
} 
 
echo "她的名字是 :";
writeName("冰冰",".");
echo "她的另一个名字 : ";
writeName("胖头鱼","!");
echo "她还有一个名字是 :";
writeName("吃花椒的喵酱","!!!");
?>

在这里插入图片描述
返回值

<?php
function add($x,$y)
{
    $total=$x+$y;
    return $total;
}
echo "1 + 2 = " . add(1,2);
?>
/*
运行结果:1 + 2 = 3
*/

命名空间
参考链接:https://www.php.net/manual/zh/language.namespaces.rationale.php
命名空间一个最明确的目的就是解决重名问题,命名空间将代码划分出不同的空间,每个空间的常量、函数、类的名字互不影响, 类似于‘封装’的概念。

<?php
namespace MyProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}

namespace AnotherProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
?>
<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
/*
将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来
*/

子命名空间

<?php
namespace MyProject\Sub\Level;  //声明分层次的单个命名空间

const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */  }

?>
/*
命名空间的名字可以使用分层次的方式定义
*/

命名空间使用

/*file1.php 文件代码*/
<?php
namespace Foo\Bar\subnamespace; 

const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>
/*file2.php 文件代码*/
<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}

/* 非限定名称 */
foo(); // 解析为函数 Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo ,方法为 staticmethod
echo FOO; // 解析为常量 Foo\Bar\FOO

/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
                                  // 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO
                                  
/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>

命名空间和动态语言特征
PHP 命名空间的实现受到其语言自身的动态特征的影响,所以要动态访问命名部分的元素。
example1.php 文件代码:

<?php
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "global";

$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>

动态访问命名空间的元素

<?php
namespace namespacename;
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "namespaced";

include 'example1.php';

$a = 'classname';
$obj = new $a; // 输出 classname::__construct
$b = 'funcname';
$b(); // 输出函数名
echo constant('constname'), "\n"; // 输出 global

/* 如果使用双引号,使用方法为 "\\namespacename\\classname"*/
$a = '\namespacename\classname';
$obj = new $a; // 输出 namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // 输出 namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // 输出 namespacename\funcname
$b = '\namespacename\funcname';
$b(); // 输出 namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // 输出 namespaced
echo constant('namespacename\constname'), "\n"; // 输出 namespaced
?>

别名/导入
PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名,在PHP中,别名是通过操作符 use 来实现的。

//使用use操作符导入/使用别名
<?php
namespace foo;
use My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use \ArrayObject;

$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
?>
// 一行中包含多个use语句
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>
//导入和动态名称
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a;      // 实际化一个 Another 对象
?>
//导入和完全限定名称
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 类
$obj = new \Another; // 实例化 Another 类
$obj = new Another\thing; // 实例化 My\Full\Classname\thing 类
$obj = new \Another\thing; // 实例化 Another\thing 类
?>

后备全局函数/常量

//在命名空间中访问全局类
<?php
namespace A\B\C;
class Exception extends \Exception {}

$a = new Exception('hi'); // $a 是类 A\B\C\Exception 的一个对象
$b = new \Exception('hi'); // $b 是类 Exception 的一个对象

$c = new ArrayObject; // 致命错误, 找不到 A\B\C\ArrayObject 类
?>
//命名空间中后备的全局函数/常量
<?php
namespace A\B\C;

const E_ERROR = 45;
function strlen($str)
{
    return \strlen($str) - 1;
}

echo E_ERROR, "\n"; // 输出 "45"
echo INI_ALL, "\n"; // 输出 "7" - 使用全局常量 INI_ALL

echo strlen('hi'), "\n"; // 输出 "1"
if (is_array('hi')) { // 输出 "is not array"
    echo "is array\n";
} else {
    echo "is not array\n";
}
?>

全局空间

//如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。
//在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
<?php
namespace A\B\C;

/* 这个函数是 A\B\C\fopen */
function fopen() { 
     /* ... */
     $f = \fopen(...); // 调用全局的fopen函数
     return $f;
} 
?>

面向对象

<?php
class Site {
  /* 成员变量 */
  var $url;//类的变量使用 var 来声明, 变量也可以初始化值
  var $title;
  
  /* 成员函数 */
  function setUrl($par){
     $this->url = $par;
  }
  
  function getUrl(){
     echo $this->url . PHP_EOL;
  }
  
  function setTitle($par){
     $this->title = $par;
  }
  
  function getTitle(){
     echo $this->title . PHP_EOL;
  }
}

$bingbing = new Site;//用 new 运算符来实例化该类的对象
$gugu = new Site;
$xiaolang = new Site;

// 调用成员函数,设置标题和URL
$bingbing->setTitle( "冰冰" );
$gugu->setTitle( "咕咕" );
$xiaolang->setTitle( "小狼" );

$bingbing->setUrl( 'www.bingbing.com' );
$gugu->setUrl( 'www.gugu.com' );
$xiaolang->setUrl( 'www.xiaolang.com' );

// 调用成员函数,获取标题和URL
$bingbing->getTitle();
$gugu->getTitle();
$xiaolang->getTitle();

$bingbing->getUrl();
$gugu->getUrl();
$xiaolang->getUrl();
?>

运行结果
在这里插入图片描述
构造函数

<?php
class Site {
  /* 成员变量 */
  var $url;
  var $title;

  function __construct( $par1, $par2 ) {
    $this->url = $par1;
    $this->title = $par2;
  }
  /* 成员函数 */
  function setUrl($par){
     $this->url = $par;
  }
  
  function getUrl(){
     echo $this->url . PHP_EOL;
  }
  
  function setTitle($par){
     $this->title = $par;
  }
  
  function getTitle(){
     echo $this->title . PHP_EOL;
  }
}

$bingbing= new Site('www.bingbing.com', '冰冰');
$gugu = new Site('www.gugu.com', '咕咕');
$xiaolang = new Site('www.xiaolang.com', '小狼');

// 调用成员函数,获取标题和URL
$bingbing->getTitle();
$gugu->getTitle();
$xiaolang->getTitle();

$bingbing->getUrl();
$gugu->getUrl();
$xiaolang->getUrl();
?>

在这里插入图片描述
继承
PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承

<?php 
// 子类扩展站点类别
class Child_Site extends Site {
   var $category;

    function setCate($par){
        $this->category = $par;
    }
  
    function getCate(){
        echo $this->category . PHP_EOL;
    }
}//Child_Site 类继承了 Site 类

抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

//子类定义了一个可选参数,而父类抽象方法的声明里没有,则也是可以正常运行的。
<?php
abstract class AbstractClass
{
    // 我们的抽象方法仅需要定义需要的参数
    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{

    // 我们的子类可以定义父类签名中不存在的可选参数
    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
/*输出结果为:

Mr. Pacman
Mrs. Pacwoman
 */

Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问,静态属性不可以由对象通过 -> 操作符来访问。

<?php
class Foo {
  public static $my_static = 'foo';
  
  public function staticValue() {
     return self::$my_static;
  }
}

print Foo::$my_static . PHP_EOL;
$foo = new Foo();

print $foo->staticValue() . PHP_EOL;
?>    
/*
运行结果
foo
foo
   
*/

PHP表单和文件(重点)

FORM表单
HTML表单(Form)是网站的一个重要组成部分,主要用于采集和提交用户输入的信息,表单采集数据后将数据发送至服务器,如用户填写完信息后执行提交操作,将表单中的数据从客户端的浏览器传送到服务器端,数据在服务器端经过PHP程序进行处理后,再将用户所需要的信息传递回客户端的浏览器上,从而完成一次页面交互。

我们在linux中创建一个留言板

<html>
<head>
<title>post form</title>
</head>
<body>
<form action="post.php" method="POST">
<p>username : </p>
<input type="text" name="user"></input>
<p>password : </p>
<input type="password" name="pass"></input>
<br>
<input type="submit" value="submit">
</form>
<body>
</html>

在这里插入图片描述
我们再写一个PHP去处理我们存进去的数据,这里我们使用的是post提交数据,没有选择使用get来储存数据,因为使用get的话,我们的数据输入进去后,他会出现在我们的上方的地址栏之中,没有达到保护隐私的目的,所以我们使用post提交数据,使用get请求数据。

<?php
        $username = $_POST['user'];
        $password = $_POST['pass'];
        echo $username;
        echo $password;
?>

当我们输入数据后,就会发现在.php文件里存储了我们的数据
在这里插入图片描述

使用POST方法时,HTTP会将表单的输入信息进行包装后发送,不依赖于URL。
所有提交的信息都在后台传输,用户在浏览器端是看不到这一过程的,安全性高。
POST方法不会将传递的参数值显示在地址栏中,并且对用户数据的长度没有限制。
POST方法比较适合用于发送一些保密的或者较大量的数据到服务器。

对于我们上面的这个十分简单的表单,其实有一个很大的问题,就是我们用户如果输入空的信息改怎么办,就是当密码或用户名为空时,我们如何执行操作。
我们写一个判断用户名或密码是否为空的代码 (标准的写法比这复杂的多,这里我想了一个很简单的写法,有点不标准,但是很容易理解):

<?php
        if(empty($_POST['user']))
        {
        echo "<script>alert('请输入用户名!');windows.history.back(-1);</script>";
        }
        else
        {
        $username = $_POST['user'];
        echo $username;
        }
        if(empty($_POST['pass']))
        {
        echo "<script>alert('请输入密码!');windows.history.back(-1);</script>";
        }
        else
        {
        $password = $_POST['pass'];
        echo $password;
        }
?>

当我们再次输入时,如果输入的数据为空:
在这里插入图片描述
GET方法和POST方法的对比

GET

  1. get方式在url后面拼接参数
    2.只能以文本的形式传递数据
    3.传递的数据量小,4KB左右
    4.安全性低,会将数据显示在地址栏
    5.速度快,通常用于对安全性要求不高的请求

POST
1.安全性较高
2.传递数据量大,请求对数据长度没有要求
3.请求不会被缓存,也不会保留在浏览器历史记录中


文件
1.PHP可对服务器端的文件或文件夹进行操作。
2.对文件的操作包括创建文本文件、写入文本文件、读取文本文件等。
3.对文件夹的操作包括创建、复制、移动或删除文件夹等。

更多的函数希望大家自己用到的时候查阅,这里写了最基础常用的,参考链接:https://www.runoob.com/php/php-ref-filesystem.html

打开文件:
fopen( ) 打开文件。
文件读取︰
fread( ) 读取指定长度的字符串。
fgets( ) 读取文件一行内容。
feof( ) 检测是否已到达文件末尾。
文件写入∶
fwrite( ) 函数来写入数据。
关闭文件:
fclose( ) 关闭文件。

fopen()
用于在 PHP 中打开文件

<html>
<body>

<?php
$file=fopen("welcome.txt","r");
?>

</body>
</html>//函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件

在这里插入图片描述
fclose()

<?php
$file = fopen("test.txt","r");

//执行一些代码

fclose($file);
?>

feof()

if (feof($file)) echo "文件结尾";//feof() 函数检测是否已到达文件末尾(EOF)。

fgets()

<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
{
    echo fgets($file). "<br>";
}
fclose($file);
?>//fgets() 函数用于从文件中逐行读取文件。注释:在调用该函数之后,文件指针会移动到下一行

fgetc()

<?php
$file=fopen("welcome.txt","r") or exit("无法打开文件!");
while (!feof($file))
{
    echo fgetc($file);
}
fclose($file);
?>//fgetc() 函数用于从文件中逐字符地读取文件。注释:在调用该函数之后,文件指针会移动到下一个字符。

fwrite()

fwrite(file,string,length)
/*
file	必需。规定要写入的打开文件。
string	必需。规定要写入打开文件的字符串。
length	可选。规定要写入的最大字节数。
*/

file_get_contents()

file_get_contents(path,include_path,context,start,max_length)
/*
path	必需。规定要读取的文件。
include_path	可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。
context	可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。
start	可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。
max_length	可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。
*/
/*
file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法
*/
<?php
echo file_get_contents("test.txt");
?>
//上面的代码将输出:This is a test file with test text.(是我们test.txt的内容)

copy()
copy() 函数复制文件。

copy(file,to_file)
//file	必需。规定要复制的文件。
//to_file	必需。规定复制文件的目的地。
<?php
echo copy("source.txt","target.txt");
?>
//上面的代码将输出:1

filesize()
filesize() 函数返回指定文件的大小。如果成功,该函数返回文件大小的字节数。如果失败,则返回 FALSE。

filesize(filename)//filename	必需。规定要检查的文件。
<?php
echo filesize("test.txt");
?>

file_put_contents()
file_put_contents() 函数把一个字符串写入文件中。

int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
/*
file	必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。
data	必需。规定要写入文件的数据。可以是字符串、数组或数据流。
mode	可选。规定如何打开/写入文件。可能的值:FILE_USE_INCLUDE_PATH,FILE_APPEND,LOCK_EX
context	可选。规定文件句柄的环境。
*/
<?php
echo file_put_contents("sites.txt","bingbing");
?>
<?php
$file = 'sites.txt';
 
$site = "\ngugu";
// 向文件追加写入内容
// 使用 FILE_APPEND 标记,可以在文件末尾追加内容
//  LOCK_EX 标记可以防止多人同时写入
file_put_contents($file, $site, FILE_APPEND | LOCK_EX);
?>
/*
上面的输出结果是 :
bingbing
gugu
*/

unlink()
unlink() 函数删除文件。如果成功,该函数返回 TRUE。如果失败,则返回 FALSE。

unlink(filename,context)
//filename	必需。规定要删除的文件。
//context	可选。规定文件句柄的环境。
<?php
$file = "test.txt";
if (!unlink($file))
{
echo ("Error deleting $file");
}
else
{
echo ("Deleted $file");
}
?>

fileatime()
fileatime() 函数返回指定文件的上次访问时间。

fileatime(filename)//filename	必需。规定要检查的文件。
<?php
echo fileatime("test.txt");
echo "<br />";
echo "Last access: ".date("F d Y H:i:s.",fileatime("test.txt"));
?>

filectime()
filectime() 函数返回指定文件的上次修改时间。

filectime(filename)
//filename	必需。规定要检查的文件。
<?php
echo filectime("test.txt");
echo "<br />";
echo "Last change: ".date("F d Y H:i:s.",filectime("test.txt"));
?>

pathinfo()
pathinfo() 函数以数组的形式返回关于文件路径的信息。

pathinfo(path,options)
/*
path	必需。规定要检查的路径。
*/
/*
options	可选。规定要返回的数组元素。默认是 all。
可能的值:
PATHINFO_DIRNAME - 只返回 dirname
PATHINFO_BASENAME - 只返回 basename
PATHINFO_EXTENSION - 只返回 extension
PATHINFO_FILENAME - 只返回 filename
*/
<?php
print_r(pathinfo("/testweb/test.txt"));
?>
/*
Array
(
    [dirname] => /testweb
    [basename] => test.txt
    [extension] => txt
    [filename] => test
)
[dirname]: 目录路径
[basename]: 文件名
[extension]: 文件后缀名
[filename]: 不包含后缀的文件名
*/

最最简单的留言板(初初级)

使用PHP完成前后端两部分,编写一个最最简单的留言板模型,后期我们学习完 mysql 之后再进一步优化我们的留言板模型,这里我们先只使用PHP完成模型的搭建。

我们写一个最基础的前端部分:
在这里插入图片描述

<html>
<head>
<title>liuyanban</title>
</head>
<body>

<form action="action.php" method="POST">
<p>title:</p>
<input type="text" name="title"></input>
<p>content :</p>
<textarea cols=60 rows=15 name="content">说点神马吧</textarea>
<br>
<input type="submit" value="提交"></input>
</form>

</body>
</html>


然后我们提交数据后,我们再写一个最简单的后端部分来处理数据:

<?php
        if(empty($_POST['title']))
        {
               echo '<script>alert("我的心是冰冰的");windows.history.back(-1);</script>';
                 return false;
        }
        else
        {
                 $title = $_POST['title'];
                 $content = $_POST['content'];
                 $filename = 'liuyanban.txt';
                 $data = 'title : '.$title.'<br> '.'content :'.$content.'<br>';
                 $write = file_put_contents($filename, $data, FILE_APPEND);
         if($write)
         {
                 echo '<script>alert("不愧是我王冰冰");</script>';
         }
         else
         {
                 echo '<script>alert("你她喵是不是故意找茬?");</script>';
         }
                 echo file_get_contents($filename);
        }
?>

在这里插入图片描述
在这里插入图片描述
然后我们的留言板雏形就出现了,然后我们可以发现我们的留言内容:
在这里插入图片描述
但是我们发现别人的留言板是这样的:
在这里插入图片描述
就是留完言后,我们能否将留言内容显示在前端的界面,而不是跑到php代码里面显示去了,这里我们只使用PHP实现这个功能:

[root@localhost liuyan]# cp liuyanban.html liuyanban.php
//我们把liuyanban.html的信息复制到liuyanban.php里面去

然后我们把php代码放到html里面

<html>
<head>
<title>liuyanban</title>
</head>
<body>

<form action="" method="POST" >//这里就不再写action.php了
<p>title:</p>
<input type="text" name="title"></input>
<p>content :</p>
<textarea cols=60 rows=15 name="content">说点神马吧</textarea>
<br>
<input type="submit" value="提交"></input>
</form>

</body>
</html>

<?php
        if(empty($_POST['title']))
        {
                 echo '<script>alert("我的心是冰冰的");windows.history.back(-1);</script>';
                 return false;
        }
        else
        {
                 $title = $_POST['title'];
                 $content = $_POST['content'];
                 $filename = 'liuyanban.txt';
                 $data = 'title : '.$title.'<br> '.'content :'.$content.'<br>';
                 $write = file_put_contents($filename, $data, FILE_APPEND);
         if($write)
         {
                 echo '<script>alert("不愧是我王冰冰");</script>';
         }
         else
         {
                 echo '<script>alert("你她喵是不是故意找茬?");</script>';
         }
                 echo file_get_contents($filename);
        }
?>

在这里插入图片描述
这个留言板还有一个问题就是在刚访问的时候,会弹出一个判断title是否为空的情况,而且界面很丑,只有留言的功能,后面再优化改进。

错误记录
描述 :在html和php代码分开处理时,只能运行出 “我的心是冰冰的” 和 “你她喵是不是故意找茬” 这两个情况,“不愧是我王冰冰” 的情况不知道为什么不出来。
环境: centos7, PHP版本为5.4.16,apache。
解决思路: 初次考虑是代码写错了,后来问了一些人,发现应该是没问题,再次考虑为权限不够,给对应的文件足够权限后,依旧无法解决问题,重启相应的服务,也无法解决问题,最后在搜索引擎的不断搜索下,找到了解决方案,问题出现在防火墙。
解决方案:

setenforce 0 //centos终端root权限下输入命令,临时关闭selinux防火墙可以成功。

最难的不是算法,而是bug。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:25:23  更:2021-08-23 16:26:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 23:19:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码