是Yii还是我错了?

时间:2012-01-24 18:00:01

标签: php yii

您好,我已经编写了一个代码,可以通过整个数组进行整理,并将图像复制到文件夹并在记录中插入数据。现在有趣的是$model->save()没有显示错误,它返回true。和程序永远不会进入其他

现在发生了什么循环继续运行并完成其ietration而不会中断。我无法猜出谁错了。因为我大部分时间都是我的机会更大:)

这是代码

   protected function saveImage($formData,$model)
        {                   
               if ($formData === null)
                   return;                   
                $idx=0;

            foreach($formData['title'] as $image)
            {
                $model->title = $image;                    
                $file= dirname(Yii::app()->request->scriptFile) . DIRECTORY_SEPARATOR 
                        . DIRECTORY_SEPARATOR .'images\hotelImages'. DIRECTORY_SEPARATOR 
                        . $model->hotel->name;

                $model->image = Yii::app()->baseUrl. "/images/hotelImages/".$_FILES['HotelImages']['name'][$idx];//image path

                if($model->save())
                { 
                    echo $idx.'<br /> it was sucess<br />';

                    If(file_exists($file)) 
                    {
                        copy($_FILES['HotelImages']['tmp_name'][$idx],$file."/".$_FILES['HotelImages']['name'][$idx]);
                    }
                    else
                    {
                         mkdir($file); 
                        copy($_FILES['HotelImages']['tmp_name'][$idx],$file."/".$_FILES['HotelImages']['name'][$idx]);
                    }
                    $idx++;

                }//if there was error
                 else
                 {
                     print_r($model->getErrors());
                     yii::app()->end();                
                    return FALSE;
                 }
                 echo '<br />end reached <br />';


            }
             yii::app()->end(); 
             return true;
        }
$ formdata的

var_dump是

array
(
    'title' => array
    (
        '0' => 'title1'
        '1' => 'title2'
    )
)

无论如何,foreach循环数据库的计数只能获得单行

4 个答案:

答案 0 :(得分:4)

save()方法将记录插入数据库(如果它尚不存在),否则更新相同的数据库记录

$model作为方法参数传入,我只是假设其title属性不是主键。

换句话说,您不断反复更新同一个数据库记录,这就是您只在数据库中看到一条记录的原因。

答案 1 :(得分:0)

@ fivedigit的分析是正确的。我建议的修复方法是降低此方法的复杂性。将所有内容放在foreach的自己的方法中(例如saveImage),然后执行以下操作:

foreach($formData['title'] as $image) {
  $this->saveImage($image, new Image);
}

这种方法有点超级方法,您可能会发现将其分解为不同的方法更容易。也许使用组件来处理文件复制,而不是填满控制器。

答案 2 :(得分:0)

再一次我错了:)

问题在于每个foreach ietration $ model之前是$ model并且没有创建$ model的新瞬间,yii认为可能是这个Geek正在更新它的旧版本。所以就是it.it在数据库中更新。

只是这样做了 $model = new HotelImages;

在填充之前

我感谢fivedigit只是一个想法。

我非常相信这个


  

大多数人说小知识很危险......这是真的   所有程序员除外。程序员是稀有物种,它需要的是什么   一点点想法/暗示做这件事

答案 3 :(得分:0)

Yii CActiveRecord有一个变量isNewRecord,它的值在创建对象时为true,并且在未调用find或save函数之前保持为true。当模型调用save函数时,isNewRecord设置为false。

所以在你的情况下,你需要在每次调用保存函数之前设置这个变量“isNewRecord”为true,或者每次创建一个新模型都要调用保存函数。

查看代码中的更改::

$model->setIsNewRecord(True); // changes code line

   protected function saveImage($formData,$model)
    {                   
           if ($formData === null)
               return;                   
            $idx=0;

        foreach($formData['title'] as $image)
        {
            $model->setIsNewRecord(True); // for each new record
            $model->title = $image;                    
            $file= dirname(Yii::app()->request->scriptFile) . DIRECTORY_SEPARATOR 
                    . DIRECTORY_SEPARATOR .'images\hotelImages'. DIRECTORY_SEPARATOR 
                    . $model->hotel->name;

            $model->image = Yii::app()->baseUrl. "/images/hotelImages/".$_FILES['HotelImages']['name'][$idx];//image path

            if($model->save())
            { 
                echo $idx.'<br /> it was sucess<br />';

                If(file_exists($file)) 
                {
                    copy($_FILES['HotelImages']['tmp_name'][$idx],$file."/".$_FILES['HotelImages']['name'][$idx]);
                }
                else
                {
                     mkdir($file); 
                    copy($_FILES['HotelImages']['tmp_name'][$idx],$file."/".$_FILES['HotelImages']['name'][$idx]);
                }
                $idx++;

            }//if there was error
             else
             {
                 print_r($model->getErrors());
                 yii::app()->end();                
                return FALSE;
             }
             echo '<br />end reached <br />';


        }
         yii::app()->end(); 
         return true;
    }
相关问题