PHP 常用函数总结(二)

4、PHP处理数据库的常用函数。

汇总表

PHP 5 MySQLi 函数

函数 描述
mysqli_affected_rows() 返回前一个 Mysql 操作的受影响行数。
mysqli_autocommit() 打开或关闭自动提交数据库修改功能。
mysqli_change_user() 更改指定数据库连接的用户。
mysqli_character_set_name() 返回数据库连接的默认字符集。
mysqli_close() 关闭先前打开的数据库连接。
mysqli_commit() 提交当前事务。
mysqli_connect_errno() 返回最后一次连接调用的错误代码。
mysqli_connect_error() 返回上一次连接错误的错误描述。
mysqli_connect() 打开到 Mysql 服务器的新连接。
mysqli_data_seek() 调整结果指针到结果集中的一个任意行。
mysqli_debug() 执行调试操作。
mysqli_dump_debug_info() 转储调试信息到日志中。
mysqli_errno() 返回最近的函数调用产生的错误代码。
mysqli_error_list() 返回最近的函数调用产生的错误列表。
mysqli_error() 返回字符串描述的最近一次函数调用产生的错误代码。
mysqli_fetch_all() 抓取所有的结果行并且以关联数据,数值索引数组,或者两者皆有的方式返回结果集。
mysqli_fetch_array() 以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果。
mysqli_fetch_assoc() 以一个关联数组方式抓取一行结果。
mysqli_fetch_field_direct() 以对象返回结果集中单字段的元数据。
mysqli_fetch_field() 以对象返回结果集中的下一个字段。
mysqli_fetch_fields() 返回代表结果集中字段的对象数组。
mysqli_fetch_lengths() 返回结果集中当前行的列长度。
mysqli_fetch_object() 以对象返回结果集的当前行。
mysqli_fetch_row() 从结果集中抓取一行并以枚举数组的形式返回它。
mysqli_field_count() 返回最近一次查询获取到的列的数目。
mysqli_field_seek() 设置字段指针到特定的字段开始位置。
mysqli_field_tell() 返回字段指针的位置。
mysqli_free_result() 释放与某个结果集相关的内存。
mysqli_get_charset() 返回字符集对象。
mysqli_get_client_info() 返回字符串类型的 Mysql 客户端版本信息。
mysqli_get_client_stats() 返回每个客户端进程的统计信息。
mysqli_get_client_version() 返回整型的 Mysql 客户端版本信息。
mysqli_get_connection_stats() 返回客户端连接的统计信息。
mysqli_get_host_info() 返回 MySQL 服务器主机名和连接类型。
mysqli_get_proto_info() 返回 MySQL 协议版本。
mysqli_get_server_info() 返回 MySQL 服务器版本。
mysqli_get_server_version() 返回整型的 MySQL 服务器版本信息。
mysqli_info() 返回最近一次执行的查询的检索信息。
mysqli_init() 初始化 mysqli 并且返回一个由 mysqli_real_connect() 使用的资源类型。
mysqli_insert_id() 返回最后一次查询中使用的自动生成 id。
mysql_kill() 请求服务器终结某个 MySQL 线程。
mysqli_more_results() 检查一个多语句查询是否还有其他查询结果集。
mysqli_multi_query() 在数据库上执行一个或多个查询。
mysqli_next_result() 从 mysqli_multi_query() 中准备下一个结果集。
mysqli_num_fields() 返回结果集中的字段数。
mysqli_num_rows() 返回结果集中的行数。
mysqli_options() 设置选项。
mysqli_ping() Ping 一个服务器连接,或者如果那个连接断了尝试重连。
mysqli_prepare() 准备一条用于执行的 SQL 语句。
mysqli_query() 在数据库上执行查询。
mysqli_real_connect() 打开一个到 Mysql 服务端的新连接。
mysqli_real_escape_string() 转义在 SQL 语句中使用的字符串中的特殊字符。
mysqli_real_query() 执行 SQL 查询。
mysqli_reap_async_query() 返回异步查询的结果。
mysqli_refresh() 刷新表或缓存,或者重置复制服务器信息。
mysqli_rollback() 回滚当前事务。
mysqli_select_db() 改变连接的默认数据库。
mysqli_set_charset() 设置默认客户端字符集。
mysqli_set_local_infile_default() 清除用户为 load local infile 命令定义的处理程序。
mysqli_set_local_infile_handler() 设置 LOAD DATA LOCAL INFILE 命令执行的回调函数。
mysqli_sqlstate() 返回前一个 Mysql 操作的 SQLSTATE 错误代码。
mysqli_ssl_set() 使用 SSL 建立安装连接。
mysqli_stat() 返回当前系统状态。
mysqli_stmt_init() 初始化一条语句并返回一个由 mysqli_stmt_prepare() 使用的对象。
mysqli_store_result() 传输最后一个查询的结果集。
mysqli_thread_id() 返回当前连接的线程 ID。
mysqli_thread_safe() 返回是否设定了线程安全。
mysqli_use_result() 初始化一个结果集的取回。
mysqli_warning_count() 返回连接中最后一次查询的警告数量。
 
