Два экземпляра PHP CRUD в синглтоне

Я использую класс CRUD, написанный на PHP с использованием шаблона singleton. Это мой файл CRUD и файл подключения.

https://pastebin.com/ZqSCnjqf - CONN

https://pastebin.com/301Maf59 - CRUD

Дело в том, что когда я использую SELECT, который не требует определенного выбора таблицы, у меня может быть столько выборок, сколько я хочу. Как это:

$pdo        = Connection::getInstance();
$crud       = Crud::getInstance($pdo);
# ----------------------------------------
$sql        = "SELECT * FROM images WHERE prod_id = ?";
$arrayParam = array($prod_id);
$data_img   = $crud->getSQLGeneric($sql, $arrayParam, true);

Но когда мне нужно удалить, вставить или обновить, я должен установить таблицу в CRUD, например, это удаление:

$pdo        = Connection::getInstance();
$crud       = Crud::getInstance($pdo,'images');
# ----------------------------------------
$arrayImg   = array('img_id=' => $img_id);
$return     = $crud->delete($arrayImg);

Я не могу выполнить два оператора одновременно. Скажем, мне нужно сделать вставку и удаление в одном блоке кода, он запускает только один из них.

Я застрял на этом этапе, когда мой код должен найти все изображения в БД с идентификатором продукта, удалить их за один раз, отсоединив файл в папке, а затем удалить продукт из таблицы.

$prod_id    = $_GET['prod'];
# -----
$pdo        = Connection::getInstance();
# ----------------------------------------
$crud       = Crud::getInstance($pdo);
# -----
$sql        = "SELECT * FROM images WHERE prod_id = ?";
$arrayParam = array($prod_id);
$data_img   = $crud->getSQLGeneric($sql, $arrayParam, true);
# -----
foreach($data_img as $img_info)
{
  unlink('../../img/'.$img_info->img_name);
  $arrayImg = array('img_id=' => $img_info->img_id);
  $return2  = $crud->delete($arrayImg);
}
# ----------------------------------------
$crud       = Crud::getInstance($pdo,'products');
# -----
$arrayDel   = array('prod_id=' => $prod_id);
$return     = $crud->delete($arrayDel);
# ----------------------------------------
echo 'Deleted';

Есть ли способ сделать это с помощью CRUD? Как правильно с этим работать?

Любая помощь приветствуется!

Спасибо!

Я не могу понять, зачем вам синглтон для класса Crud, не могли бы вы объяснить?

Yanis-git 19.06.2018 14:42

В этом нет необходимости. Просто уже давно этим пользуюсь и нормально работаю.

kaue-porte 19.06.2018 14:43

Работал нормально до сих пор =) Теперь, когда я нашел ограничение, пытаюсь выяснить, можно ли его улучшить, или это тупик. Довольно просто понять.

kaue-porte 19.06.2018 14:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
169
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используемый вами класс Crud позволяет хранить в нем только один экземпляр. После этого никаких модификаций. Это делается из этой части кода:

public static function getInstance($connection, $table=null)
  {
    # Verifying if there's a class instance
   if (!isset(self::$crud))
    {
      try
      {
        self::$crud = new Crud($connection, $table);
      }
      catch (Exception $e)
      {
        echo 'Error '.$e->getMessage();
      }
    }
    return self::$crud;
  }

При первом вызове getInstance он устанавливает экземпляр внутри статического класса, а все последующие вызовы после него возвращают экземпляр, уже установленный с первого вызова. Неважно, даете ли вы вообще разные соединения или таблицы.

В этом случае вам придется использовать новые экземпляры Crud для разных таблиц / соединений. Не используйте getInstance, а вместо этого создайте новый экземпляр с new Crud(...).

Ответ принят как подходящий

Я предлагаю вам изменить логику синглтона этим.

class Crud
{
    private $pdo         = null; # Storing PDO connection
    private $table       = null; # Storing table name
    private static $crud = []; # Static attribute that contains a self instance

  # ----------------------------------------
    # Class constructor -> PUBLIC method
    # ----------------------------------------
    public function __construct($connection, $table = 'default')
    {
        if (!empty($connection)) {
            $this->pdo = $connection;
        } else {
            echo 'Conexão inexistente!';
            exit();
        }

        if (!empty($table) && $table !== 'default') {
            $this->table =$table;
        }
    }

    # ----------------------------------------
    # Static public method that returns a Crud class instance
    # ----------------------------------------
    public static function getInstance($connection, $table = 'default')
    {
        # Verifying if there's a class instance
        if (!isset(self::$crud[$table])) {
            try {
                self::$crud[$table] = new Crud($connection, $table);
            } catch (Exception $e) {
                echo 'Error '.$e->getMessage();
            }
        }
        return self::$crud[$table];
    }
}

Я преобразовал ваше частное статическое свойство $crud в массив и сохранил каждый экземпляр, изолирующий по имени таблицы.

Здесь выделено важное изменение:

        if (!isset(self::$crud[$table])) {
            try {
                self::$crud[$table] = new Crud($connection, $table);
            } catch (Exception $e) {
                echo 'Error '.$e->getMessage();
            }
        }

Итак, следующий код будет работать так:

Crud::getInstance($pdo); // Create new instance and store it on key 'default'
Crud::getInstance($pdo); // Just return 'default' instance

Crud::getInstance($pdo,'foo'); // Create new instance and store it on key 'foo'
Crud::getInstance($pdo,'foo'); // Just return 'foo' instance

Это сработало очень хорошо. Большое спасибо! Как вы думаете, может быть хорошей идеей создать файл конфигурации, в котором уже установлены все сырые / таблицы, которые я буду использовать в своем приложении?

kaue-porte 19.06.2018 16:15

Другие вопросы по теме