PHP实现苹果产品查询API结果存库及最近搜索展示的方案咨询
PHP实现苹果设备查询缓存+最近搜索功能(开箱即用代码)
1. 先创建MySQL数据表
直接执行以下SQL建表,字段完全适配你给出的API返回结构:
CREATE TABLE `apple_device_records` ( `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', `serial_number` varchar(50) NOT NULL UNIQUE COMMENT '设备序列号', `model` varchar(255) NOT NULL COMMENT '设备型号', `activation_status` varchar(20) NOT NULL COMMENT '激活状态', `warranty_status` varchar(100) NOT NULL COMMENT '保修状态', `coverage_start_date` varchar(50) DEFAULT NULL COMMENT '保修开始日期', `estimated_purchase_date` varchar(50) DEFAULT NULL COMMENT '预估购买日期', `telephone_support_status` varchar(20) DEFAULT NULL COMMENT '电话技术支持状态', `repair_coverage_status` varchar(20) DEFAULT NULL COMMENT '维修服务状态', `repair_coverage_expire_date` varchar(50) DEFAULT NULL COMMENT '维修服务到期日期', `repair_coverage_expire_days` int DEFAULT NULL COMMENT '维修服务剩余天数', `applecare_eligible` varchar(10) DEFAULT NULL COMMENT '是否符合AppleCare资格', `valid_purchase_date` varchar(10) DEFAULT NULL COMMENT '购买日期是否有效', `registered_device` varchar(10) DEFAULT NULL COMMENT '是否为已注册设备', `replaced_by_apple` varchar(10) DEFAULT NULL COMMENT '是否为苹果替换设备', `is_loaner_device` varchar(10) DEFAULT NULL COMMENT '是否为借出设备', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '查询时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='苹果设备查询缓存表';
2. 核心PHP代码(原生写法,无框架依赖)
修改配置后即可直接使用,已经做了基础的SQL注入防护,避免重复调用付费API:
<?php // 数据库配置,改成自己的实际信息 $dbHost = '127.0.0.1'; $dbName = '你的数据库名'; $dbUser = '数据库用户名'; $dbPass = '数据库密码'; // 初始化PDO数据库连接 try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("数据库连接失败:" . $e->getMessage()); } /** * 从本地数据库查询设备信息 * @param string $serial 序列号 * @return array|false 查到返回设备数组,没查到返回false */ function getDeviceInfoFromDB(string $serial) { global $pdo; $stmt = $pdo->prepare("SELECT * FROM apple_device_records WHERE serial_number = ?"); $stmt->execute([$serial]); return $stmt->fetch(PDO::FETCH_ASSOC); } /** * 调用第三方付费API查询设备信息 * @param string $serial 序列号 * @return array|false 查询成功返回解析后的数组,失败返回false */ function getDeviceInfoFromApi(string $serial) { // 这里替换成你自己的API请求代码,示例用curl请求 $apiUrl = "你的API接口地址?serial=" . urlencode($serial); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $apiResult = curl_exec($ch); curl_close($ch); if (!$apiResult) return false; // 适配你给出的API返回格式,自动解析键值对 $data = []; $lines = explode("\n", trim($apiResult)); foreach ($lines as $line) { $line = trim($line); if (empty($line) || strpos($line, ':') === false) continue; list($key, $value) = explode(':', $line, 2); $data[trim($key)] = trim($value); } // 校验必要字段 if (empty($data['Serial Number'])) return false; return $data; } /** * 把API返回的设备信息存入本地数据库 * @param array $apiData 解析后的API返回数据 * @return bool 存储成功返回true */ function saveDeviceInfoToDB(array $apiData) { global $pdo; $stmt = $pdo->prepare("INSERT INTO apple_device_records ( serial_number, model, activation_status, warranty_status, coverage_start_date, estimated_purchase_date, telephone_support_status, repair_coverage_status, repair_coverage_expire_date, repair_coverage_expire_days, applecare_eligible, valid_purchase_date, registered_device, replaced_by_apple, is_loaner_device ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); return $stmt->execute([ $apiData['Serial Number'], $apiData['Model'] ?? '', $apiData['Activation Status'] ?? '', $apiData['Warranty Status'] ?? '', $apiData['Coverage Start Date'] ?? '', $apiData['Estimated Purchase Date'] ?? '', $apiData['Telephone Technical Support'] ?? '', $apiData['Repairs and Service Coverage'] ?? '', $apiData['Repairs and Service Expiration Date'] ?? '', intval($apiData['Repairs and Service Expires In'] ?? 0), $apiData['AppleCare Eligible'] ?? '', $apiData['Valid Purchase Date'] ?? '', $apiData['Registered Device'] ?? '', $apiData['Replaced by Apple'] ?? '', $apiData['Loaner Device'] ?? '' ]); } /** * 获取最近搜索记录 * @param int $limit 最多返回条数 * @return array 最近搜索列表 */ function getRecentSearches(int $limit = 20) { global $pdo; $stmt = $pdo->prepare("SELECT * FROM apple_device_records ORDER BY created_at DESC LIMIT ?"); $stmt->bindValue(1, $limit, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } // -------------------------- 业务逻辑使用示例 -------------------------- // 处理前端提交的查询请求 if (!empty($_POST['serial'])) { $serial = trim($_POST['serial']); // 优先查本地缓存,避免重复调用付费API $deviceInfo = getDeviceInfoFromDB($serial); if (!$deviceInfo) { // 本地无缓存,调用API查询 $apiData = getDeviceInfoFromApi($serial); if ($apiData) { saveDeviceInfoToDB($apiData); $deviceInfo = getDeviceInfoFromDB($serial); } else { echo "查询失败,请检查序列号是否正确"; exit; } } // 此处输出设备信息到前端页面即可 print_r($deviceInfo); } // 获取最近15条搜索记录,在「最近搜索」标签下输出即可 $recentSearchList = getRecentSearches(15); // print_r($recentSearchList); ?>
3. 注意事项
- 序列号加了唯一索引,同一个序列号只会调用一次API,不会重复扣费
- 最近搜索默认按查询时间倒序排序,返回条数可以自行修改
getRecentSearches的入参 - 不需要额外依赖,PHP环境开启curl、pdo_mysql扩展即可正常运行
内容的提问来源于stack exchange,提问作者ghilliedup
相关产品推荐
相关产品推荐

