我让我的用户以HTML形式添加数字输入,并用值填充它们。该表单在提交时被序列化,并发送到一个PHP文件,该文件使用PDO将数据插入到MySQL数据库中。数据库表中有一堆列,用于存储表单中的其他值,但是用于存储用户添加的输入的列的设置如下:
input_value_1 input_value_2 input_value_3 input_value_4 ... ... input_value_10
这些列允许使用,NULL因为我根本不知道用户是否会添加任何数字输入。
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;
如果你在一个情况发现自己在那里你开始有column1,column2在桌子上-有机会,你的设计是越来越有缺陷的,你应该建立单独的表- 每个columnX都有自己的一排。如果发现自己在同一张表上有多个重复的列,最好有一个单独的表。
column1
column2
columnX
这样,您可以避免将逗号分隔的值存储在列中,避免在突然需要引入另一个值的情况下破坏代码/查询column{X+1}-而是可以根据需要具有任意数量的输入值。
column{X+1}
对您来说,这就像是一个名为的新表land_owner_input,在其中您拥有值(您将放入columnX)和land_owner对该值所属行的引用。
land_owner_input
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和的land_owner表ID之间创建外键约束,以确保数据完整性。
有了新表后,就可以使用来一起查询它们LEFT JOIN(JOIN如果有输入值,则只返回一个普通表即可)。
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