在php和mysql中更新/编辑表单字段的最佳实践是什么


What is the best practice to update / edit form fields in php and mysql?

这听起来可能是一个典型的问题,但我在stackoverflow上找不到合适的答案。我已经构建了从php表单中添加和删除项目

数据库

|car_id(PK)|year  |   make   |   model   |  vin  |
--------------------------------------------------
|   1      | 2001 |  toyota  |  corolla  | 12345 |
|   2      | 1999 |  ford    |  fiesta   | 67890 |
|   3      | 2013 |  gmc     |  yukon    | abcde |

汽车类别

class Car
{
   public car_id;
   public year;
   public make;
   public model;
   public vin; //unique, can only be one in DB
   function addCar(){...}
   function editCar(){...}
   function deleteCar(){...}
}

PHP:cars.PHP?do=编辑

这就是我想从类中运行函数并使用smarty 显示模板的地方

查看器edit_cars.html

当这个页面加载时,它会从数据库中提取所有值,并创建已经包含值的表单,用户可以覆盖或删除这些值。

问题1:我应该在哪里检查vin(车辆识别号,在数据库中只能是一个唯一的数字)是否与系统中已经存在的汽车匹配?汽车等级还是cars.php?

问题2:更新记录的最佳方式是什么?

  1. 删除行并插入新行
  2. 更新所有值,即使它们没有更改
  3. 使用javascript检查不同的字段?(在变更检查时值,如果更改,则在PHP中设置某种var)
  4. 使用php检查不同的字段?(选择旧值和将它们与提交后的表单值进行匹配)使用某种PHP函数仅更新已更改的字段

问题3:(这是我更关心的问题)用户提交表单后,我应该如何处理他们的输入:

  1. 当用户按原样保留值并且没有任何更改时
  2. 当用户完全删除该值时(例如"Make")
  3. 当用户仅将字母从小写更改为大写时

我知道有很多问题,但我敢肯定,将来很多人在寻找这类东西时,都会从中受益。

非常感谢您的回答

Where should I check if vin matches the car already exists in the system? Car class or cars.php?

汽车类别本身应该只知道自己的属性,而不知道是否有其他汽车具有相同的VIN。

该限制应该是数据库级别的唯一键约束。为了避免出现异常情况,在将新车插入数据库之前,您需要在汽车类别之外检查现有汽车是否已在此VIN内注册。

What is the best way to update records?

删除原来的一行,然后插入一个新的一行将导致您拥有该车的不同主键id。这将导致外键出现问题,因为它们在更新之前仍将引用旧id。它们可以更新,但是我强烈建议避免使用这种方法。

对象关系映射器(ORM)在加载对象后会跟踪对象的更改,这意味着它们可以在实际执行SQL查询时计算和优化SQL查询。

然而,根据您的需要,更新所有值(id除外)将是您最简单的选择,因为当只执行几个查询或不执行ORM时,计算更改的好处可以忽略不计(也是不必要的)。

After user submits the form, what should I do with their input:

所有前端验证(即任何Javascript)都需要在后端服务器端进行复制。这是为了避免SQL injection,也是为了执行所需的业务逻辑。I.e Number of wheels cannot be "bacon"

您可以在客户端了解其中的大部分内容,让用户知道(没有新的HTTP请求)他们输入的数据有问题。您验证的输入以及如何向用户表示这些错误取决于您,这将取决于所输入数据的上下文。

非常重要的是,您独立于PHP中的javascript来验证所有数据,以避免有人简单地禁用浏览器中的javascript和数据库中的SQL injecting

问题1:

我不知道你在这里是什么意思。检查vin是否匹配什么?编辑表单中关联的vin编号?

问题2:

只将更改发送到服务器端脚本将是最快的,因为这只是一个HTTP请求,而不是首先使用Javascript进行检查,但这与用户体验有很大关系。你想让你的用户知道他们做错了什么,或者实际上没有进行有意义的编辑吗?如果是这样的话,AJAX调用可能效果最好。

更新一行肯定比删除一行然后重新插入要快。

问题3:

a) 我想说,无论如何,运行你的AJAX调用,为什么要麻烦尝试对此做任何事情呢。你关心表现吗?如果用户愚蠢到什么都不做就提交表格,那就顺其自然吧

b) 你这是什么意思?你的意思是将make更改为空白值?这取决于你的商业逻辑?这是不允许的吗?如果是这样的话,你可能应该在提交之前进行一些表单验证,以确保他们在犯这样的错误时无法提交。

c) 这再次由您的业务问题决定。