@dev400

Как быть с картинкой при записи в базу?

В базу записываются строки, и путь к картинке.
скрипт загрузки картинки:
<?php
namespace Common;

class Upload {
    
    public function make($uploadDir, $file) {

        $pathToUpload = $uploadDir . basename($file['name']);

        if( move_uploaded_file($file['tmp_name'], $pathToUpload) ) {

            return $pathToUpload;

        }

        return false;
        
    }

}

Возвращает путь к файлу.

Кусок модели сохранения в базу:
$params = [
                "id" => $array['category_id'],
                "cat_name" => $array['category_name'],
                "cat_url" => $array['category_url'],
                "image_url" => $array['image_url'],
                "parent_cat" => $array['parent_cat'],
            ];

            $sql = "UPDATE {$this->table} SET `cat_name` = :cat_name, `cat_url` = :cat_url, `image_url` = :image_url, `parent` = :parent_cat WHERE `id` = :id";


Так вот, загрузили мы картинку, все хорошо. В следующий раз мы хотим поменять какую то строку, но картинку мы загружать не будем.
И соответственно получим ошибку, что image_url не передался. Как сделать так, чтобы image_url был не обязательным параметром при сохранении?

В голову приходит простыня:
public function updateCategory(Array $array) {

        if ( isset($array['image_url']) ) {

            $params = [
                "id" => $array['category_id'],
                "cat_name" => $array['category_name'],
                "cat_url" => $array['category_url'],
                "image_url" => $array['image_url'],
                "parent_cat" => $array['parent_cat'],
            ];

            $sql = "UPDATE {$this->table} SET `cat_name` = :cat_name, `cat_url` = :cat_url, `image_url` = :image_url, `parent` = :parent_cat WHERE `id` = :id";

        } else {

            $params = [
                "id" => $array['category_id'],
                "cat_name" => $array['category_name'],
                "cat_url" => $array['category_url'],
                "parent_cat" => $array['parent_cat'],
            ];

            $sql = "UPDATE {$this->table} SET `cat_name` = :cat_name, `cat_url` = :cat_url, `parent` = :parent_cat WHERE `id` = :id";

        }


        if( !parent::save( $params, $sql ) ) {

            throw new \Exception('Ошибка редактирования категории');

        }

    }


Но это же трэш. Помогите!
  • Вопрос задан
  • 307 просмотров
Решения вопроса 3
taliban
@taliban
php программист
$params = [
                "id" => $array['category_id'],
                "cat_name" => $array['category_name'],
                "cat_url" => $array['category_url'],
                "image_url" => $array['image_url'],
                "parent_cat" => $array['parent_cat'],
            ];
if ($image) {
    $params["image_url"] = $image;
}
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$params["image_url"] = (isset($array['image_url']) ? $array['image_url'] : NULL);

UPDATE ... `image_url` = IFNULL(:image_url, `image_url`) ...
Ответ написан
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
if(isset($_FILE['name']))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
$params = [
    "id" => $array['category_id'],
    "cat_name" => $array['category_name'],
    "cat_url" => $array['category_url'],
    "image_url" => $array['image_url'],
    "parent_cat" => $array['parent_cat'],
];

$a = [];
foreach ($params as $k => $v) {
    $a[] = "`$k` = :$k";
}

if (count($a)) {
    $s = implode(", ", $a);
    $sql = "UPDATE {$this->table} SET $s WHERE `id` = :id";
}


И нет никаких костылей. Правда в этом случае стоит еще проверить, что каждая $k и правда есть в таблице.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы