0

这听起来像是一个典型的问题,但我无法在 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(vehicle Identification number,只能是数据库中唯一的一个数字)是否匹配系统中已经存在的汽车?汽车类或cars.php?

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

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

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

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

我知道这些问题很多,但我很确定很多人将来在搜索这些类型的东西时会从中受益。

非常感谢您的回答

4

2 回答 2

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

但是,根据您的需要,更新所有值(除 id 之外)无疑将是您最简单的选择,因为仅执行几个查询或没有 ORM 时计算更改的好处微不足道(而且它也是不必要的)。

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

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

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

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

于 2013-08-23T19:29:54.920 回答
0

问题一:

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

问题2:

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

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

问题 3:

a)我会说无论如何都要运行你的 AJAX 调用,为什么还要尝试对此做任何事情。你关心性能吗?如果用户愚蠢到在什么都不做之后提交表单,那就这样吧。

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

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

于 2013-08-23T19:08:06.263 回答