$servername = "localhost";

$username = "username";

$password = "password";

$dbname ="dbname";

Mysqli:

面向对象:

  • 连接数据库
    //语法mysqli(host,username,password,dbname,port,socket);
    
        $conn = new mysqli($servername, $username, $password, $dbname);
    
        //检查连接
    
        if ($conn->connect_error) {
    
          die('连接失败' . $conn->connect_error);
    
        }
    
        注意:$connect_error 是从PHP 5.2.9开始添加的,要兼容之前的 版本请用以下代码代替:
    
        //检查连接
    
        if (mysqli_connect_error()) {
    
          die('连接失败' . mysqli_connect_error());
    
        }
  • 创建数据库
    $sql = "CREATE DATABASE table_name";
    if ($conn->query $sql) === true) {
    echo "数据库创建成功";
    } else {
    echo "Error creating database: " . $conn->error();
    }
  • 创建表
    $sql  = "CREATE TABLE table_name (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user varchar(30) NOT NULL,
    username varchar(30) ,
    email varchar(50),
    reg_date timestamp
    ) engine=Innodb default charset=utf8 "; if ($conn->query($sql) === TRUE) {
    echo "Table MyGuests created successfully";
    } else {
    echo "创建数据表错误: " . $conn->error;
    }
  • 插入数据
    //插入一条
    $sql = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access', 'user_nickname', NOW())";
    if($conn->query($sql)===true){
    echo " inserted ok";
    }
    //插入多条
    //关闭自动提交
    $conn->autocommit(FALSE);
    try {
    $sql = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access1', 'user_nickname1', NOW())";
    $sql .= "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access2', 'user_nickname2', NOW())";
    $sql .= "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access3', 'user_nickname3', NOW())"; if ($conn->multi_query($sql===true)) {
    $conn->commit();
    }else{
      $conn->rollback();
    }
    //开启自动提交
    $conn->autocommit(TRUE);
  • 更新数据 
    $sql = "update  table_name set username='newname' where user='user_access1'";
    $conn->query($sql);
  • 查询数据
    /**
    *获取用户信息
    *@access public
    *@param int $userId [用户的id]
    *@return array $data
    */
    public function getUserInfo($userId)
    {
    $data = array();
    $sql = "select `user`.id,`user`.user,`user`.username,`user`.sex from `user` where `user`.id={$userId}";
    //mysqli_result类
    $result = $this->db->query($sql);
    if ($result->num_rows>0) {
    //返回一条记录
    $data = $result->fetch_assoc();
    }
    //释放资源free()或free_result()或close()
    $result->free();
    return $data;
    } /**
    *获取用户信息
    *@access public
    *@param int $preId [上一次获取的用户中最后一名用户的id]
    *@param int $size [页码]
    *@return array $data
    */
    public function getAllUser($preId=0, $size=15)
    {
    $data = array(); $sql = "select `user`.id,`user`.user,`user`.username,`user`.sex from `user` where `user`.id>{$preId} limit {$size}";
    $result = $this->db->query($sql);
    if ($result->num_rows>0) {
    //返回所有记录
    $data = $result->fetch_all();
    } return $data;
    }
  • 删除数据
    $sql = "delete from table_name where user='user_access1'";
    $conn->query($sql);
  • 事务处理(上锁操作)
  • 预处理(防SQL注入,查询语句一般不要用)
    $sql ="insert into table_name ('user', 'username', 'reg_date') values (?, ?, ?)";
    
    //预处理和绑定参数
    $stmt = $conn->prepare($sql);
    //第一个参数表明变量类型,有i(int),d(double),s(string),b(blob)
    $stmt->bind_param('sss', $user, $username, $reg_date); //设置参数并执行
    $user = 'user1';
    $username = 'username1';
    $reg_date = date('Y-m-d H:i:s', time());
    $stmt->execute(); $user = 'user2';
    $username = 'username2';
    $reg_date = date('Y-m-d H:i:s', time());
    $stmt->execute(); $user = 'user3';
    $username = 'username3';
    $reg_date = date('Y-m-d H:i:s', time());
    $stmt->execute();
    $stmt->close();
  • 关闭连接

  $conn->close();

面向过程:

  • 连接数据库
   //语法mysqli_connect(host,username,password,dbname,port,socket);
    $conn = mysqli_connect($servername,%username, $password, $dbname );     if (!$conn) {
      die('Connection failed:' . mysqli_connect_error());
    }
  • 创建数据库
    $sql = "CREATE DATABASE table_name";
    if (mysqli_query($conn, $sql)) {
    echo "数据库创建成功";
    } else {
    echo "Error creating database: " . mysqli_error($conn);
    }
  • 创建表
    $sql  = "CREATE TABLE table_name (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user varchar(30) NOT NULL,
    username varchar(30) ,
    email varchar(50),
    reg_date timestamp
    ) engine=Innodb default charset=utf8 "; if (mysqli_query($conn, $sql) === TRUE) {
    echo "Table MyGuests created successfully";
    } else {
    echo "创建数据表错误: " . mysqli_error($conn);
    }
  • 插入数据
    //插入一条
    $sql = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access', 'user_nickname', NOW())";
    if(mysqli_query($conn, $sql)===true){
    echo " inserted ok";
    }
    //插入多条
    //关闭自动提交
    mysqli_autocommit($conn, FALSE);
    try {
    $sql = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access1', 'user_nickname1', NOW())";
    $sql .= "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access2', 'user_nickname2', NOW())";
    $sql .= "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access3', 'user_nickname3', NOW())"; if (mysqli_multi_query($conn, $sql)) {
    mysqli_commit($conn);
    } else {
    mysqli_rollback($conn);
    }
    //开启自动提交
    mysqli_autocommit($conn, TRUE);
  • 更新数据
    $sql = "update  table_name set username='newname' where user='user_access1'";
    mysqli_query($conn, $sql);
  • 查询数据
    $data = array();
    $sql = "select * from `user` ";
    $result = mysqli_query($conn, $mysql);
    if (mysqli_num_rows($result)>0) {
    $data = mysqli_fetch_all($result);
    }
    mysqli_free_result($result);
  • 删除数据
    $sql = "delete from table_name where user='user_access1'";
    mysqli_query($conn, $sql);
  • 事务处理(上锁操作)
  • 预处理(防SQL注入,查询语句一般不要用)
    $sql ="insert into table_name ('user', 'username', 'reg_date') values (?, ?, ?)";
    
    // 为 mysqli_stmt_prepare() 初始化 statement 对象
    $stmt = mysqli_stmt_init($conn);
    //预处理和绑定参数
    if (mysqli_stmt_prepare($stmt, $sql)) {
    //绑定参数,变量类型有i(int),d(double),s(string),b(blob)
    mysqli_stmt_bind_param($stmt, 'sss', $user, $username, $reg_date);
    //设置参数并执行
    $user = 'user1';
    $username = 'username1';
    $reg_date = date('Y-m-d H:i:s', time());
    mysqli_stmt_execute($stmt); $user = 'user2';
    $username = 'username2';
    $reg_date = date('Y-m-d H:i:s', time());
    mysqli_stmt_execute($stmt); $user = 'user3';
    $username = 'username3';
    $reg_date = date('Y-m-d H:i:s', time());
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt); }
  • 关闭连接

  mysqli_close($conn);

