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版本。
-
PHP_URL_SCHEME
(integer)
-
PHP_URL_HOST
(integer)
-
PHP_URL_PORT
(integer)
-
PHP_URL_USER
(integer)
-
PHP_URL_PASS
(integer)
-
PHP_URL_PATH
(integer)
-
PHP_URL_QUERY
(integer)
-
PHP_URL_FRAGMENT
(integer)
-
PHP_QUERY_RFC1738
(integer)
-
PHP_QUERY_RFC3986
(integer)
- 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。无效字符将使用 _ 来替换。
返回值
对严重不合格的 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
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 地址来验证。 |