Php 存储长度未知的数组
我让我的用户在HTML表单中添加数字输入,并用值填充它们。表单在提交时被序列化并发送到一个PHP文件,该文件使用PDO将数据插入MySQL数据库。数据库表有一组列用于存储表单中的其他值,但用于存储用户添加的输入的列设置如下:Php 存储长度未知的数组,php,mysql,sql,arrays,serialization,Php,Mysql,Sql,Arrays,Serialization,我让我的用户在HTML表单中添加数字输入,并用值填充它们。表单在提交时被序列化并发送到一个PHP文件,该文件使用PDO将数据插入MySQL数据库。数据库表有一组列用于存储表单中的其他值,但用于存储用户添加的输入的列设置如下: input_value_1 input_value_2 input_value_3 input_value_4 ... ... input_value_10 这些列允许NULL,因为我不知道用户是否会添加任何数字输入 有没有更好的方法来存储这些数字 下面是我的JS的一部分
input_value_1
input_value_2
input_value_3
input_value_4
...
...
input_value_10
这些列允许NULL
,因为我不知道用户是否会添加任何数字输入
有没有更好的方法来存储这些数字
下面是我的JS的一部分,用于获取表单数据并发送到landowner.php,后者将值插入我的数据库。代码没有输入的数字(我还没有添加它们,因为我不确定应该如何存储它们的数据)
下面是LandOwners.php的一部分,它插入mydatabase时没有输入数字(我还没有添加它们,因为我不确定如何/如果应该添加)
下面是LandOwners.php从我的数据库中选择数据的部分。我希望(仍然能够)以JSON的形式获得结果
$arr = [];
if (isset($_POST["land_owner_id"])){
$stmt = $pdo->prepare("SELECT * FROM land_owner WHERE land_owner_id = ?");
$stmt->execute([$land_owner_id]);
} else {
$stmt = $pdo->prepare("SELECT * FROM land_owner");
$stmt->execute();
}
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$arr[] = $row;
}
if(!$arr) exit('No rows');
echo json_encode($arr);
$stmt = null;
break;
也许您有一个列,json类型,并在其中存储json 比如:
CREATE TABLE IF NOT EXISTS some_table
(
`json` JSON NOT NULL
) COLLATE='utf8_general_ci' ENGINE=InnoDB;
然后,您可以将JSON存储到此列,如:
{"input_value_1":1, "input_value_2",...."input_value_10":10}
您可以使用JSON_EXTRACT轻松获取单个值(假设它们始终具有相同的键):
SELECT JSON_EXTRACT(json,'$.input_value_'.$x) FROM some_table WHERE some_condition
如果您发现自己的表格上有
column1
,column2
,那么很可能您的设计有缺陷,您应该创建一个单独的表格,每个columnX
都有自己的一行。如果您发现自己在同一个表上有多个重复列,那么(几乎)最好有一个单独的表
这样,就可以避免在列中存储逗号分隔的值,如果突然需要引入另一个值列{X+1}
,就可以避免中断代码/查询,并且可以根据需要使用任意多或任意少的输入值
对于您来说,这类似于一个名为land\u owner\u input
的新表,在该表中,您有值(将放入columnX
),并引用值所属的land\u owner
中的行
典型的设计模式是这样的
CREATE TABLE land\u owner\u输入(
土地所有者输入id INT(11)自动增量
土地所有者id INT(11),
土地所有者输入值VARCHAR(最大值)
);
请记住,新表中的land\u owner\u id
的类型和大小应与其引用的id完全相同
您还可以在land\u owner\u id
和land\u owner
表的id之间创建外键约束,以确保数据完整性
一旦有了新表,就可以使用左联接
(或者如果只想在有输入值的情况下返回行,则可以使用普通的联接
)将它们一起查询
选择*
来自土地所有者(作为lo)
左连接土地所有者输入为loi
在loi.land\u owner\u id=lo.land\u owner\u id上
是的,您应该有一个表,其中包含值以及与它们相关的任何内容的关系-更简单的行而不是许多重复的列更好。@Qirel所以我应该用一个名为input\u values
的新列替换这十列,并用外键将其与一个新表关联?如果这是正确的,那么如果有人添加了15个输入,input\u值
应该是什么样子,新表应该如何构造?谢谢@Qirel我已经用我的当前代码更新了我的问题。必须如何更改?创建一个land\u owner\u输入
,并将所有输入放在单独的行中,参考land\u owner
的唯一标识符(可能是ID)。看起来很棒!这样,你就可以为每个土地所有者
提供无止境的、未指定数量的输入。我已经用我的当前代码更新了我的问题。要怎么改变呢?谢谢你的回答,我真的很感谢你的时间和帮助!我正在使用您的解决方案来存储我的数据,但我已经为一个与此相关的问题挣扎了好几个小时。你能看一下吗?
{"input_value_1":1, "input_value_2",...."input_value_10":10}
SELECT JSON_EXTRACT(json,'$.input_value_'.$x) FROM some_table WHERE some_condition