PDO(面向对象):

  提示: 使用 PDO 的最大好处是在数据库查询过程出现问题时可以使用异常类来 处理问题。如果 try{ } 代码块出现异常,脚本会停止执行并会跳到第一个 catch(){ } 代码块执行代码。

  如果PDO::找不到PDO类的话,需要在前面加入反斜杠表示空间根目录,如\PDO::

  • 连接数据库
/*语法PDO($dsn,$username,$password,$opts);

  $opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0 #关闭自动提交, PDO::ATTR_TIMEOUT => 3 #设置超时时间);

  $dsn = "mysql:host=localhost;port=3307;dbname=db";

  或者$dsn = "mysql:unix_socket=/tmp/mysql.sock;dbname=db";

  echo $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);//setAttribute 可以设置属性

  $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);  #设置获取的方式
     执行sql语句: exec() 、query()、 perpare();   1、query用来处理有结果集的,如select, 返回 PDOStatement 对象,失败返回false(当为 PDO::ERRMODE_SILENT,这也是默认的值)
  2、exec用来处理有返回影响行数的(int),如 insert(插入的行数)、 delete(删除的行数) 、update(和原数值不等才算), 失败返回false (当为 PDO::ERRMODE_SILENT,这也是默认的值)   3、prepare 执行所有sql,可以完全替代 query,exec的功能   错误报告是针对执行的sql出错时   PDO::ERRMODE_SILENT :默认 不提示任何错误 ,连接时无论如何都会提示,只有在执行后面的方法时才会起作用
  PDO::ERRMODE_WARNING : 警告
  PDO::ERRMODE_EXCEPTION:异常(推荐使用) 用try catch捕获,也可以手动抛出异常 new PDOException($message, $code, $previous)   */   try {     $conn = new PDO("mysql:host={$servername};dbname={$dbname}", $username, $password);     $conn -> setAttribute(PDO::ERRMODE, PDO::ERRMODE_EXCEPTION); #设置获取的方式
  }   catch(PDOException $e)   {     echo $e->getMessage();   }   注意PDO 连接数据库时必须指明需要连接的数据库名,否则会报异常。
  • 创建数据库
    $sql = "CREATE DATABASE dbname";
    //使用exec(),返回受影响的行数。因为没有结果集返回。
    //注意与execute()区分,execute函数用于执行预处理语句,execute函数需要与prepare函数配合使用。
    $conn->exec($sql);
  • 创建表
    $sql  = "CREATE TABLE table_name (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user varchar(30) NOT NULL,
    username varchar(30) ,
    email varchar(50),
    reg_date timestamp
    ) engine=Innodb default charset=utf8 ";
    //提示:mysql 5种时间格式根据实际需求选择
    $conn->exec($sql);
  • 插入数据
    //插入一条
    $sql = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access', 'user_nickname', NOW())";
    $conn->exec($sql);
    //插入多条
    //关闭自动提交
    $conn->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
    try { 
    $sql1 = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access1', 'user_nickname1', NOW())";
    $sql2 = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access2', 'user_nickname2', NOW())";
    $sql3 = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES ('user_access3', 'user_nickname3', NOW())";
    //开启事务
    $conn->beginTransaction(); $conn->exec($sql1);
    $conn->exec($sql2);
    $conn->exec($sql3); //提交事务
    $conn->commit();
    } catch(PDOException $e)
    { //事务执行失败,回滚到执行之前状态
    $conn->rollback();
    }
    //还原自动提交
    $conn->setAttribute(PDO::ATTR_AUTOCOMMIT,1);
     

    提示:PDO::lastinsertId([column])可用于获取最后插入行的id号或指定 列的字符串。

  • 更新数据
    $sql = "update table_name set username='newname' where user='user_access1'";
    $conn->exec($sql);
  • 查询数据
    $sql = "select * from table_name";
    $stmt = $conn->query($sql);
    //受影响的行数
    $rowCount = $stmt->rowCount();
    $data = array();
    if ($rowCount>0) {
    //如果不想在fetch()或fetchAll()中重复写入参数,可以直接设置
    //$stmt->setFetchMode(PDO::FETCH_ASSOC);
    //方法1,通过fetch()一条一条遍历输出
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $data[] = $row;
    }
    //方法2,通过fetchAll() 直接返回一个二维数组集合
    //$data = $stmt->fetchAll(PDO::FETCH_ASSOC) ;
    } 提示:$stmt->fetchAll(PDO::FETCH_COLUMN,$n) 可直接从结果集中获取第$n+1 列的所有值。
  • 删除数据
    $sql = "delete from table_name where user='user_access1'";
    $conn->exec($sql);
  • 事务处理(上锁操作)
  • 预处理(防SQL注入)
    //预处理语句并绑定参数
    $sql = "INSERT INTO table_name (`user`, `username`, `reg_date`) VALUES (:user, :username, :reg_date)";
    $stmt = $conn->prepare($sql);
    $stmt ->bindParam(':user', $user, PDO::PARAM_STR);
    $stmt ->bindParam(':username', $username, PDO::PARAM_STR);
    $stmt ->bindParam(':reg_date', $reg_date); $user = 'newuser1';
    $username = 'newusername1';
    $reg_date = date('Y-m-d H:i:s',time());
    $stmt->execute(); $user = 'newuser2';
    $username = 'newusername2;
    $reg_date = date('Y-m-d H:i:s',time());
    $stmt->execute(); $user = 'newuser3';
    $username = 'newusername3';
    $reg_date = date('Y-m-d H:i:s',time());
    $stmt->execute();
    $rowCount = $stmt->rowCount();
    注意:rowCount(),只能用于返回更新,插入,删除操作的影响数,select 不能正确显示受影响的数量

      

    /*绑定参数支持的数据类型
    PDO:PARAM_BOOL:表示boolean数据类型
    PDO:PARAM_NULL:表示NULL数据类型
    PDO:PARAM_INT:表示INT数据类型
    PDO:PARAM_STR:表示字符串数据类型
    PDO:PARAM_LOB:表示大对象数据类型
    */

    
    
    //预处理语句并绑定参数
    $sql = "select * from table_name limit size=:size";
    $stmt = $conn->prepare($sql);
    $stmt ->bindParam(':size', $size,PDO::PARAM_INT); $rowCount = $stmt->execute();
    $data = array();
    if ($rowCount>0) {
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    return $data; 提示:fetch()用于返回一条记录(一维数组),fetchAll()用于返回1条或多条记录(二维数组)。
  • 关闭连接

  $conn = null;

  

PDO用法参考  https://www.cnblogs.com/siqi/p/3774871.html

5、PHP处理文件和目录的常用函数。

重点关注:

  • 打开操作
  • 读取操作
  • 修改操作
  • 关闭操作
  • 创建操作
  • 删除操作
  • 权限设置

#EXAMPLE

实现不常变动数据缓存的读写操作

<?php
/**
*@author zwesy <zwesy@qq.com>
*@date 2018/07/20
*@time 17:41
*@description static cache data to html
*/ namespace cache; class CacheData
{
private $dir_default;//定义一个默认路径
const EXT = '.txt';//定义一个缓存文件的文件名后缀常量 function __construct()
{
$this->dir_default = dirname(__FILE__).'/cahcefiles/shtml/';//定义默认目录为当前文件夹下的cachefiles文件夹 } /**
*把生成/获取、删除缓存这三个操作封装在cache方法中
*@access public
*@param String $key [缓存的文件名]
*@paran json $value [需要缓存的数据,json格式的字符串]
*@param integer $cacheTime [缓存的生命周期(秒),0表示永久有效]
*/
public function cache($key, $value = '', $cacheTime = 0)
{
$filename = $this->dir_default . $key . self::EXT;
//将value值写入缓存
if ($value !== '') {
if (is_null($value)) {
return @unlink($filename);//unlin删除文件,@忽略警告
}
$dir = dirname($filename);
if (!is_dir($dir)) {
//如果目录不存在就创建目录
mkdir($dir, 0777, true);
}
$cacheTime = sprintf('%011d', $cacheTime);//规定缓存时间格式,不足11位,则在前面补0,方便时间截取
$cacheValue = $cacheTime .$value;
return file_put_contents($filename, $cacheValue);
}
//获取缓存
if (!is_file($filename)) {
return FALSE;
}
$contents = file_get_contents($filename);
$cacheTime = (int)substr($contents, 0, 11);
$value = substr($contents, 11);
if ($cacheTime !=0 && ($cacheTime + fileatime($filename) < time())) {
//判断文件上次访问到现在是否过期
@unlink($filename);
return FALSE;
}
return json_decode($value, true);//解析成数组,返回
} /*
##要点:
fileatime() 返回文件的上次访问时间。
filectime() 返回文件的上次改变时间。
filemtime() 返回文件的上次修改时间。
*/ } ############################################# use \ndb\DBMysqli;
use think\Controller;
use \cache\CacheData; class Test extends Controller
{
/**
*cache数据的写入与读取
*@access public
*@param String $fname [文件名称]
*@param json $contents [缓存内容,json格式的字符串]
*@param integer $lifeTime [生命周期(秒),0表示无期限]
*/
public function myCache($fname, $contents='', $lifeTime=0)
{
$cache = new CacheData();
$result = $cache->cache($fname, $contents, $lifeTime);
//返回值 FALSE/写入的字节数/返回的缓存数组数据
return $result;
} /**
*数据库数据测试
*/
public function testmysql()
{
$db_mysqli = new DBMysqli();
$result = $db_mysqli->getAllUser(0,10); //把不经常变动的数据写入缓存文件
if (!$this->myCache('user_cache')) {
//如果缓存文件不存在或失效了,则重新写入新缓存数据
$res = $this->myCache('user_cache',json_encode($result),10);
if($res>0){
echo "写入缓存成功";
} else {
echo "无数据写入";
}
} } }

PHP Filesystem 函数 http://www.w3school.com.cn/php/php_ref_filesystem.asp

重要的:


basename(path,suffix)  函数返回路径中的文件名部分。
clearstatcache() 函数清除文件状态缓存。
受 clearstatcache() 函数影响的函数:
stat()
lstat()
file_exists()
is_writable()
is_readable()
is_executable()
is_file()
is_dir()
is_link()
filectime()
fileatime()
filemtime()
fileinode()
filegroup()
fileowner()
filesize()
filetype()
fileperms() #
chmod(file,mode) 变文件模式(权限)【mode 参数可选由 4 个数字组成:
  • 第一个数字永远是 0
  • 第二个数字规定所有者的权限
  • 第三个数字规定所有者所属的用户组的权限
  • 第四个数字规定其他所有人的权限
  • 可能的值(如需设置多个权限,请对下面的数字进行总计):

    • 0 - 无权限
    • 1 - 执行权限
    • 2 - 写权限
    • 4 - 读权限
    • 5 - 读和执行权限
    • 6 - 读写权限
    • 7 - 所有权限
  •   如chmod('a.sh', 0700);//所有者拥有全部权限,其他人无任何权限
chown(file,owner) 改变指定文件的所有者。【只有超级用户可以改变文件的所有者】
copy(source,destination) 将文件从 source 拷贝到 destination。如果成功则返回 TRUE,否则返回 FALSE。
dirname(path) 返回路径中的目录部分。
rename(oldname,newname,context) 移动文件并重命名文件或目录
disk_free_space(directory) 返回目录中的可用空间【返回可用的字节数】
disk_total_space(directory) 返回指定目录的磁盘总大小。【返回字节数】
fclose(file) 关闭一个打开文件。【文件指针必须有效,并且是通过 fopen() 或 fsockopen() 成功打开的。】
unlink(filename,context)删除文件。若成功,则返回 true,失败则返回 false。
feof(file) 检测是否已到达文件末尾 (eof)。【如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。文件指针必须有效,并且必须指向一个由 fopen() 或 fsockopen() 成功打开(但还没有被 fclose() 关闭)的文件】
fgetcsv(file,length,separator,enclosure) 从文件指针中读入一行并解析 CSV 字段。然后返回一个包含这些字段的数组。【用于读取特定的缓存文件】
如:
<?php
$file = fopen("contacts.csv","r");
while(! feof($file))
{
print_r(fgetcsv($file));
}
fclose($file);
?>
CSV 文件:
George, John, Thomas, USA
James, Adrew, Martin, USA
输出:
Array
(
[0] => George
[1] => John
[2] => Thomas
[3] => USA Array
(
[0] => James
[1] => Adrew
[2] => Martin
[3] => USA
)
fgets(file,length) 从文件指针中读取一行。【length 可选。规定要读取的字节数。默认是 1024 字节。从 PHP 4.3 开始,忽略掉 length将继续从流中读取数据直到行结束。】
fgetss(file,length,tags) 从打开的文件中读取一行并过滤掉 HTML 和 PHP 标记。【tags 可选,规定不会被删除的标签。】
file(path,include_path,context) 把整个文件读入一个数组中。【数组中的每个单元都是文件中相应的一行,包括换行符在内。】
file_exists(path) 检查文件或目录是否存在。【当文件或目录不存在时,效率比is_file()/is_dir()高,反之,则比后2者低】
fileperms(filename) 返回文件或目录的权限。【本函数的结果会被缓存。请使用 clearstatcache() 来清除缓存。】
fileatime(filename) 回指定文件的上次访问时间。【以 Unix 时间戳的方式返回】
fileatime(filename) 返回指定文件的上次 inode 修改时间。【以 Unix 时间戳的方式返回】
filemtime(filename) 返回文件内容上次的修改时间。【以 Unix 时间戳的方式返回】
filesize(filename) 返回指定文件的大小。【返回文件大小的字节数】
filetype(filename) 返回指定文件或目录的类型。【

若成功,则返回 7 种可能的值。若失败,则返回 false。

可能的值:

  • fifo
  • char
  • dir
  • block
  • link
  • file
  • unknown
flock(file,lock,block) 锁定或释放文件。【详情http://www.w3school.com.cn/php/func_filesystem_flock.asp】
fopen(filename,mode,include_path,context) 打开文件或者 URL【

详情参考 http://www.w3school.com.cn/php/func_filesystem_fopen.asp

  mode参数:

  • "r" 只读方式打开,将文件指针指向文件头。
  • "r+" 读写方式打开,将文件指针指向文件头。
  • "w" 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
  • "w+" 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
  • "a" 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
  • "a+" 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
fputs(file,string,length) 或  fwrite()  写入文件。把 string 的内容写入文件指针 file 处。【fputs() 函数是 fwrite() 函数的别名。】
is_link(file) 判断指定文件名是否为一个符号连接。
is_readable(file) 判断指定文件名是否可读。
is_writeable(file) 判断指定的文件是否可写。【该函数是 is_writable() 函数的别名】
mkdir(path,mode,recursive,context) 创建目录。【注意权限mode】
is_uploaded_file(file) 判断指定的文件是否是通过 HTTP POST 上传的。【用于判断用户上传文件的合法性】
move_uploaded_file(file,newloc) 将上传的文件移动到新位置。【本函数仅用于通过 HTTP POST 上传的文件。】

parse_ini_file(file,process_sections)解析一个配置文件,并以数组的形式返回其中的设置。【ini 文件的结构和 php.ini 的相似,通常用来解析自定义配置文件】

pathinfo(path,options) 以数组的形式返回文件路径的信息。【通常用来解析文件,可以与parse_url()结合解析URL文件
process_sections

可选。规定要返回的数组元素。默认是 all。

可能的值:

  • PATHINFO_DIRNAME - 只返回 dirname
  • PATHINFO_BASENAME - 只返回 basename
  • PATHINFO_EXTENSION - 只返回 extension

包括以下的数组元素:

  • [dirname]
  • [basename]
  • [extension]
readfile(filename,include_path,context) 读入一个文件并写入到输出缓冲。
file_get_contents(path,include_path,context,start,max_length) 函数把整个文件读入一个字符串中。
file_put_contents(file,data,mode,context) 把一个字符串写入文件中。【
mode

可选。规定如何打开/写入文件。可能的值:

  • FILE_USE_INCLUDE_PATH
  • FILE_APPEND
  • LOCK_EX
readlink(linkpath) 返回绝对路径。
fseek(file,offset,whence) 把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量。
rewind(file) 将文件指针的位置倒回文件的开头。
rmdir(dir,context) 删除空的目录。【删除 dir 所指定的目录。 该目录必须是空的,而且要有相应的权限。】

set_file_buffer(file,buffer) 设置打开文件的缓冲大小。
fstat(file) 返回关于文件的信息。
tempnam(dir,prefix) 创建一个具有唯一文件名的临时文件。返回新的临时文件名。
touch(filename,time,atime) 设置指定文件的访问和修改时间。

PHP Directory

chdir(path) 改变当前目录到指定的目录
getcwd() 获取当前工作目录【网站一般返回的是入口文件所在的目录,而非当前文件的目录】
dir(directory,context);返回一个Directory 类的实例。用于读取一个目录。【类对象有三个方法:read()、rewind() 和 close()】
opendir(path,context);打开目录句柄。
readdir(dir_handle);返回目录中下一个文件的文件名。
rewinddir(dir_handle);重置由 opendir() 创建的目录句柄。
closedir(dir_handle);关闭目录句柄。
scandir(directory,sorting_order,context);返回指定目录中的文件和目录的数组。
如:列出$dir 目录下所有文件和文件夹
print_f(array_slice(scandir($dir,0),2));//删除掉前2个 .和.. 目录
//递归列出目录下所有文件和文件夹
public function listdir($dir){
  if (is_dir($dir)) {
$dir_list = scandir($dir);
    if ($count=count($dir_list)>2) {
//判断是否为非空目录
echo '<ul>';
for($i=2;$i<$count;$++){
       echo '<li>' .$dir_list[$i];
if(is_dir($dir_list[$i])){
listdir($dir_list[$i]);
}
echo '</li>';
}
echo '</ul>';
    }
}
}

6、PHP处理HTTP的常用函数。

重点:

熟记常见HTTP状态码和了解其他不常见的状态码(编写API文档时需要更新HTTP状态码来进行变形设置状态参数,如400状态情况下,设置rcode=400401)

详情介绍请参考 我另一个随笔《API的HTTP Status Code》中有较为详细的介绍

超全局变量

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

元素/代码 描述
$_SERVER['PHP_SELF'] 返回当前执行脚本的文件名。
$_SERVER['GATEWAY_INTERFACE'] 返回服务器使用的 CGI 规范的版本。
$_SERVER['SERVER_ADDR'] 返回当前运行脚本所在的服务器的 IP 地址。
$_SERVER['SERVER_NAME'] 返回当前运行脚本所在的服务器的主机名(比如 www.w3school.com.cn)。
$_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。

$_REQUEST超全局变量用于收集 HTML 表单提交的数据。

如:$name = $_REQUEST['fname'];

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

如:$name = $_POST['fname'];

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

如:$name = $_GET['fname'];

$_COOKIE和$_SESSION 保存了会话服务的一些参数设置

对于URL的处理

PHP CURL扩展相关函数

URLs 基本扩展函数

CURL 预定义常量

以下常量是为了与 parse_url()使用 在PHP 5.1.2版本。

URL 函数

  • base64_decode — 对使用 MIME base64 编码的数据进行解码
  • base64_encode — 使用 MIME base64 对数据进行编码
  • get_headers — 取得服务器响应一个 HTTP 请求所发送的所有标头
  • get_meta_tags — 从一个文件中提取所有的 meta 标签 content 属性,返回一个数组
  • http_build_query — 生成 URL-encode 之后的请求字符串
  • parse_url — 解析 URL,返回其组成部分
  • rawurldecode — 对已编码的 URL 字符串进行解码
  • rawurlencode — 按照 RFC 3986 对 URL 进行编码
  • urldecode — 解码已编码的 URL 字符串
  • urlencode — 编码 URL 字符串

parse_url ( string $url [, int $component = -1 ] )

解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

参数

url

要解析的 URL。无效字符将使用 _ 来替换。

component

指定 PHP_URL_SCHEME、 PHP_URL_HOST、 PHP_URL_PORT、 PHP_URL_USER、 PHP_URL_PASS、 PHP_URL_PATH、 PHP_URL_QUERY 或 PHP_URL_FRAGMENT 的其中一个来获取 URL 中指定的部分的 string。 (除了指定为 PHP_URL_PORT 后,将返回一个 integer 的值)。

返回值

对严重不合格的 URL,parse_url() 可能会返回 FALSE

如果省略了 component 参数,将返回一个关联数组 array,在目前至少会有一个元素在该数组中。数组中可能的键有以下几种:

  • scheme - 如 http
  • host
  • port
  • user
  • pass
  • path
  • query - 在问号 ? 之后
  • fragment - 在散列符号 # 之后

如果指定了 component 参数, parse_url() 返回一个 string (或在指定为 PHP_URL_PORT 时返回一个 integer)而不是 array。如果 URL 中指定的组成部分不存在,将会返回 NULL

验证URL合法性

//使用自定义正则匹配验证
function CheckURL($url) { if (!preg_match('/http[s]:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is',$url)) { return false;
} return true;
} //使用PHP 内置过滤器来验证验证邮箱、URL、IP

   PHP Filter

 if (filter_var($url, FILTER_VALIDATE_URL)){
return 'url is valid';
} else {
    return 'url is not valid'; 
 }

PHP Filters

ID 名称 描述
FILTER_CALLBACK 调用用户自定义函数来过滤数据。
FILTER_SANITIZE_STRING 去除标签,去除或编码特殊字符。
FILTER_SANITIZE_STRIPPED "string" 过滤器的别名。
FILTER_SANITIZE_ENCODED URL-encode 字符串,去除或编码特殊字符。
FILTER_SANITIZE_SPECIAL_CHARS HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。
FILTER_SANITIZE_EMAIL 删除所有字符,除了字母、数字以及 !#$%&'*+-/=?^_`{|}~@.[]
FILTER_SANITIZE_URL 删除所有字符,除了字母、数字以及 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=
FILTER_SANITIZE_NUMBER_INT 删除所有字符,除了数字和 +-
FILTER_SANITIZE_NUMBER_FLOAT 删除所有字符,除了数字、+- 以及 .,eE。
FILTER_SANITIZE_MAGIC_QUOTES 应用 addslashes()。
FILTER_UNSAFE_RAW 不进行任何过滤,去除或编码特殊字符。
FILTER_VALIDATE_INT 在指定的范围以整数验证值。
FILTER_VALIDATE_BOOLEAN 如果是 "1", "true", "on" 以及 "yes",则返回 true,如果是 "0", "false", "off", "no" 以及 "",则返回 false。否则返回 NULL。
FILTER_VALIDATE_FLOAT 以浮点数验证值。
FILTER_VALIDATE_REGEXP 根据 regexp,兼容 Perl 的正则表达式来验证值。
FILTER_VALIDATE_URL 把值作为 URL 来验证。
FILTER_VALIDATE_EMAIL 把值作为 e-mail 来验证。
FILTER_VALIDATE_IP 把值作为 IP 地址来验证。
上一篇:事件驱动架构 (Event-Driven Architecture,EDA) 简介


下一篇:初入HTML5