php - Magento 为媒体使用第二个数据库 - SQLSTATE [42S02] : Base table or view not found

标签 php mysql magento

AWS 上 7 台服务器上的 Magento 4 HTTPD 1 内存缓存 1个主数据库 1 个媒体数据库

上传图片有效,在管理中加载缩略图,然后在保存时导致错误: SQLSTATE[42S02]: 未找到基表或 View :1146 表 'magento.core_file_storage' 不存在

我知道 table 在那里。我能看到它。 core_file_storage ~471,510 InnoDB utf8_general_ci 2.1 GiB

有什么想法吗?有什么想法可以反弹吗?

---编辑

不再出现SQL错误,保存成功但图片为空。

---使用 local.xml 调用第二个数据库:

    <media_storage>
        <connection>
            <host><![CDATA[127.0.0.1]]></host>
            <username><![CDATA[root]]></username>
            <password><![CDATA[password]]></password>
            <dbname><![CDATA[magento]]></dbname>
            <initStatements><![CDATA[SET NAMES utf8]]></initStatements>
            <model><![CDATA[mysql4]]></model>
            <type><![CDATA[pdo_mysql]]></type>
            <pdoType><![CDATA[]]></pdoType>
            <active>1</active>
        </connection>
    </media_storage>

最佳答案

我遇到了同样的问题并且(以某种方式)在主数据库(以及我的媒体数据库)中创建了表。这掩盖了真正的问题(为什么 Magento 在错误的数据库中寻找这些表)但一切似乎都在工作。直到……

如果您尝试一次上传多张图片,则只有第一张图片被正确存储。如果您尝试对不同的产品使用相同的文件名,这些也不会起作用。最终,我决定进行一些调试,我发现文件从表中重新加载并调用 setData($row) 以在当前实例上填充它。当它这样做时,Magento 会清除连接名称(它也存储在数据数组中)并且在您的情况下以前被称为“media_storage”。

当它试图保存这个模型时它失败了,因为它现在使用了错误的连接并且那些表不存在。如果您已完成解决方法并且它们确实存在,则该功能显然不存在并且您会丢失缩略图。如果你检查你的媒体数据库,你会看到每个文件的行,但只有第一个文件被重命名为“tmp”。

我的解决方案(目前)是将以下方法添加到 Mage/Core/Model/File/Storage/Database/Abstract.php。这确保在 setData 之后它将重置连接名称(如果已填充)。我只是简单地对此进行了测试,但到目前为止它似乎已经成功,我遇到的两个问题都已得到解决。

/**
 * Ensure that the connection name is retained if the set data is setting the entire row.
 */
public function setData($key, $value=null)
{
    $connectionName = $this->getConnectionName();
    parent::setData($key, $value);
    $this->setConnectionName($connectionName);
    return $this;
}

关于php - Magento 为媒体使用第二个数据库 - SQLSTATE [42S02] : Base table or view not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12305623/

相关文章:

php - 除了带有远程链接的 anchor 之外,我如何去除标签?

php - 将查询中的值放入数组

php - Mage_Paypal_Block_Express_Shortcut 中的 getShortcutHtmlId() 在哪里?

php - 如果我在 mysqli::query 中使用 SELECT 语句,默认的 ORDER BY 是什么

php - php中的递归函数在不使用静态的情况下存储结果

mysql - 在命令行中使用 R 编写 mysql 的导出过程

php - Cakephp 查找条件的空安全运算符

php - 字符编码 - 我不明白

Magento模块卸载

php - 如何判断 Magento 请求是针对前端页面还是后端页面?