我遇到了非常非常奇怪的事情。在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'
);
然后我显然将它分配给Controler动作中的正确模型:
[...]
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();
一切都在整齐的交易中。
...无论其
我得到的结果是这样的(加入翻译和产品表):
id name subname something
1 NewN
2 NewName S
3 NewName Subname Som
4 NewName Subname Something
4条记录,当我只添加一个......以及我输入的更多文本时,会创建更多记录。按随机数字分割,有时少至4,有时多达12。这是可重复但不总是......我完全被这种行为所愚弄。
任何人都曾经看过这样的事情,可以对此有所了解吗? 提前谢谢!
答案 0 :(得分:3)
问题可能出现在很多阶段:
所以'分而治之'你的问题。
<强>的MySQL 强>
打开“常规mysql日志”以查看发送给MySQL的查询。如果它们看起来像您在上面看到的奇怪形式,那么它不是数据库。在这个阶段你不太可能遇到任何问题,但最好还是排除它。
<强> ActiveRecord的强>
然后将您的值硬编码到模型中。在您的控制器中,只需创建模型的实例并保存即可。这会复制你遇到的问题吗?如果是这样,那么您的ActiveRecord实现就会出现问题。尝试删除关系并进行处理。
<强>控制器强>
你的控制器可能有些奇怪。同样,在创建实例时,硬编码要传递给模型的数据。
<强>装订强>
如何将数据从表单绑定到模型可能会出现问题。手动设置表单的值,然后将该数据正常绑定到模型。
这是后端测试可以真正帮助您的地方,因为您可以将哪些工作与非工作区分开来。查看Behat和PHPUnit等工具。