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();
}
[...]

現在、製品ごとに1つしかない他のフィールドもあります。

[...]
<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

1つだけ追加すると4つのレコード....さらにテキストを入力すると、さらに多くのレコードが作成されます。ランダムな数の文字で分割します。4から12までの場合もあります。これは繰り返し可能ですが、常にではありません。私はこの動作に完全に唖然とします。

誰もがこのようなものを見たことがあり、それに光を当てることができますか?前もって感謝します!

4

1 に答える 1

3

問題は多くの段階で発生する可能性があります。

  • フォーム
  • コントローラー
  • フォームからモデルへのデータのバインド
  • モデルの保存 (ActiveRecord)
  • またはデータベースでさえ

だから、あなたの問題を「分割して征服」してください。

MySQL

「一般的な mysql ログ」をオンにして、MySQL に送信されているクエリを確認します。上記の奇妙なフォームのように見える場合、それはデータベースではありません。この段階で問題が発生する可能性はほとんどありませんが、除外することをお勧めします。

アクティブレコード

次に、値をモデルにハードコードします。コントローラーで、モデルのインスタンスを作成して保存するだけです。それはあなたが抱えている問題を再現していますか?そうであれば、ActiveRecord の実装に問題があります。関係を削除してみてください。

コントローラ

コントローラーに異常がある可能性があります。ここでも、インスタンスの作成時にモデルに渡すデータをハードコーディングします。

バインディング

フォームからモデルにデータをバインドする方法に問題がある可能性があります。フォームの値を手動で設定し、そのデータを通常どおりモデルにバインドします。

これは、機能しているものと機能していないものを分離できるため、バックエンド テストが本当に役立つ場所です。Behat や PHPUnit などのツールを調べてください。

于 2012-05-24T08:44:04.443 に答える