Загрузка картинки

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Загрузка картинки

Сообщение alexa777 »

Привет, сделал загрузку картинки

В папку картинка загружается, а вот в БД запись не идет Выдает ошибку

Код: Выделить всё

SQLSTATE[HY000]: General error: 1364 Field 'img' doesn't have a default value
Из обязательных в rules 'img' удалил.
Уже не знаю что делать, что не так ? вот экшен

Код: Выделить всё

  public function actionCreate()
    {
        $model = new Item();
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $imageName = time();
            $model->image = UploadedFile::getInstance($model, 'image');
        if(!empty($model->image))
            {
                $model->image->saveAs('../uploads/blog_'.$imageName.'.'.$model->image->extension);
                $model->img = '../uploads/blog_'.$imageName.'.'.$model->image->extension;
                $model->save();
            }
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

Вот попытка сделать запись

Код: Выделить всё

 $model->img = '../uploads/blog_'.$imageName.'.'.$model->image->extension;
        
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Загрузка картинки

Сообщение urichalex »

Модель покажи полностью
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

urichalex писал(а): 2018.01.25, 19:13 Модель покажи полностью

Код: Выделить всё

<?php

namespace app\models;

use Yii;


class Item extends \yii\db\ActiveRecord
{
    
    public $image;
    
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'item';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['title', 'category_id', 'content', 'price', 'time', 'contact', 'status', 'user_id', 'created', 'updated', 'description', 'keywords'], 'required'],
            [['category_id', 'price', 'contact', 'user_id', 'created', 'updated'], 'integer'],
            [['content', 'time', 'status'], 'string'],
            [['title', 'img', 'description', 'keywords'], 'string', 'max' => 255],
            [['image'], 'file', 'extensions' => 'png, jpg, jpeg'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'title' => Yii::t('app', 'Title'),
            'category_id' => Yii::t('app', 'Category ID'),
            'content' => Yii::t('app', 'Content'),
            'img' => Yii::t('app', 'Img'),
            'price' => Yii::t('app', 'Price'),
            'time' => Yii::t('app', 'Time'),
            'contact' => Yii::t('app', 'Contact'),
            'status' => Yii::t('app', 'Status'),
            'user_id' => Yii::t('app', 'User ID'),
            'created' => Yii::t('app', 'Created'),
            'updated' => Yii::t('app', 'Updated'),
            'description' => Yii::t('app', 'Description'),
            'keywords' => Yii::t('app', 'Keywords'),
        ];
    }
    
    public function getUsers()
        {
            return $this->hasOne(User::className(), ['id' => 'user_id']);
        }

    public function getCategorys()
        {
            return $this->hasOne(Category::className(), ['id' => 'category_id']);
        }
 

}
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Загрузка картинки

Сообщение urichalex »

При первом сохранении if ($model->load(Yii::$app->request->post()) && $model->save()) $model->img еще не заполнено
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

urichalex писал(а): 2018.01.25, 19:20 При первом сохранении if ($model->load(Yii::$app->request->post()) && $model->save()) $model->img еще не заполнено
И как сделать правильно подскажи?
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Загрузка картинки

Сообщение proctoleha »

General error: 1364 Field 'img' doesn't have a default value
А как вы это переводите? О чем говорит текст ошибки?
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

proctoleha писал(а): 2018.01.25, 19:26
General error: 1364 Field 'img' doesn't have a default value
А как вы это переводите? О чем говорит текст ошибки?
Поле img не имеет данных по умолчанию
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

ну как сделать ? подскажите плиз, я понимаю что для вас это просто, но я чайник в этом деле) я только учусь
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Загрузка картинки

Сообщение ElisDN »

В if ($model->load(Yii::$app->request->post()) && $model->save()) заменить $model->save() на $model->validate(). Нижний вызов $model->save(); вынести ниже if и заменить на $model->save(false);
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

ElisDN писал(а): 2018.01.25, 19:58 В if ($model->load(Yii::$app->request->post()) && $model->save()) заменить $model->save() на $model->validate(). Нижний вызов $model->save(); вынести ниже if и заменить на $model->save(false);

Не работает, наверное потому что я добавил еще два параметра id и status, а их нужно сохранить
у меня сейчас стоит вот так

Код: Выделить всё

 public function actionCreate()
    {
        $model = new Item();
          
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
             $model->user_id = Yii::$app->user->id;
             $model->status = 'on';
             $imageName = time();
             $model->image = UploadedFile::getInstance($model, 'image');
            if(!empty($model->image))
            {   
                $model->image->saveAs('../uploads/blog_'.$imageName.'.'.$model->image->extension);
                $model->img = '../uploads/blog_'.$imageName.'.'.$model->image->extension;
                $model->save();
            }
     
           
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }
а если после

Код: Выделить всё

    $model->user_id = Yii::$app->user->id;
             $model->status = 'on';
я ставлю $model->safe();
то опять выдает ошибку
General error: 1364 Field 'img' doesn't have a default value
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Загрузка картинки

Сообщение ElisDN »

Код: Выделить всё

