You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:58:07