singleton中PHP CRUD的两个实例

singleton中PHP CRUD的两个实例,php,instance,crud,Php,Instance,Crud,我使用的是一个使用单例模式用PHP编写的CRUD类。 这是我的CRUD文件和连接文件 -康涅狄格州 -积垢 问题是:当我使用SELECT时,它不需要特定的表选择,我可以有我想要的选择数。像这样: $pdo = Connection::getInstance(); $crud = Crud::getInstance($pdo); # ---------------------------------------- $sql = "SELECT * FROM

我使用的是一个使用单例模式用PHP编写的CRUD类。 这是我的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);
我不能同时执行这两条语句。假设我需要在同一个代码块中进行插入和删除,它只运行其中一个

我的代码必须在DB中找到具有产品id的所有图像,在断开文件夹上的文件链接的同时逐个删除它们,然后从表中删除产品

$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
类只允许在其中存储一个实例。之后没有修改。这是从代码的这一部分完成的:

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
类,你能解释一下吗?这不是一个需要。只是我已经用了一段时间了,工作很好。工作很好直到现在=)现在我发现了一个局限性,我试图找出是否有可能改进它,或者它是否是一条死胡同。很容易理解,效果很好。非常感谢你!您认为创建一个已经设置了我将在应用程序上使用的所有CRUD/表的配置文件是一个好主意吗?