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

时间:2013-08-23 19:00:27

标签: php jquery mysql forms sql-update

这听起来像是一个典型的问题,但我无法在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 = edit

这是我想从类中运行函数并使用smarty

显示模板的地方

查看者edit_cars.html

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

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

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

  1. 删除行并插入新行?
  2. 更新所有值,即使它们没有更改
  3. 使用javascript检查不同的字段? (在变更检查上 值,如果更改,则在PHP中设置某种var)
  4. 使用php检查不同的字段? (选择旧值和 提交后将它们与表单值匹配)使用某种PHP 功能只更新已更改的字段
  5. 问题3 :(这对我来说更令人担忧) 用户提交表单后,我应该如何处理他们的输入:

    1. 当用户按原样保留值并且没有任何更改时
    2. 当用户完全删除该值(例如“Make”)
    3. 当用户仅将字母从小写更改为上
    4. 我知道这些问题很多,但我很确定很多人将来会在搜索这些类型的东西时从中受益。

      非常感谢您的回答

2 个答案:

答案 0 :(得分:2)

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查询。

然而,根据您的需要,更新所有值(bar 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 :(得分:0)

问题1:

我不知道你的意思。检查vin是否匹配?编辑表单中相关的vin号码?

问题2:

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

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

问题3:

a)我想说无论如何都要运行你的AJAX,为什么还要费心去做。你关注性能吗?如果用户愚蠢到没有做任何事情后提交表单那么就这样吧。

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

c)这再次取决于您的业务问题。