回答

收藏

存储未知长度的数组

技术问答 技术问答 377 人阅读 | 0 人回复 | 2023-09-12

我让我的用户HTML以形式添加数字输入,并用值填充。表单在提交时序列化并发送到一个PHP文件,文件使用PDO插入数据MySQL数据库中。数据库表中有一堆列,用于存储表单中的其他值,但是用于存储用户添加的输入的列的设置如下:- J& h* N! }9 g; j$ {
input_value_1input_value_2input_value_3input_value_4......input_value_10允许使用这些列,NULL因为我不知道用户是否会添加任何数字输入。% v* ^& X9 T, k) H/ G! j
有没有更好的方法来存储这些数字?# ?: `& Z  ~/ K7 L7 G6 x
以下是我的JS部分用于获取表单数据并发送到LandOwners.php,后者将值插入我的数据库。没有% ^/ L6 U0 ?+ h: d# P
数字输入(我还没有添加它们,因为我不确定如何存储它们的数据)。
* V8 x8 C# R2 r0 }6 G  a5 X$("#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部分将插入 没有
+ e0 G5 @. V  D( p8 G, }数字输入的mydatabase(我还没有添加它们,因为我不确定如何/不应该输入)。
5 v' Q( J: q0 L. R$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。8 X5 R  Y0 g. s
$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;               
. d) m; p/ _0 K* `' y8 O    解决方案:                                                                $ S: n0 Z1 x6 @# d1 y/ R6 }
                                                                如果你在一个情况发现自己在那里你开始有column1,column2在桌子上-有机会,你的设计越来越有缺陷,你应该建立一个单独的表-$ S- ~1 x* p) b3 e+ B
每个columnX每个人都有自己的一排。假如发现自己在同一张表上有多个重复列,最好有一个单独的表。
/ X5 \  [" c* L9 v# O  U5 l4 h通过这种方式,您可以避免在列中存储逗号分隔的值,并在突然需要引入另一个值时破坏代码/查询column{X 1}-但可根据需要具有任意数量的输入值。
& X* G; e, }) i& l对你来说,这就像一块新手表land_owner_input,你在其中有一个值(你将把它放进去)columnX)和land_owner引用该值所属行。# L9 o2 b5 H+ g1 D! g3 F3 h
这是典型的设计模式。
# i2 D  b/ w/ ^/ c4 h7 O7 ^% sCREATE TABLE land_owner_input  land_owner_input_id INT(11) AUTO_INCREMENT    land_owner_id INT      land_owner_input_value VARCHAR(MAX));请记住,您land_owner_id新表中的类型和大小应与之一起引用ID完全相同。
5 I, x% [/ |6 p+ _: s您还可以在land_owner_id和的land_owner表ID创建外键约束,以确保数据的完整性。
  g) G. p9 N( ^9 n. }0 w有了新表,就可以用来查询了LEFT JOIN(JOIN若有输入值,则只返回普通表)。
6 g+ |' k0 Q+ c  e" Y+ MSELECT *FROM land_owner AS loLEFT JOIN land_owner_input AS loi    ON loi.land_owner_id = lo.land_owner_id
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则