public function actionCreate()
{
    $model = new Item();

    if ($model->load(Yii::$app->request->post())) {
        $model->image = UploadedFile::getInstance($model, 'image');
        if ($model->validate()) {
            $model->user_id = Yii::$app->user->id;
            $model->status = Item::STATUS_ON;
            if ($model->image) {
                $name = 'blog_' . uniqid() . '.' . $model->image->extension;
                $model->image->saveAs(Yii::getAlias('@webroot/uploads/' . $name));
                $model->img = $name;
            }
            $model->save(false);
            return $this->redirect(['view', 'id' => $model->id]);
        }
    }

    return $this->render('create', [
        'model' => $model,
    ]);
}
alexa777 писал(а): 2018.01.25, 20:02 General error: 1364 Field 'img' doesn't have a default value
Уберите NOT NULL у поля в базе данных.
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

ElisDN писал(а): 2018.01.25, 20:25

Код: Выделить всё

public function actionCreate()
{
    $model = new Item();

    if ($model->load(Yii::$app->request->post())) {
        $model->image = UploadedFile::getInstance($model, 'image');
        if ($model->validate()) {
            $model->user_id = Yii::$app->user->id;
            $model->status = Item::STATUS_ON;
            if ($model->image) {
                $name = 'blog_' . uniqid() . '.' . $model->image->extension;
                $model->image->saveAs(Yii::getAlias('@webroot/uploads/' . $name));
                $model->img = $name;
            }
            $model->save(false);
            return $this->redirect(['view', 'id' => $model->id]);
        }
    }

    return $this->render('create', [
        'model' => $model,
    ]);
}
alexa777 писал(а): 2018.01.25, 20:02 General error: 1364 Field 'img' doesn't have a default value
Уберите NOT NULL у поля в базе данных.
Попробовал, конечно все грамотно написано не точто у меня в примере(это из сети взял)
Но нечего не происходит страница просто перезагружается после нажатии сохранить, и все поля так же остаются заполненными, кроме самой картинки, надо опять ее выбрать, но при повторном нажатии тоже самое и так до бесконечности, как будто валидация не пускает дальше
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Загрузка картинки

Сообщение urichalex »

В форме

Код: Выделить всё

echo $form->errorSummary($model);
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

urichalex писал(а): 2018.01.25, 20:56 В форме

Код: Выделить всё

echo $form->errorSummary($model);
как я и предполагал, валидацию не проходит потому что id и статус не сохраняются

Please fix the following errors:

Status cannot be blank.
User ID cannot be blank.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Загрузка картинки

Сообщение urichalex »

Перенеси до валидации
$model->user_id = Yii::$app->user->id;
$model->status = Item::STATUS_ON;
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

urichalex писал(а): 2018.01.26, 03:39 Перенеси до валидации
$model->user_id = Yii::$app->user->id;
$model->status = Item::STATUS_ON;
Перенес вот так
public function actionCreate()
{
$model = new Item();

if ($model->load(Yii::$app->request->post())) {
$model->user_id = Yii::$app->user->id;
$model->status = 'on';
$model->image = UploadedFile::getInstance($model, 'image');
if ($model->validate()) {

if ($model->image) {
$name = 'blog_' . uniqid() . '.' . $model->image->extension;
$model->image->saveAs(Yii::getAlias('@webroot/uploads/' . $name));
$model->img = $name;
}
$model->save(false);
return $this->redirect(['view', 'id' => $model->id]);
}
}

return $this->render('create', [
'model' => $model,
]);
}

Теперь другая ошибка

yii\base\ErrorException: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/php_curl.dll' - /usr/lib/php/20151012/php_curl.dll: cannot open shared object file: No such file or directory in Unknown:0
Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleFatalError()
#1 {main}
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

Но при этом запись в базу сохраняется во все поля
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

А вот так без валидации все срабатывает отлично

Код: Выделить всё

public function actionCreate()
{
    $model = new Item();

    if ($model->load(Yii::$app->request->post())) {
        $model->user_id = Yii::$app->user->id;
        $model->status = 'on';
        $model->image = UploadedFile::getInstance($model, 'image');
       
           
            if ($model->image) {
                $name = 'blog_' . uniqid() . '.' . $model->image->extension;
                $model->image->saveAs(Yii::getAlias('@webroot/uploads/' . $name));
                $model->img = $name;
            
            $model->save(false);
            return $this->redirect(['view', 'id' => $model->id]);
        }
    }

    return $this->render('create', [
        'model' => $model,
    ]);
}
Так нормально, не пострадает безопасность?
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Загрузка картинки

Сообщение urichalex »

Пострадает. Проверку введенных данных же не проводите.
Установите php-curl на сервер
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картинки

Сообщение alexa777 »

urichalex писал(а): 2018.01.26, 10:55 Пострадает. Проверку введенных данных же не проводите.
Установите php-curl на сервер
Установлен
Чтение информации о состоянии… Готово
Заметьте, вместо «libcurl3-dev» выбирается «libcurl4-openssl-dev»
Уже установлен пакет php-curl самой новой версии (1:7.0+35ubuntu6).
Уже установлен пакет php-mcrypt самой новой версии (1:7.0+35ubuntu6).
Уже установлен пакет curl самой новой версии (7.47.0-1ubuntu2.5).
Уже установлен пакет libcurl3 самой новой версии (7.47.0-1ubuntu2.5).
Уже установлен пакет libcurl4-openssl-dev самой новой версии (7.47.0-1ubuntu2.5).
обновлено 0, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 3 пакетов не обновлено.

но все та же ошибка
yii\base\ErrorException: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/php_curl.dll' - /usr/lib/php/20151012/php_curl.dll: cannot open shared object file: No such file or directory in Unknown:0
Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleFatalError()
#1 {main}
Но при этом запись поста происходит в БД
Ответить