0

yiiで複数のSQLステートメントを実行しようとしています。これはサーバーへのラウンドトリップを減らすためです。これは、ニッチスペシャライゼーションと呼ばれる分野向けです。ユーザーには最大3つの入力が許可されますが、フィールドはオプションです。これはコードです:

$sql = " Delete from cur_niche 
         where userid =:id ; " ;
$var2 = array_filter($object->nspecial) ;
  if(!empty($var2))                 
                    {    $str = ""  ; 
                         $i = 0 ; 
                         foreach($var2 as $n) 
                         {   if($i==0)
                         $str.= "(:id,:n".$i.")" ;
                         else 
                         $str.= ", (:id,:n".$i.")" ; 
                         $i++ ;  
                         }
        $sql .= "Insert into cur_niche (userid,nspecial) Values ".$str." ; " ;
                    }
$command = Yii::app()->db->createCommand($sql)  ;
 $command->bindParam(":id",$id,PDO::PARAM_STR) ;
  if(!empty($var2))                     
    {     $i = 0 ;
         foreach($var2 as $n) 
            { 
             $str = ":n".$i ; 

            $command->bindParam($str,$n,PDO::PARAM_STR) ;
              $i++ ; 
                }
        }   
$result = $command->execute() && $result ; 

私はすべての変数をダンプしようとしました、sqlステートメントは正しく形成されています、$ objectはフォームからの正しいデータを持っています、バインディングでは$strは正常に機能しています。ただし、次の問題に直面しています。1)ニッチな特殊化配列($ object-> nspecial)にエントリが1つしかない場合、エントリは正常に機能しています。2)ただし、複数のフィールドに入力すると、挿入の実行に失敗します。これは、useridフィールドとnspecialフィールドが複合主キーを形成するためです。

複合主キーは、一意の組み合わせを形成する両方の値に依存しませんか(ユーザーがさまざまなフィールドに一意の値を入力すると仮定します)?主キー制約を削除すると、データベース内の2つの行を持つ1つのフィールドの値が複製されます。ここで何が間違っているのでしょうか。

4

1 に答える 1

0

バグが見つかりました。'foreach'ループの場合、パラメーターの最新の値を参照し、値を複製するため、パラメーターではなく値でバインドする必要があります。

于 2012-10-15T17:26:34.990 に答える