1

我遇到了非常非常奇怪的事情。在 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 条记录,当我只添加 ONE.... 并且我输入更多文本时,会创建更多记录。按随机数量的字符分割,有时少到 4,有时多到 12。这是可重复的,但并非总是如此......我对这种行为完全目瞪口呆。

任何人都见过这样的事情并且可以阐明它吗?提前致谢!

4

1 回答 1

3

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

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

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

MySQL

打开“general mysql log”以查看发送到 MySQL 的查询。如果它们看起来像您在上面看到的奇怪形式,那么它不是数据库。在这个阶段你不太可能有任何问题,但最好排除它。

活动记录

然后将您的值硬编码到模型中。在您的控制器中,只需创建模型的一个实例并保存它。这是否复制了您遇到的问题?如果是这样,那是您的 ActiveRecord 实现存在问题。尝试删除关系并继续努力。

控制器

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

捆绑

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

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

于 2012-05-24T08:44:04.443 回答