gpt4 book ai didi

php - Yii 非常奇怪的 save() 行为

转载 作者:搜寻专家 更新时间:2023-10-30 22:16:51 24 4
gpt4 key购买 nike

我遇到了一些非常非常奇怪的事情。在 VirtualBox、Ubuntu、Apache2、PHP、MySQL 中工作时,我从一个特定模型中得到了一些非常奇怪的行为。

我想添加输入同一字符串的多种语言版本的功能,比如产品名称。我使用 jQuery 制作了漂亮的语言标签,并创建了临时数组来存储所有这些信息,使用 CActiveForm 小部件来收集和呈现数据。

<?php foreach($languages as $language): ?>
<div id="tab_<?=$language->code?>">
<div class="row">
<?php echo $form->labelEx($model,'name'); ?>
<?php echo $form->textField($model,"translations[$language->code][name]",array('size'=>60,'maxlength'=>128)); ?>
<?php echo $form->error($model,"translations[$language->code][name]"); ?>
</div>
</div>
[...]

这就是我将数据收集到 $translations 数组中的方式。这是我的 $translations 数组:

$translations = array(
'name' => 'NewName',
'sub_name' => 'Subname'
);

然后我显然将它分配给 Controller 操作中的适当模型:

[...]
foreach ($translations as $key => $value){
$x = new Translations();
$x->language = $key;
$x->id = $product->id;
$x->name = $value['name'];
$x->sub_name = $value['sub_name']
$x->save();
}
[...]

现在还有其他字段每个产品只有一个:

[...]
<div class="row">
<?php echo $form->labelEx($model,'something'); ?>
<?php echo $form->textField($model,'something',array('size'=>60,'maxlength'=>128)); ?>
<?php echo $form->error($model,"something"); ?>
</div>
</div>

而这些只是由

存储
$product->save();

一切都在一个整洁的交易中。

然而....

我得到的结果是这样的(join on translations and product table):

id       name        subname        something
1 NewN
2 NewName S
3 NewName Subname Som
4 NewName Subname Something

当我只添加一条时有 4 条记录....我输入的文本越多,创建的记录就越多。按随机字符数拆分,有时少至 4 个,有时多至 12 个。这是可重复的,但并非总是如此……我对这种行为感到非常震惊。

有没有人见过这样的东西,可以解释一下吗?提前致谢!

最佳答案

问题可能出现在多个阶段:

  • 表格
  • 控制者
  • 将表单中的数据绑定(bind)到模型
  • 模型保存(ActiveRecord)
  • 甚至是数据库

所以“分而治之”你的问题。

MySQL

打开您的“通用 mysql 日志”以查看发送到 MySQL 的查询。如果它们看起来像您在上面看到的奇怪形式,那么它不是数据库。在此阶段您不太可能遇到任何问题,但最好将其排除。

事件记录

然后将您的值(value)观硬编码到模型中。在您的 Controller 中,只需创建模型的一个实例并保存它。这会复制您遇到的问题吗?如果是,则说明您的 ActiveRecord 实现存在问题。尝试删除关系并解决这个问题。

Controller

您的 Controller 中可能有一些奇怪的东西。同样,在创建实例时对要传递给模型的数据进行硬编码。

绑定(bind)

这可能是您如何将数据从表单绑定(bind)到模型的问题。手动设置表单的值,然后像往常一样将该数据绑定(bind)到模型。

这就是后端测试真正可以帮助您的地方,因为您可以将有效的部分与无效的部分区分开来。查看 Behat 和 PHPUnit 等工具。

关于php - Yii 非常奇怪的 save() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10733865/

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