我正在使用ZF2和mysql,但问题是与平台无关。我有一个数据传输对象Organization
从html表单中获取水分。 OrganizationMapper
有一个save
方法,(1)将Organization
作为参数,(2)一个接一个地填充几个数据库表。
假设第一个表填充正常,但第二个表没有填充,因为Organization
的某个属性未设置(对列没有空约束)。用户收到错误,但第一个表已经填满。如果他再次尝试提交表单,但是这次填写了所有的html字段,所有表格都填好了,但是第一个表格有一个以前未用过的行。
我怎么能避免这种情况?
我想在mapper的empty
方法中使用if
检查save
值,但它看起来并不优雅。我知道ZF2中的InputFilter
验证,但是这些验证表单中的用户输入,当php代码与数据库通信时,它们不会检查。
任何帮助?
答案 0 :(得分:1)
最好的方法是在开始将数据写入数据库之前验证所有数据。
我没有使用ZF2,这个解决方案实际上是依赖于框架的,因此您需要检查ZF2文档。例如,在Yii中,您只需为模型的每个字段定义验证规则,因此您可以确保在开始将数据保存到数据库之前Organization
包含所有数据,可能Zend中可能存在类似的情况。
请注意,验证并不仅仅意味着检查空值,您可能需要验证不同的内容,例如:"电子邮件是正确的电子邮件,如xxx@yyy.com",&# 34;名称不为空","名称长度超过3个字符","名称长度小于1000个字符"等等。
对于Yii,它大致如下:
class Organization extends ActiveRecord {
...
// here we define the validation rules
public function rules() {
return [
// name is required
['name', 'required'],
// check min / max length
['name', 'string', 'min' => 3, 'max' => 12],
// check if email is valid
['email', 'email']
];
}
}
现在您可以执行$organization->validate()
以确保一切正确(同样,当您$organization->save()
时,将会在保存到数据库之前检查规则。
另一个防止数据不一致的解决方案是使用事务。在您写入多个表的情况下,即使您验证了所有内容,也无论如何都需要它们。意外的事情发生了,所以最好保护你的保存代码(伪代码):
$transaction->start();
try {
$table1->writeSomeData();
$table2->writeMoreData();
$transaction->commit();
} (catch Exception $e) {
$transaction->rollback();
}
再次,检查您的框架文档,它可能以某种方式支持它。