gpt4 book ai didi

php - 使用 ZF2 保存到多个表时检查空值

转载 作者:行者123 更新时间:2023-11-29 11:41:55 24 4
gpt4 key购买 nike

我正在使用 ZF2 和 mysql,但问题与平台无关。我有一个数据传输对象Organization,它从 html 表单中获取数据。 OrganizationMapper 有一个 save 方法,该方法 (1) 获取 Organization 作为参数,并且 (2) 依次填充几个数据库表。

假设第一个表已正确填充,但第二个表未填充,因为未设置 Organization 的属性之一(不是对列的空约束)。用户收到错误,但第一个表已填满。如果他尝试再次提交表单,但这次填充了所有 html 字段,则所有表都会填充正常,但第一个表有一个先前未使用的行。

如何避免这种情况?

我想过在映射器的 save 方法中使用 if 检查 empty 值,但它看起来并不优雅。我知道 ZF2 中的 InputFilter 验证,但是这些验证会检查表单中的用户输入,当 php 代码与数据库通信时,它们不会检查内容。

有什么帮助吗?

最佳答案

最好的方法是在开始将所有数据写入数据库之前验证所有数据。

我没有使用ZF2,这个解决方案实际上依赖于框架,所以你需要检查ZF2文档。例如,在 Yii 中,您只需为模型的每个字段定义验证规则,这样您就可以在开始将数据保存到数据库之前确保您的 Organization 包含所有数据,也许类似的事情是可能的在 Zend 中。

请注意,验证不仅仅意味着检查空值,您可能需要验证不同的内容,例如:“电子邮件是正确的电子邮件,例如 xxx@yyy.com”、“名称不为空”、“名称”长度超过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();
}

再次检查您的框架文档,它可能以某种方式支持这一点。

关于php - 使用 ZF2 保存到多个表时检查空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35637251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com