小破孩的小站 - PHP
type: channel
link: http://8688pic.com/index.php/category/php/
items: 【PHP】境外微信支付生成平台证书 - wechatpay
items: 【PHP】bc系列函数（高精度数学运算）
items: 【开发基础】nginx/postgresql/php/redis/ssdb的启动/关闭/重启命令及配置文件修改
items: 【开发基础】macOS系统的常规使用方法
items: 【PHP】ThinkPHP8数据库迁移示例
items: 【PHP】ThinkPHP8 数据库迁移与数据填充完全指南
items: 【ThinkPHP】创建有背景的微信小程序二维码
items: 【PHP】PHPExcel 使用手册
items: 【PHP】PHP实现无限级树形分类 树形分类 如果子集的pid不是空，父级id不存在，则子集不展示
items: 【PHP】清空MySQL数据，索引重置

【PHP】境外微信支付生成平台证书 - wechatpay
type: item
date: 2025-09-05T17:56:00+08:00
description: 使用方法 $wechatPayPlatformCertInstance = new \addons\unidrink\library\pay\overseas\wechat\Certificate(); try { $platformCerts = $wechatPayPlatformCertInstance->getPlatformCerts(); if (!empty($platformCerts)) { // 获取最新的证书 $latestCert = $platformCerts[0]; // 返回成功信息 return json([ 'code' => 1, 'msg' => '平台证书生成成功', 'data' => [ 'serial_no' => $latestCert['serial_no'], 'effective_time' => $latestCert['effective_time'], 'expire_time' => $latestCert['expire_time'], 'cert_saved_path' => $wechatPayPlatformCertInstance->getCertPath() . $latestCert['serial_no'] . '.pem', ] ]); } else { throw new Exception('未获取到平台证书'); } } catch (Exception $e) { // 错误处理 return json([ 'code' => 0, 'msg' => '平台证书生成失败: ' . $e->getMessage(), 'data' => [] ]); } 下面是类 <?php namespace addons\unidrink\library\pay\overseas\wechat; use think\Exception; use think\Log; use WeChatPay\Crypto\Rsa; use WeChatPay\Formatter; use WeChatPay\Util\PemUtil; class Certificate { // 配置参数 private $config; // 证书保存路径 private $certPath; // 平台证书列表 private $platformCerts = []; /** * 构造函数 * @param array $config 微信支付配置 */ public function __construct($config = []) { // 默认配置 $defaultConfig = [ 'mch_id' => '', // 商户号 'serial_no' => '', // 商户API证书序列号 'private_key' => ROOT_PATH . 'public/cert/apiclient_key.pem', // 商户私钥内容或路径 'api_v3_key' => '', // APIv3密钥 'cert_path' => ROOT_PATH . 'public/cert/wechatpay/', // 证书保存目录 'ca_cert_path' => ROOT_PATH . 'public/cert/cacert.pem' // CA证书路径 ]; $this->config = array_merge($defaultConfig, $config); $this->certPath = $this->config['cert_path']; // 验证APIv3密钥长度 $this->validateApiV3Key(); // 创建证书目录并确保权限 $this->prepareDirectories(); } /** * 准备目录并确保权限 */ private function prepareDirectories() { // 创建证书目录 if (!is_dir($this->certPath)) { if (!mkdir($this->certPath, 0755, true)) { throw new Exception('无法创建证书目录: ' . $this->certPath); } } // 检查证书目录权限 if (!is_writable($this->certPath)) { throw new Exception('证书目录不可写: ' . $this->certPath); } // 确保CA证书目录可写 $caCertDir = dirname($this->config['ca_cert_path']); if (!i…

【PHP】bc系列函数（高精度数学运算）
type: item
date: 2025-08-18T14:28:06+08:00
description: PHP bc系列函数（高精度数学运算）简介：bc系列函数用于处理任意精度的十进制计算，适用于金融、科学计算等对精度要求极高的场景。需启用bcmath扩展（可通过phpinfo()检查是否启用）。特点：所有参数和返回值均为字符串类型（避免精度丢失）支持自定义小数位数（scale参数）提供基本运算、比较、幂运算等完整功能一、基础运算函数1. 加法：bcadd()// 语法：bcadd(左操作数, 右操作数, 保留小数位数) echo bcadd('123.456', '78.9', 2); // 202.36（123.456 + 78.9 = 202.356，保留2位小数） echo bcadd('100', '200', 0); // 300（整数相加）2. 减法：bcsub()// 语法：bcsub(被减数, 减数, 保留小数位数) echo bcsub('100.5', '30.25', 1); // 70.2（100.5 - 30.25 = 70.25，保留1位小数） echo bcsub('50', '75', 0); // -25（负数结果）3. 乘法：bcmul()// 语法：bcmul(乘数1, 乘数2, 保留小数位数) echo bcmul('2.5', '4.2', 2); // 10.50（2.5 × 4.2 = 10.5，保留2位小数） echo bcmul('100', '0.01', 0); // 1（整数与小数相乘）4. 除法：bcdiv()// 语法：bcdiv(被除数, 除数, 保留小数位数) echo bcdiv('10', '3', 3); // 3.333（10 ÷ 3 ≈ 3.3333...，保留3位） var_dump(bcdiv('5', '0', 0)); // false（除数为0时返回false）5. 取模（余数）：bcmod()// 语法：bcmod(被除数, 除数) echo bcmod('10', '3'); // 1（10 ÷ 3 余数为1） echo bcmod('7.5', '2.5'); // 0.0（7.5 是 2.5 的整数倍）二、比较函数bccomp()// 语法：bccomp(值1, 值2, 比较精度) // 返回值：1（值1 > 值2）、0（相等）、-1（值1 < 值2） echo bccomp('10', '10', 0); // 0（相等） echo bccomp('10.5', '10.49', 1); // 1（10.5 > 10.49，精确到1位小数） echo bccomp('5.999', '6', 2); // -1（5.999 < 6，精确到2位小数）三、幂运算与开方1. 幂运算：bcpow()// 语法：bcpow(底数, 指数, 保留小数位数) echo bcpow('2', '3', 0); // 8（2³ = 8） echo bcpow('1.2', '2', 2); // 1.44（1.2² = 1.44）2. 幂运算取模：bcpowmod()// 语法：bcpowmod(底数, 指数, 模数, 保留小数位数) // 作用：(base^exponent) % modulus，比先算幂再取模更高效 echo bcpowmod('3', '3', '5', 0); // 2（3³=27，27%5=2）3. 开平方：bcsqrt()// 语法：bcsqrt(数值, 保留小数位数) echo bcsqrt('25', 0); // 5（√25 = 5） echo bcsqrt('2', 4); // 1.4142（√2 ≈ 1.4142，保留4位） var_dump(bcsqrt('-4', 0)); // false（负数无法开平方）四、全局配置函数bcscale()// 功能：设置所有bc函数的默认小数位数（全局生效） bcscale(2); // 全局默认保留2位小数 echo bcadd('1', '2'); // 3.00（使用全局配置） echo bcsub('5', '3.5'); // 1.50（自动补全2位小数） echo bcadd('1', '2', 0); // 3（局部参数优先级高于全局）关键注意事项参数类型：必须传入字符串（如'123.45'），而非数字（避免自动转换导致精度丢失）。返回值：始终为字符串，需转换类型时用(float)或(int)。扩展依赖：需在php.ini中启用extension=bcmath（重启服务生效）。精度优先级：函数的scale参数 > bcscale()全局配置。通过这些函数，PHP可以实现高精度计算，解决普通数值类型精度不足的问题。

【开发基础】nginx/postgresql/php/redis/ssdb的启动/关闭/重启命令及配置文件修改
type: item
date: 2025-07-30T21:53:51+08:00
description: 以下是 Nginx、PostgreSQL、PHP、Redis 和 SSDB 在 Linux 系统下的常用管理命令及配置文件位置总结：1. Nginx启动/关闭/重启# 使用 systemd（CentOS 7+/Ubuntu 16.04+） systemctl start nginx # 启动 systemctl stop nginx # 停止 systemctl restart nginx # 重启 systemctl reload nginx # 重新加载配置 systemctl status nginx # 查看状态 # 使用 service（旧版系统） service nginx start|stop|restart|reload # 直接调用 nginx 命令（需 root 权限） nginx # 启动 nginx -s stop # 快速停止 nginx -s quit # 优雅停止 nginx -s reload # 重新加载配置配置文件主配置文件：/etc/nginx/nginx.conf站点配置目录：/etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/修改后检查配置并重启：nginx -t # 检查配置语法 systemctl reload nginx # 重新加载配置2. PostgreSQL启动/关闭/重启# 使用 systemd systemctl start postgresql-<版本号> # 启动（如：postgresql-14） systemctl stop postgresql-<版本号> # 停止 systemctl restart postgresql-<版本号> # 重启 systemctl status postgresql-<版本号> # 查看状态 # Ubuntu/Debian 通用命令 systemctl start|stop|restart postgresql # 手动控制（需切换到 postgres 用户） sudo -u postgres pg_ctl -D /var/lib/pgsql/<版本号>/data start|stop|restart配置文件主配置文件：/var/lib/pgsql/<版本号>/data/postgresql.conf认证配置：/var/lib/pgsql/<版本号>/data/pg_hba.conf修改后重启服务：systemctl restart postgresql-<版本号>3. PHP-FPM启动/关闭/重启# 使用 systemd（PHP-FPM 通常作为 FastCGI 进程管理器） systemctl start php-fpm # 启动（CentOS/RHEL） systemctl start php<版本号>-fpm # 启动（Ubuntu/Debian，如：php8.1-fpm） systemctl stop|restart|status php-fpm # 直接调用 php-fpm 命令 php-fpm -D # 后台启动 php-fpm -t # 检查配置语法 kill -USR2 `cat /run/php-fpm.pid` # 优雅重启配置文件主配置文件：/etc/php-fpm.conf 或 /etc/php/<版本号>/fpm/php-fpm.conf池配置目录：/etc/php-fpm.d/ 或 /etc/php/<版本号>/fpm/pool.d/PHP .ini 文件：/etc/php.ini 或 /etc/php/<版本号>/fpm/php.ini修改后重启服务：systemctl restart php-fpm4. Redis启动/关闭/重启# 使用 systemd systemctl start redis # 启动 systemctl stop redis # 停止 systemctl restart redis # 重启 systemctl status redis # 查看状态 # 手动启动（需指定配置文件） redis-server /etc/redis.conf # 前台启动 redis-server /etc/redis.conf & # 后台启动 # 关闭 Redis（通过客户端） redis-cli shutdown配置文件主配置文件：/etc/redis.conf修改后重启服务：systemctl restart redis5. SSDB启动/关闭/重启# 使用 systemd（需手动创建 service 文件） systemctl start ssdb # 启动 systemctl stop ssdb # 停止 systemctl restar…

【开发基础】macOS系统的常规使用方法
type: item
date: 2025-07-30T21:49:00+08:00
description: 一、触控板使用技巧双指操作双指滑动：实现页面上下滚动双指开合：进行缩放操作双指左右滑动：在浏览器或桌面空间之间进行切换三指操作三指上推：显示所有打开的应用程序三指下滑：隐藏当前应用程序，显示桌面三指左右滑动：在全屏应用程序之间进行切换四指操作四指捏合：打开Launchpad（应用程序启动器）四指展开：显示应用程序坞二、Homebrew包管理器Homebrew是macOS系统上常用的包管理器，可用于安装各种软件。安装Homebrew打开终端，执行以下命令：/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"常用brew命令brew install <package>：安装软件包brew uninstall <package>：卸载软件包brew upgrade <package>：升级软件包brew list：查看已安装的软件包brew search <package>：搜索软件包brew update：更新Homebrew自身brew doctor：检查Homebrew的状态三、macOS系统目录结构主要目录/Applications：这里存放的是用户安装的应用程序/System：包含系统文件，一般情况下不要对其进行修改/Users：用户主目录，例如/Users/your_username/Library：系统级别的资源库/usr：包含Unix工具和开发文件/tmp：临时文件目录，系统重启后该目录下的文件会被清除用户目录~/Documents：用于存放文档~/Downloads：下载文件的存放位置~/Desktop：桌面文件的存放处~/Pictures：图片文件的存放目录~/Movies：视频文件的存放目录~/Music：音乐文件的存放目录四、常用Linux命令（macOS基于Unix）文件操作ls：列出目录内容ls -l：以长格式显示文件和目录信息ls -a：显示包括隐藏文件在内的所有文件cd <directory>：切换到指定目录cd ..：返回上一级目录mkdir <directory>：创建新目录rm <file>：删除文件rm -r <directory>：递归删除目录及其内容cp <destination>：复制文件或目录mv <destination>：移动或重命名文件文件查看cat <file>：查看文件内容less <file>：分页查看文件内容head <file>：显示文件的开头部分tail <file>：显示文件的结尾部分权限管理chmod <permissions> <file>：修改文件权限chown <owner> <file>：修改文件所有者搜索grep <pattern> <file>：在文件中搜索指定模式find <directory> -name <pattern>：在目录中查找文件系统信息uname -a：显示系统信息df -h：查看磁盘使用情况free -h：查看内存使用情况top：显示正在运行的进程htop：一个更高级的进程查看器（需要先使用brew安装）网络ping <host>：测试与主机的连接ifconfig：显示网络接口信息curl <url>：下载URL内容wget <url>：下载文件（需要先使用brew安装）五、终端快捷键光标移动Ctrl + A：将光标移动到行首Ctrl + E：将光标移动到行尾Ctrl + F：光标向前移动一个字符Ctrl + B：光标向后移动一个字符历史命令Up Arrow：查看上一条命令Down Arrow：查看下一条命令Ctrl + R：搜索历史命令其他Ctrl + L：清屏Ctrl + C：中断当前命令Ctrl + D：退出终端会话六、其他实用技巧截图Command + Shift + 3：截取整个屏幕Command + Shift + 4：截取屏幕的一部分Command + Shift + 5：打开截图工具（可录制屏幕）快速操作Command + Tab：在应用程序之间进行切换Command + Space：打开Spotlight搜索Option + Click：在应用程序坞中查看应用程序的所有窗口Command + H：隐藏当前应用程序Command + Q：退出当前应用程序

【PHP】ThinkPHP8数据库迁移示例
type: item
date: 2025-07-26T16:27:00+08:00
description: 以下是一个包含 各种字段类型、约束条件、索引和特殊配置 的ThinkPHP8数据库迁移示例（以products产品表为例），覆盖常见场景：迁移文件示例（database/migrations/20250726153000_create_products_table.php）<?php use think\migration\Migrator; use think\migration\db\Column; class CreateProductsTable extends Migrator { /** * 执行迁移（创建表结构） */ public function change() { // 创建products表，配置表级参数 $table = $this->table('products', [ 'engine' => 'InnoDB', // 数据库引擎 'charset' => 'utf8mb4', // 字符集 'collation' => 'utf8mb4_unicode_ci', // 排序规则 'comment' => '产品表（包含多种字段类型示例）', // 表注释 'auto_increment' => 1000, // 自增ID起始值（MySQL支持） ]); // 字段定义（覆盖各种场景） $table // 1. 自增主键（整数型，无符号，自增） ->addColumn('id', 'integer', [ 'identity' => true, // 自增 'unsigned' => true, // 无符号（只存正数） 'comment' => '产品ID（主键）' ]) // 2. 字符串（有限长度，非空，唯一索引） ->addColumn('sku', 'string', [ 'limit' => 50, // 长度限制 'null' => false, // 非空（默认） 'comment' => '产品SKU（唯一标识）', 'unique' => true // 唯一约束 ]) // 3. 字符串（长文本，可空，带默认值） ->addColumn('name', 'string', [ 'limit' => 255, 'null' => false, 'default' => '', // 默认空字符串 'comment' => '产品名称' ]) // 4. 文本类型（无长度限制，可空） ->addColumn('description', 'text', [ 'null' => true, // 允许为空 'comment' => '产品详细描述' ]) // 5. 小数类型（高精度，带默认值） ->addColumn('price', 'decimal', [ 'precision' => 10, // 总位数 'scale' => 2, // 小数位数 'default' => 0.00, // 默认0.00 'comment' => '产品售价' ]) // 6. 整数类型（无符号，默认值，索引） ->addColumn('stock', 'integer', [ 'unsigned' => true, // 无符号（只存正数） 'default' => 0, // 默认库存0 'comment' => '库存数量', 'index' => true // 普通索引 ]) // 7. 枚举类型（固定可选值） ->addColumn('status', 'enum', [ 'values' => ['draft', 'active', 'disabled'], // 可选值 'default' => 'draft', // 默认草稿状态 'comment' => '产品状态（draft:草稿, active:上架, disabled:下架）' ]) // 8. 布尔类型（tinyint，默认true） ->addColumn('is_recommend', 'boolean', [ 'default' => true, // 默认true（1） 'comment' => '是否推荐（1:是, 0:否）' ]) // 9. 外键关联（整数，无符号，级联操作） ->addColumn('category_id', 'integer', [ 'unsigned' => true, 'null' => false, 'comment' => '所属分类ID', 'index' => true // 普通索引 ]) // 10. JSON类型（存储复杂结构，可空） ->addColumn('tags', 'json', [ 'null' => true, 'comment' => '产品…

【PHP】ThinkPHP8 数据库迁移与数据填充完全指南
type: item
date: 2025-07-26T10:25:00+08:00
description: ThinkPHP8 数据库迁移与数据填充完全指南（官方文档补充版）一、安装与配置1. 安装迁移扩展composer require topthink/think-migration2. 配置文件说明配置文件位于 config/database.php默认迁移表名：think_migration支持多数据库连接3. 环境要求PHP >= 8.1ThinkPHP >= 8.0建议使用 InnoDB 引擎（支持事务）二、迁移文件操作1. 创建迁移文件# 创建基础迁移文件 php think migrate:create CreateUsersTable # 创建带表名的迁移文件（自动生成基础结构） php think migrate:create AddEmailToUsersTable --table=users # 指定数据库连接 php think migrate:create CreateLogsTable --connection=log2. 迁移文件结构生成的迁移文件位于 database/migrations，示例：<?php use think\migration\Migrator; use think\migration\db\Column; class CreateUsersTable extends Migrator { /** * 执行迁移（向上操作） */ public function up() { $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50]) ->addColumn('email', 'string', ['limit' => 100, 'unique' => true]) ->addColumn('password', 'string', ['limit' => 100]) ->addTimestamps() // 自动添加 create_time 和 update_time 字段 ->create(); } /** * 回滚迁移（向下操作） */ public function down() { $this->dropTable('users'); } }三、常用字段类型字段类型描述示例用法integer整数类型->addColumn('age', 'integer')biginteger大整数类型->addColumn('user_id', 'biginteger')string字符串类型->addColumn('name', 'string', ['limit' => 50])text长文本类型->addColumn('content', 'text')datetime日期时间类型->addColumn('created_at', 'datetime')timestamp时间戳类型->addColumn('updated_at', 'timestamp')boolean布尔类型->addColumn('status', 'boolean', ['default' => 0])decimal高精度小数->addColumn('price', 'decimal', ['precision' => 10, 'scale' => 2])enum枚举类型->addColumn('gender', 'enum', ['values' => ['male', 'female', 'other']])四、表结构操作1. 创建表public function up() { $table = $this->table('users', [ 'engine' => 'InnoDB', 'charset' => 'utf8mb4', 'comment' => '用户表', 'collation' => 'utf8mb4_unicode_ci' ]); $table->addColumn('id', 'integer', ['identity' => true]) // 自增ID（默认主键） ->addColumn('username', 'string', ['limit' => 30]) ->addColumn('email', 'string', ['limit' => 100, 'unique' => true]) ->addColumn('password', 'string', ['limit' => 100]) ->addColumn('status', 'boolean', ['default' => 1]) ->addIndex(['username']) // 普通索引 ->ad…

【ThinkPHP】创建有背景的微信小程序二维码
type: item
date: 2025-05-17T11:21:27+08:00
description: <?php namespace app\common\lib\wechat; use think\Exception; use think\facade\Cache; use think\facade\Request; use think\Image; use think\facade\Db; class QrCode extends Basic { // 小程序页面路径 private string $path = "pages/myCenter/invite"; // 小程序码保存路径 private string $savePath = "./storage/qrcode/"; // 二维码参数 private string $param = ""; public function __construct(string $path = "", string $field = "", string $param = "", int $width = 430) { if (!empty($path) && empty($field)) { $this->path = $path; } if (!empty($path) && !empty($field) && !empty($param)) { $this->path = "{$path}?{$field}={$param}"; } $this->param = $param; } /** * 生成小程序码并可选择合并背景图 * * @param string $backgroundPath 背景图路径 * @param int $qrWidth 二维码在背景图上的宽度位置 * @param int $qrHeight 二维码在背景图上的高度位置 * @return string 生成后的二维码URL */ public function setQrcode(string $backgroundPath = '', int $qrWidth = 160, int $qrHeight = 530): string { try { // 获取访问令牌 $accessToken = Cache::get('accesstoken'); if (empty($accessToken)) { $accessToken = (new AccessToken())->getAccesToken(); Cache::set('accesstoken', $accessToken, 7200); // 假设token有效期为2小时 } // 请求小程序码 $url = "https://api.weixin.qq.com/wxa/getwxacode?access_token={$accessToken}"; $data = [ 'path' => $this->path, 'scene' => 'type=qrcode', 'width' => 430, ]; $result = $this->curlPost($url, $data, 'POST'); if ($result === false || isset($result['errcode'])) { throw new Exception("Failed to get QR code: " . json_encode($result)); } // 保存二维码到文件 $fileName = md5($this->param); $directory = $this->savePath . date('Ymd') . '/'; if (!$this->createDirectory($directory)) { throw new Exception("目录创建失败: {$directory}"); } $filePath = "{$directory}{$fileName}.png"; if (!file_put_contents($filePath, $result)) { throw new Exception("文件写入失败: {$filePath}"); } // 生成完整URL $fullDomain = (new \app\common\lib\data\Str())->getFullDomain(); $qrcodeUrl = $fullDomain . ltrim($filePath, '.'); // 合并背景图（如果提供） if (!empty($backgroundPath)) { return $this->mergeWithBackground($backgroundPath, $filePath, $…

【PHP】PHPExcel 使用手册
type: item
date: 2025-05-13T15:20:21+08:00
description: PHPExcel 是一个用于操作 Microsoft Excel 格式文件的 PHP 库，它支持读取和写入多种格式（如 .xls, .xlsx, .csv 等）。不过需要注意，PHPExcel 项目已停止维护，推荐使用其继任者 PhpSpreadsheet。以下是 PHPExcel 的基本使用指南：1. 安装 PHPExcel# 使用 Composer 安装（推荐） composer require phpoffice/phpexcel2. 读取 Excel 文件require 'vendor/autoload.php'; use PHPExcel_IOFactory; // 读取文件 $inputFileName = 'example.xlsx'; $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); // 获取第一个工作表 $sheet = $objPHPExcel->getActiveSheet(); // 获取最高行和最高列 $highestRow = $sheet->getHighestRow(); $highestColumn = $sheet->getHighestColumn(); // 遍历数据 for ($row = 1; $row <= $highestRow; $row++) { for ($col = 'A'; $col <= $highestColumn; $col++) { $cellValue = $sheet->getCell($col.$row)->getValue(); echo "Row $row, Column $col: $cellValue\n"; } }3. 创建新的 Excel 文件require 'vendor/autoload.php'; use PHPExcel; use PHPExcel_IOFactory; // 创建新的 PHPExcel 对象 $objPHPExcel = new PHPExcel(); // 设置文档属性 $objPHPExcel->getProperties() ->setCreator("Your Name") ->setTitle("Sample Excel File"); // 获取活动工作表 $sheet = $objPHPExcel->getActiveSheet(); // 设置单元格值 $sheet->setCellValue('A1', 'Hello'); $sheet->setCellValue('B1', 'World!'); $sheet->setCellValue('A2', 'This is a sample spreadsheet.'); // 保存为 .xlsx 文件 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('new_file.xlsx');4. 设置样式// 设置字体样式 $sheet->getStyle('A1')->getFont() ->setName('Arial') ->setSize(14) ->setBold(true) ->setColor(new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_RED)); // 设置单元格背景色 $sheet->getStyle('A1')->getFill() ->setFillType(PHPExcel_Style_Fill::FILL_SOLID) ->getStartColor()->setARGB('FFEEEEEE'); // 设置对齐方式 $sheet->getStyle('A1')->getAlignment() ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 设置列宽 $sheet->getColumnDimension('A')->setWidth(20);5. 合并单元格// 合并 A1 到 B1 的单元格 $sheet->mergeCells('A1:B1'); // 取消合并 $sheet->unmergeCells('A1:B1');6. 处理日期格式// 设置日期值（PHPExcel 使用 Excel 时间戳格式） $dateTime = new DateTime(); $sheet->se…

【PHP】PHP实现无限级树形分类 树形分类 如果子集的pid不是空，父级id不存在，则子集不展示
type: item
date: 2025-05-07T16:31:33+08:00
description: /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/12/17 22:27 * @param $arr * @param $id * @param $pid * @return array * @Description:树形分类 如果子集的pid不是空，父级id不存在，则子集不展示 */ public function getTreeByDateDelChile($arr,$id,$pid) { $items = []; foreach($arr as $v){ $items[$v[$id]] = $v; } $tree = []; foreach($items as $k => $item){ if($item[$pid] &&!isset($items[$item[$pid]])){ unset($items[$k]); continue; } if(isset($items[$item[$pid]])){ $items[$item[$pid]]['child'][] = &$items[$k]; }else{ $tree[] = &$items[$k]; } } return $tree; } /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/9/14 16:59 * @param array $arr * @param string $children * @return array * @Description:将树形数组转换成一维数组 */ public function setManyTosingle(array $arr = [], string $children = 'child'): array { $result = []; foreach ($arr as $item) { // 先将当前节点添加到结果数组中 $newItem = $item; if (isset($newItem[$children])) { unset($newItem[$children]); } $result[] = $newItem; // 递归处理子节点 if (isset($item[$children]) && is_array($item[$children])) { $result = array_merge($result, $this->setManyTosingle($item[$children], $children)); } } return $result; }

【PHP】清空MySQL数据，索引重置
type: item
date: 2025-05-06T10:23:08+08:00
description: <?php // 定义排除表的常量 const EXCLUDE_TABLES = [ 'web_admin_company', 'web_admin_func', 'web_admin_role', 'web_admin_user', 'web_app_config', 'web_china_city', 'web_china_city_area', 'web_china_city_backup', 'web_company_config', 'web_shop_category', 'web_tppay', // 'web_shop_goods_tmpserver', ]; class SomeClass { public function truncateTables() { try { // 开启事务 Db::startTrans(); // 获取所有表名 $tables = Db::query('SHOW TABLES'); $tableNames = array_map('current', $tables); foreach ($tableNames as $tableName) { if (!in_array($tableName, EXCLUDE_TABLES)) { // 使用参数化查询清空表并重置索引 Db::execute("TRUNCATE TABLE `$tableName`"); echo "表 {$tableName} 已清空 "; } } // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); // 记录错误日志 error_log("发生错误: " . $e->getMessage()); echo "发生错误: " . $e->getMessage(); } } }