php 中 http_build_query 函数对空值的处理

在对接 API 接口的时候,我们常常使用 http_build_query 函数来拼接参数。但是,这个函数会对空值做过滤和转换,不小心的话,很容易踩坑。

下面演示执行:

$args = [
    'key1' => 0,
    'key2' => '',
    'key3' => '0',
    'key4' => [],
    'key5' => null,
    'key6' => false,
    'key7' => true
];
$str = http_build_query($args);
echo $str;

输出结果为...

分类至 PHP
0条评论

php.ini 配置项 max_input_vars

从 PHP 5.3.9 起,php.ini 中增加了一个配置项 max_input_vars,默认值为1000。

手册中 max_input_vars 释义如下:

接受多少 输入的变量(限制分别应用于 $_GET、$_POST 和 $_COOKIE 超全局变量)指令的使用减轻了以哈希碰撞来进行拒绝服务攻击的可能性。如有超过指令指定数量的输入变量,将会导致 E_WARNING 的产生,更多的输入变量将会从请求中截断。 

分类至 PHP
0条评论

Lumen 框架前后台认证(多用户认证)

Lumen 框架默认只有一种角色认证(单表),但是通常我们会把后台管理员与前台用户设计成两个不同的表,这个时候就得改造一下代码了。

假设后台管理员和前台用户对应 Model 分别为 App\Models\AdminApp\Models\User,作如下修改...

分类至 PHP
0条评论

重新编译 PHP 中文手册

目前,从 PHP 官网 https://www.php.net/download-docs.php 下载的 chm 中文手册在 Windows 系统上有两个大问题:

  1. 索引不完整,中文标题的页面没有索引
  2. 搜索栏用不了,无论搜什么都搜不出来

鉴于此,本人参考了网上制作 chm 的文档,自己重新编译一个版本。

在 Windows 系统下,chm 文件是通过微软的 HTML Help Workshop 生成的。chm 文件可以用 7-zip 进行打开,解压出来后可得到原 html 文件、hhc 目录文件、hhk 索引文件。

本人用 7-zip 解压从 PHP 官网下载的 php_enhanced_zh.chm ,得到所有的 html,以及 php_manual_zh.hhcphp_manual_zh.hhk,打开这两个文件没有看到任何中文字符,猜测可能是解压的时候丢失了,或者原本官网打包就有问题。如果要重新制作 chm 手册,我们还缺少一个 hhp 后缀名的项目配置文件 。

下面是本人写的一个 PHP 脚本,用于重新生成 php_manual_zh.hhcphp_manual_zh.hhkphp_manual_zh.hhp

分类至 PHP
0条评论

PHP 的 array_column 函数

语法

array_column ( array $input , mixed $column_key [, mixed $index_key = null ] ) : array

array_column() 返回input数组中键值为column_key的列, 如果指定了可选参数index_key,那么input数组中的这一列的值将作为返回数组中对应值的键。

分类至 PHP
0条评论

Laravel 框架查询数据集转换为数组

1. Eloquent 查询

在 Laravel 框架里,如果是 Eloquent 查询,可以用 toArray 方法的把结果转换为一维数组。

Eloquent 模型的 first 方法返回的是单个 Eloquent 对象,使用 toArray 方法可以把它转换成数组:

$user = User::where('id', 1)->first()->toArray();

Eloquent 模型的 get 方法返回的是包含多个 Eloquent 对象的 Collection 集合,使用 toArray 方法可以把集合转换成二维数组:

$users = User::whereIn('id', [1, 2, 3])->get()->toArray();

2. DB 查询

当我们使用 DB 类进行查询时,first 方法返回的是 stdClass 对象,get 方法返回的是包含多个 stdClass 对象的 Collection 集合。

// first 返回结果是 stdClass 对象
$user = DB::table('users')->where('id', 1)->frist();

// get 返回结果是包含多个 stdClass 对象的 Collection 集合
$users = DB::table('users')->whereIn('id', [1, 2, 3])->get();

stdClass 是 PHP 的标准对象,当然不能使用 toArray 方法转换成数组。而 Collection 的 toArray 方法代码实现如下:

// 摘自框架文件:vendor\laravel\framework\src\Illuminate\Support\Collection.php
public function toArray()
{
    return array_map(function ($value) {
        return $value instanceof Arrayable ? $value->toArray() : $value;
    }, $this->items);
}

它通过判断集合内元素是否实现了 Arrayable 接口,再调用元素自身的 toArray 方法转换成数组——刚好 Eloquent 实现了这个接口。而 stdClass 对象当然就没有这个方法,因此,DB 查询 get 方法返回的 Collection 集合,用 toArray 方法转换成数组时,仅能转换第一层,内部元素还是 stdClass 对象。

解决方法一:

// first 结果转换成一维数组
$user = DB::table('users')->where('id', 1)->frist();
$user = (array)$user;

// get 结果转换成二维数组
$users = DB::table('users')->whereIn('id', [1, 2, 3])->get();
$users = $users->map(function ($value) { return (array)$value; })->toArray();

解决方法二:

// first 结果转换成一维数组
$user = DB::table('users')->where('id', 1)->frist();
$user = json_decode(json_encode($user), true);

// get 结果转换为成二维数组
$users = DB::table('users')->whereIn('id', [1, 2, 3])->get();
$users = json_decode(json_encode($users), true);

 

分类至 PHP
0条评论

PHP 排序模式 SORT_NUMERIC / SORT_STRING / SORT_NATURAL 详解

PHP 的排序函数提供了如下几种排序模式:

  • SORT_REGULAR - 将项目按照通常方法比较(不修改类型)
  • SORT_NUMERIC - 按照数字大小比较
  • SORT_STRING - 按照字符串比较
  • SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。它会使用 locale 信息,可以通过 setlocale() 修改此信息。
  • SORT_NATURAL - 以字符串的"自然排序",类似 natsort()
  • SORT_FLAG_CASE - 可以组合 (按位或 OR) SORT_STRING 或者 SORT_NATURAL 大小写不敏感的方式排序字符串。

...

分类至 PHP
0条评论

composer命令介绍之install和update及其区别

composer 是 php 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。

然而,对于如何『安装他们』,新手可能并不清楚。网上的答案有的说 composer install,有的说composer update,而这两者似乎都能成功把依赖下载下来并安装好,那么他们究竟有何区别呢?

分类至 PHP
0条评论