存储未知长度的数组



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

input_value_1
input_value_2
input_value_3
input_value_4
...
...
input_value_10

这些列允许NULL,因为我不知道用户是否会添加任何数字输入。

有没有更好的方法来存储这些数字?

下面是我的JS中用于获取表单数据并发送给LandOwners的部分.php它将值插入到我的数据库中。代码没有数字输入(我还没有添加它们,因为我不确定应该如何存储它们的数据)。

$("#createLandOwnerForm").on( "submit", function( event ) {
event.preventDefault();
createLandOwner($(this).serialize(), appendCreatedLandOwnerToSelect, appendCreatedLandOwnerToSelect_Error);
$('#createLandOwnerForm')[0].reset();
});
function createLandOwner(landOwner, onSuccess, onError) {    
var data = landOwner + "&action=create";
$.ajax({
type: "post",
url: host + 'LandOwners.php',
data: data,
success: onSuccess,
error: onError
});
}

下面是土地所有者的部分.php它插入到我的数据库中没有数字输入(我还没有添加它们,因为我不确定我应该如何/是否应该)。

$stmt = $pdo->prepare("INSERT INTO land_owner (land_owner_name, land_owner_identification_number, land_owner_contact, land_owner_phone, land_owner_email, land_contracts) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->execute([$land_owner_name, $land_owner_identification_number, $land_owner_contact, $land_owner_phone, $land_owner_email, $land_contracts]);
$last_inserted_land_owner_id = $pdo->lastInsertId();
$stmt = $pdo->prepare("SELECT * FROM land_owner WHERE land_owner_id = ?");
$stmt->execute([$last_inserted_land_owner_id]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$arr[] = $row;
}
if(!$arr) exit('No rows');
echo json_encode($arr);
$stmt = null;

下面是土地所有者的部分.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;

如果您发现自己处于开始column1的情况,column2在桌子上 - 很可能您的设计有缺陷,您应该创建一个单独的表 - 每个columnX都有自己的一行。如果您发现自己在同一表上有多个重复列,那么(几乎)最好有一个单独的表。

这样,您可以避免在列中存储逗号分隔的值,避免在突然必须引入另一个值column{X+1}时中断代码/查询 - 而是可以根据需要具有任意多或尽可能少的输入值。

对你来说,这就像一个名为land_owner_input的新表,其中你有值(你会放在columnX中),以及对值所属的行的引用land_owner

典型的设计模式是这样的。

CREATE TABLE land_owner_input (
land_owner_input_id INT(11) AUTO_INCREMENT
land_owner_id INT(11), 
land_owner_input_value VARCHAR(MAX)
);

请记住,新表中的land_owner_id应与其引用的 ID 具有完全相同的类型和大小。

您还可以在land_owner_idland_owner表的 ID 之间创建外键约束,以确保数据完整性。

有了新表后,可以使用LEFT JOIN(如果只想在具有输入值时返回行,则可以使用普通JOIN)一起查询它们。

SELECT *
FROM land_owner AS lo
LEFT JOIN land_owner_input AS loi
ON loi.land_owner_id = lo.land_owner_id 

也许你冷有一列,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

最新更新