【问题标题】:Error: Call to a member function save() on a non-object错误:在非对象上调用成员函数 save()
【发布时间】:2014-11-28 13:16:11
【问题描述】:
public function upload ($data = null) {
    foreach ($data as $file) {
        $filename = $file['name'];
        $file_tmp_name = $file['tmp_name'];
        $dir = WWW_ROOT.'img'.DS.'uploads';
        $allowed = array('png', 'jpg', 'jpeg');

        if (!in_array(substr(strrchr($filename, '.'),1) , $allowed)) {
            throw new NotFoundException("Error Processing Request", 1);
        }
        elseif (is_uploaded_file($file_tmp_name)) {
            $new_filename = DS.STring::uuid().'-'.$filename;
            move_uploaded_file($file_tmp_name,$dir.$new_filename);

            if ($this->Upload->save($this->request->data)) {
            `$this->Session->setFlash('Data Saved!');
            }
        }
    }
}

我得到了这个错误..

在非对象上调用成员函数 save()

我该如何解决这个问题?

【问题讨论】:

  • 这个功能在哪里?在控制器内部?如果是,控制器的名称是什么?
  • 它在组件文件夹里面.. UploadComponent.php
  • 你试过我的答案了吗?

标签: file cakephp upload


【解决方案1】:
$model = ClassRegistry::init('Upload');

然后使用

 $model->save();

使用

if (ClassRegistry::init('Upload')->save($this->request->data)) {

            }

【讨论】:

  • 调用未定义的方法 UploadComponent::loadModel()
  • 这是一个组件动作吗?
  • 是的,抱歉我之前没有提到。
  • 我会把这些放在哪里?对不起..新手:/
  • 在非对象上调用成员函数 setFlash()
【解决方案2】:

您为什么不将控制器的名称及其文件名(以及表名)复数化,即 UploadsControllerl?这是CakePHP convention

Controller类名是复数,CamelCased,以Controller结尾。 PeopleController 和 LatestArticlesController 都是传统控制器名称的示例。

编辑: 我以为您的方法在控制器类中。在组件中,在使用模型之前,您需要将其注册如下:

$model = ClassRegistry::init('Yourmodel');

所以你应该使用:

$model = ClassRegistry::init('Upload');
$model->save($this->request->data);

见:Use a model in a component

【讨论】:

  • 那不是控制器类。它是一个组件。
  • 试图获取非对象的属性
  • 您确定错误与这些行有关吗?您是否将“$this->Upload->save()”更改为“$model->save()”? ClassRegistry::init 正是为此目的,除非您没有 Upload 模型类。
  • 我有一个模型,但这是我在模型中使用的唯一代码..
  • 我使用的代码来自这里,所以你可以看到代码的内容..youtube.com/watch?v=scZeqDLxeqM
【解决方案3】:

如果您在组件中使用模型,或者如果它没有关联,则在其他模型中使用 ClassRegistry。 使用

ClassRegistry::init('Upload');

【讨论】:

    【解决方案4】:

    请在您的控制器函数中加载模型,假设您正在使用用户表,然后您在函数 $this->loadmodel('User'); 中加载用户模型; 之后就可以使用代码了

    if($this->User->save($this->request->data)){
         your code......
    

    }

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多