MVC架构下如何从View向Controller传二维数组并存储到数据库
问题分析与解决方案
首先,你的代码里存在两个关键问题导致无法正确获取二维数组:
- 直接在URL中拼接数组变量
$nilai时,PHP会自动将数组转为字符串"Array",所以Controller里$_GET['nilai']拿到的只是这个字符串,而非实际的数组数据。 - 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
相关产品推荐
相关产品推荐

