Mysql Yii-文件验证规则在保存到DB时将JSON数组设置为NULL

Mysql Yii-文件验证规则在保存到DB时将JSON数组设置为NULL,mysql,json,image,validation,yii,Mysql,Json,Image,Validation,Yii,当我添加文件类型检查时,情况发生了变化: 我最初只有一条规则: array('image, pictures, documents', 'default', 'setOnEmpty' => true, 'value' => ''), 这一切都很好,只是上传的文件类型没有安全性。因此,我添加了如下规则,只允许某些文件类型、最大大小和最大数量 问题:添加文件类型检查后,更新全部中断。表单上未使用的文件字段被设置为NULL,而不是以前数据库中的旧值 症状:当我编辑一个记录,其中设置了图像

当我添加文件类型检查时,情况发生了变化:

我最初只有一条规则:

array('image, pictures, documents', 'default', 'setOnEmpty' => true, 'value' => ''),
这一切都很好,只是上传的文件类型没有安全性。因此,我添加了如下规则,只允许某些文件类型、最大大小和最大数量

问题:添加文件类型检查后,更新全部中断。表单上未使用的文件字段被设置为NULL,而不是以前数据库中的旧值

症状:当我编辑一个记录,其中设置了图像或文档图像、图片或文档时,它们都会被重置!我有更多的字段,如名称、描述等。我可以只编辑名称,而不触摸任何上传的文件字段。噗,它们都是空的。因此,当模型保存时,它将不使用任何内容替换现有值。因此,我们丢失了为该记录保存的图像或文档

现在,如果我尝试更改其中一个文件。假设我有图像,但没有图片或文档。。。如果我添加一个文档,文档会保存到数据库中,但是原始图像会被删除,数据库中的值也会消失。不应该碰它

表单上的其他字段仍然存在,因此它们不会神奇地重置。名字,描述,都还在。仅重置由文件验证规则定义的文件

当我创建一个新记录时,它会像它应该的那样工作

似乎只是在更新记录时,所有文件字段在保存到数据库中时都会重置

型号:

public function rules()
{
    return array(
        array('image','file', 'allowEmpty' => true, 'types'=>'jpg, gif, png, jpeg', 'maxSize'=>1024 * 1024 * 1, 'tooLarge'=>'File has to be smaller than 1MB'),
        array('pictures','file', 'allowEmpty' => true, 'types'=>'jpg, gif, png, jpeg', 'maxSize'=>1024 * 1024 * 1, 'tooLarge'=>'File has to be smaller than 1MB', 'maxFiles' => 10, 'tooMany'=>'You have selected too many files!'),
        array('documents','file', 'allowEmpty' => true, 'types'=>'doc, docx, pdf, ppt, psd, rtf, txt, xls, xlsx, csv', 'maxSize'=>1024 * 1024 * 10, 'tooLarge'=>'File has to be smaller than 10MB', 'maxFiles' => 10, 'tooMany'=>'You have selected too many files!'),
    );
}
控制器:

public function actionUpdate($id)
{
    $uid = Yii::app()->user->id;
    $model=$this->loadModel($id);

    if ( $model->uid !== $uid ) {
        $this->redirect(array('index'));
    }

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    $origImage = $model->image;
    $origPictures = $model->pictures;
    $origDocuments = $model->documents;

    if(isset($_POST['Titles']))
    {
        $model->attributes=$_POST['Titles'];
        $model->image = $origImage;             // we are not ready to reset them yet
        $model->pictures = $origPictures;       // we are not ready to reset them yet
        $model->documents = $origDocuments;     // we are not ready to reset them yet

        $imageInstance = CUploadedFile::getInstance($model, 'image');
        $picturesInstance = CUploadedFile::getInstances($model, 'pictures');
        $documentsInstance = CUploadedFile::getInstances($model, 'documents');

        if($model->validate())
        {
            //die(var_dump($model->image));  //POOF - Here is where it's reset
            if($model->save())
            {
                // do more stuff here
            }
        }
    }
}
你可以看到我的POOF-这里是它的reset注释,在这里我有一个die命令来显示$model->image的值。使用die允许我点击刷新,并使测试上传更容易

该die命令将$model->image显示为NULL。。。它应该是更新之前数据库中的旧值,而表单中没有使用它

为什么$model->validate将“image”设置为null

JSON编码数组的“image”值示例:

[{"image":"18a18923c449cb0b6f2326ea43f2aec6.jpg","thumb":"18a18923c449cb0b6f2326ea43f2aec6_thumb.jpg"}]
注意:文档存储更多信息,如文件扩展名和随机散列之前的文件原始名称

也许上面的JSON数组没有通过验证,这就是为什么它被设置为NULL?如果是,我如何允许在这些字段中保存JSON数组

JSON允许我跟踪文件名、缩略图、扩展名、名称和描述等内容。因此,稍后我可以允许用户添加自定义名称或描述或每个图像或文档。所以我需要的信息不仅仅是文件名

如果不是因为需要名字、描述等。。。我只需要存储文件名,然后为缩略图添加_thumb。。不幸的是,我需要保存更多的数据

非常感谢您的帮助

试试这个规则

array('image, pictures, documents', 'file', 'allowEmpty' => true, 'types' => 'jpg,jpeg,gif,png'),

同样的结果。假设我保存了一张图片,我编辑了记录并上传了一张图片。图片已上载,但图像已被删除或重置。-我可以确认,回到这个规则,效果很好:数组'图像,图片,文档','安全'。问题是,没有对文件进行验证…文件验证程序是否存在错误?当我使用任何类型的数组‘image’、‘file’时,它们就被设置为null似乎使用任何类型的“文件”验证器规则都会破坏请记住,图片和文档是多个文件字段。是否添加了“htmlOptions”=>array“enctype”=>“多部分/表单数据”;//将此添加到\u formtry cmultipileupload,$THIS->widget“cmultipileupload”,array“name”=>“images”,“accept”=>“jpeg | jpg | gif | png”,//用于验证文件“重复”=>“重复文件!”,//有用,我认为‘拒绝’=>‘无效文件类型’,//有用,我认为;