Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 存储长度未知的数组_Php_Mysql_Sql_Arrays_Serialization - Fatal编程技术网

Php 存储长度未知的数组

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的一部分

我让我的用户在HTML表单中添加数字输入,并用值填充它们。表单在提交时被序列化并发送到一个PHP文件,该文件使用PDO将数据插入MySQL数据库。数据库表有一组列用于存储表单中的其他值,但用于存储用户添加的输入的列设置如下:

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