这听起来可能是一个典型的问题,但我在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:更新记录的最佳方式是什么?
- 删除行并插入新行
- 更新所有值,即使它们没有更改
- 使用javascript检查不同的字段?(在变更检查时值,如果更改,则在PHP中设置某种var)
- 使用php检查不同的字段?(选择旧值和将它们与提交后的表单值进行匹配)使用某种PHP函数仅更新已更改的字段
问题3:(这是我更关心的问题)用户提交表单后,我应该如何处理他们的输入:
- 当用户按原样保留值并且没有任何更改时
- 当用户完全删除该值时(例如"Make")
- 当用户仅将字母从小写更改为大写时
我知道有很多问题,但我敢肯定,将来很多人在寻找这类东西时,都会从中受益。
非常感谢您的回答
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) 这再次由您的业务问题决定。