Я использую класс 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 позволяет хранить в нем только один экземпляр. После этого никаких модификаций. Это делается из этой части кода:
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
Это сработало очень хорошо. Большое спасибо! Как вы думаете, может быть хорошей идеей создать файл конфигурации, в котором уже установлены все сырые / таблицы, которые я буду использовать в своем приложении?
Я не могу понять, зачем вам синглтон для класса
Crud, не могли бы вы объяснить?