0

我们正在使用 Zend Framework 2 和多个数据库创建一个 Web 应用程序。我有一个core加载所有客户信息的数据库。该数据库包含customer表。客户表的字段是::

  1. ID
  2. 用户名
  3. 密码
  4. 数据库名称
  5. 顾客姓名
  6. .....................

当客户登录时,我必须从数据库中加载他的数据库名称core,然后向数据库发出查询请求。

我也不能有多个适配器,因为所有客户都有自己的数据库,我必须从customer!core_db

我以为我会在数据库名称前面加上表名。

我试过这个Module.php

"CategoryTableGateway" => function ($sm) {
                $dbAdapter = $sm->get("Zend\Db\Adapter\Adapter");
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Category());
                return new TableGateway("databasename.category", $dbAdapter, null, $resultSetPrototype);
            }

我在我的配置默认数据库config\autoload\database.global.php是这样的:

    'db' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=core_db;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
)

我有一个例外,例如:

Base table or view not found: 1146 Table 'core_db.databasename.category' doesn't exist.

然后,我dbname=core_dbconfig\autoload\database.global.php.

现在,我遇到了另一个例外,例如:

SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected

那么我如何在 Zend Framework 2 中处理这种情况。我是 Zend Framework 2 的新手。

Edit: 我自己解决了我的问题。

要连接到另一个模式的表,您需要传递TableIdentifier而不是表!

例如,

代替:

 $CategoryTableGateway = new TableGateway("category", $dbAdapter, null, $resultSetPrototype);

你所要做的:

$CategoryTableIdentifier = new TableIdentifier('category','dbname');
$CategoryTableGateway = new TableGateway($CategoryTableIdentifier, $dbAdapter, null, $resultSetPrototype);

希望它有效!

4

1 回答 1

-1

当客户登录时,我必须从核心数据库加载他的数据库名称,然后向数据库发出查询请求。

这就是你做错了。

只需将所有内容保存在单个数据库中,就像世界上的电子商务网站一样。

于 2013-10-26T10:47:26.427 回答