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

MVC架构下如何从View向Controller传二维数组并存储到数据库

问题分析与解决方案

首先,你的代码里存在两个关键问题导致无法正确获取二维数组:

  1. 直接在URL中拼接数组变量$nilai时,PHP会自动将数组转为字符串"Array",所以Controller里$_GET['nilai']拿到的只是这个字符串,而非实际的数组数据。
  2. View里的数组元素a,b,c,d没有加引号,PHP会将它们视为未定义的常量,运行时会报错(除非你之前定义过这些常量)。

下面给出两种可行的解决方案,推荐第二种更安全的POST方式:


方案1:使用序列化传递数组(GET方式)

通过serialize()将数组序列化为字符串,再用urlencode()处理特殊字符,确保URL传递时不会出错,最后在Controller中反序列化还原数组。

修改View代码:

<?php 
$nilai = array( array(1,2,3,4), array('a','b','c','d') ); // 给字符串元素加上引号
$serializedNilai = urlencode(serialize($nilai));
?>
<a href="<?= BASEURL; ?>/penerima/tambah?nilai=<?= $serializedNilai ?>" class="btn btn-l btn-info">simpan</a>

修改Controller代码:

public function tambah() { 
    // 检查参数是否存在
    if (!isset($_GET['nilai'])) {
        header("Location: " . BASEURL . "/penerima");
        exit;
    }
    
    $serializedNilai = $_GET['nilai'];
    $nilai = unserialize(urldecode($serializedNilai));
    
    // 验证是否为有效数组
    if (is_array($nilai)) {
        $this->model('Penerima_model')->tambahData($nilai);
        // 处理完成后跳转回列表页
        header("Location: " . BASEURL . "/penerima");
        exit;
    } else {
        // 处理无效数据的情况
        echo "无效的数据格式";
    }
}

方案2:使用POST请求传递数组(推荐)

GET请求有长度限制,且数组数据暴露在URL中不够安全,更推荐用表单POST的方式传递数组。

修改View代码:

<?php $nilai = array( array(1,2,3,4), array('a','b','c','d') ); ?>
<form action="<?= BASEURL; ?>/penerima/tambah" method="POST">
    <?php 
    // 循环生成隐藏输入框,将二维数组的每个元素传递
    foreach ($nilai as $rowIndex => $row) {
        foreach ($row as $colIndex => $value) {
            echo '<input type="hidden" name="nilai['.$rowIndex.']['.$colIndex.']" value="'.htmlspecialchars($value).'">';
        }
    }
    ?>
    <button type="submit" class="btn btn-l btn-info">simpan</button>
</form>

修改Controller代码:

public function tambah() { 
    // 检查POST数组是否存在且有效
    if (!isset($_POST['nilai']) || !is_array($_POST['nilai'])) {
        header("Location: " . BASEURL . "/penerima");
        exit;
    }
    
    $nilai = $_POST['nilai'];
    $this->model('Penerima_model')->tambahData($nilai);
    
    // 处理完成后跳转回列表页
    header("Location: " . BASEURL . "/penerima");
    exit;
}

数据库存储建议

二维数组无法直接存入数据库,你需要将其转换为可存储的格式,推荐用JSON(比PHP序列化更通用,跨语言兼容):

修改Model中的tambahData方法示例:

public function tambahData($nilai) {
    // 将二维数组转为JSON字符串
    $jsonNilai = json_encode($nilai);
    
    // 执行插入操作(这里假设你的数据库表有一个`nilai_data`字段存储JSON)
    $sql = "INSERT INTO penerima (nilai_data) VALUES (?)";
    $stmt = $this->db->prepare($sql);
    $stmt->execute([$jsonNilai]);
    
    return $stmt->rowCount() > 0;
}

当需要读取数据时,用json_decode()将JSON字符串转回数组即可。

内容的提问来源于stack exchange,提问作者Diyona Amelia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:24