一尘不染

存储未知长度的数组

sql

我让我的用户以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
     });
}

以下是LandOwners.php的一部分,该部分将插入 没有
数字输入的mydatabase中(由于我不确定如何/不应该输入,所以我还没有添加它们)。

$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;

以下是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;

阅读 195

收藏
2021-05-30

共1个答案

一尘不染

如果你在一个情况发现自己在那里你开始有column1column2在桌子上-有机会,你的设计是越来越有缺陷的,你应该建立单独的表-
每个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_id和的land_owner表ID之间创建外键约束,以确保数据完整性。

有了新表后,就可以使用来一起查询它们LEFT JOINJOIN如果有输入值,则只返回一个普通表即可)。

SELECT *
FROM land_owner AS lo
LEFT JOIN land_owner_input AS loi
    ON loi.land_owner_id = lo.land_owner_id
2021-05-30