PHP语法错误排查及多树莓派CSV转HTML表格技术咨询
咱们一步步来解决你的两个PHP问题:先搞定那个解析错误,再完善多树莓派CSV整合的脚本。
一、解决PHP Parse Error: Unexpected 'const' 错误
这个报错本质是const的写法不符合PHP语法规范,我帮你列几个最常见的坑和排查方向:
1. 全局
const的版本兼容性问题
PHP 5.3之后才支持在全局作用域直接用const定义常量,如果你用的是5.3之前的老版本,必须换成define()。举个例子:// 错误(PHP <5.3不支持) const MAX_TIMEOUT = 30; // 兼容所有版本的正确写法 define('MAX_TIMEOUT', 30);2. 前一行代码漏了分号
这是最容易踩的坑!比如前一个变量声明或者函数调用没加;,PHP会把下一行的const当成上一行的一部分,直接报错。比如:// 错误:$config后面没加分号 $config = require 'config.php' const SSH_USER = 'pi'; // 正确:补上分号就好 $config = require 'config.php'; const SSH_USER = 'pi';3. 函数/方法内部用
const
PHP不允许在函数或者类的方法里面用const定义常量,如果需要在函数内定义,改用define():// 错误写法 function connectPi() { const PI_HOST = '192.168.1.10'; } // 正确写法 function connectPi() { define('PI_HOST', '192.168.1.10'); }4. 类内部
const的语法错误
如果是在类里定义const,要确保它的位置正确,而且前面的成员变量/方法声明都加了分号:// 错误:$username后面没分号 class PiConnector { public $username = 'pi' const DEFAULT_PORT = 22; } // 正确:补上分号 class PiConnector { public $username = 'pi'; const DEFAULT_PORT = 22; }
二、多树莓派CSV数据整合为HTML表格的完整实现
基于你给出的脚本片段,我帮你完善了整个流程,包括SSH登录树莓派、读取CSV、解析数据、生成美观的HTML表格:
完整脚本代码
<?php require_once 'Net/SSH2.php'; require_once 'phpseclib1.0.10/Crypt/RSA.php'; // 加载多台树莓派的配置文件 // config.php的示例内容(返回一个数组): // return [ // [ // 'host' => '192.168.1.10', // 树莓派IP // 'user' => 'pi', // SSH用户名 // 'private_key' => '/home/your-user/.ssh/id_rsa', // 本地私钥路径 // 'csv_path' => '/home/pi/logs/record.csv' // 树莓派上CSV的绝对路径 // ], // // 可以添加更多树莓派的配置 // ]; $piConfigs = require 'config.php'; // 存储所有树莓派的CSV数据 $allCsvData = []; // 遍历每台树莓派,读取并解析CSV foreach ($piConfigs as $pi) { $ssh = new Net_SSH2($pi['host']); $key = new Crypt_RSA(); // 加载私钥(如果私钥有密码,需要先调用$key->setPassword('your-passphrase')) $key->loadKey(file_get_contents($pi['private_key'])); // 尝试SSH登录 if (!$ssh->login($pi['user'], $key)) { $allCsvData[] = [ 'pi_host' => $pi['host'], 'status' => 'SSH登录失败', 'data' => [] ]; continue; } // 远程读取CSV文件内容 $csvContent = $ssh->exec("cat {$pi['csv_path']}"); if (empty(trim($csvContent))) { $allCsvData[] = [ 'pi_host' => $pi['host'], 'status' => 'CSV文件为空或不存在', 'data' => [] ]; continue; } // 解析CSV内容(按行分割,再拆分字段) $rows = explode("\n", trim($csvContent)); $csvRows = []; foreach ($rows as $row) { $row = trim($row); if (empty($row)) continue; $fields = explode(',', $row); // 匹配你给出的CSV格式:时间戳、文件名、数值 if (count($fields) === 3) { $csvRows[] = [ 'timestamp' => $fields[0], 'filename' => $fields[1], 'value' => $fields[2] ]; } else { // 记录无效行 $csvRows[] = ['invalid_row' => $row]; } } $allCsvData[] = [ 'pi_host' => $pi['host'], 'status' => '读取成功', 'data' => $csvRows ]; } // 生成HTML表格页面 ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>多树莓派CSV数据整合</title> <style> body { font-family: Arial, sans-serif; margin: 20px; } .pi-group { margin: 30px 0; padding: 15px; border: 1px solid #eee; border-radius: 8px; } table { border-collapse: collapse; width: 100%; margin-top: 10px; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f5f5f5; } .success { color: #2ecc71; } .error { color: #e74c3c; } .invalid { color: #f39c12; } </style> </head> <body> <h1>多树莓派CSV数据整合结果</h1> <?php foreach ($allCsvData as $piItem): ?> <div class="pi-group"> <h2>设备: <?php echo htmlspecialchars($piItem['pi_host']); ?></h2> <p class="<?php echo $piItem['status'] === '读取成功' ? 'success' : 'error'; ?>"> 状态: <?php echo htmlspecialchars($piItem['status']); ?> </p> <?php if (!empty($piItem['data'])): ?> <table> <thead> <tr> <th>时间戳</th> <th>文件名</th> <th>数值</th> <th>行状态</th> </tr> </thead> <tbody> <?php foreach ($piItem['data'] as $row): ?> <tr> <?php if (isset($row['invalid_row'])): ?> <td colspan="4" class="invalid">无效行: <?php echo htmlspecialchars($row['invalid_row']); ?></td> <?php else: ?> <td><?php echo htmlspecialchars($row['timestamp']); ?></td> <td><?php echo htmlspecialchars($row['filename']); ?></td> <td><?php echo htmlspecialchars($row['value']); ?></td> <td>有效</td> <?php endif; ?> </tr> <?php endforeach; ?> </tbody> </table> <?php endif; ?> </div> <?php endforeach; ?> </body> </html>
几个关键注意点
- config.php配置:一定要确保每个树莓派的配置信息准确,尤其是私钥路径和CSV文件路径。
- 私钥权限:本地的私钥文件权限要设置为
600(Linux/macOS),否则PHP可能无法读取,或者SSH服务器会拒绝连接。 - CSV格式兼容:如果你的CSV字段里包含逗号,建议改用
fgetcsv解析(需要先把远程CSV下载到本地临时文件),当前脚本的explode(',')只适用于字段不含逗号的情况。 - 错误扩展:脚本里已经处理了登录失败和文件为空的情况,你可以根据需求添加更多异常处理,比如SSH连接超时、权限不足等。
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

