Фатальная ошибка в /app/code/core/Mage/Core/Model/Resource/Resource.php в Magento - PullRequest
3 голосов
/ 25 августа 2011

Просто обновил установку Magento с 1.5 до 1.6 и оставил с этой ошибкой:

Неустранимая ошибка: вызов функции-члена insert () для необъекта в / hsphere / local /home / t21004 / XXXXXXXXXXXXX.com / app / code / core / Mage / Core / Model / Resource / Resource.php в строке 133

Содержимое строки 133 указано ниже:

 return $this->_getWriteAdapter()->insert($this->getMainTable(), $dbModuleInfo);

config.xml:

    <?xml version="1.0"?>
<!--
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     Mage_Core
 * @copyright   Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
-->
<config>
    <global>
        <install>
            <date/>
        </install>
        <resources>
            <default_setup>
                <connection>
                    <host>localhost</host>
                    <username/>
                    <password/>
                    <dbname>magento</dbname>
                    <model>mysql4</model>
                    <initStatements>SET NAMES utf8</initStatements>
                    <type>pdo_mysql</type>
                    <active>0</active>
                </connection>
            </default_setup>
            <default_write>
                <connection>
                    <use>default_setup</use>
                </connection>
            </default_write>
            <default_read>
                <connection>
                    <use>default_setup</use>
                </connection>
            </default_read>
            <core_setup>
                <setup>
                    <module>Mage_Core</module>
                </setup>
                <connection>
                    <use>default_setup</use>
                </connection>
            </core_setup>
            <core_write>
                <connection>
                    <use>default_write</use>
                </connection>
            </core_write>
            <core_read>
                <connection>
                    <use>default_read</use>
                </connection>
            </core_read>
        </resources>
        <resource>
            <connection>
                <types>
                    <pdo_mysql>
                        <adapter>Varien_Db_Adapter_Pdo_Mysql</adapter>
                        <class>Mage_Core_Model_Resource_Type_Db_Pdo_Mysql</class>
                        <compatibleMode>1</compatibleMode>
                    </pdo_mysql>
                </types>
            </connection>
        </resource>
        <models>
            <varien>
                <class>Varien</class>
            </varien>
            <core>
                <class>Mage_Core_Model</class>
                <resourceModel>core_resource</resourceModel>
            </core>
            <core_resource>
                <class>Mage_Core_Model_Resource</class>
                <deprecatedNode>core_mysql4</deprecatedNode>
                <entities>
                    <config_data>
                        <table>core_config_data</table>
                    </config_data>
                    <website>
                        <table>core_website</table>
                    </website>
                    <store>
                        <table>core_store</table>
                    </store>
                    <resource>
                        <table>core_resource</table>
                    </resource>
                    <cache>
                        <table>core_cache</table>
                    </cache>
                    <cache_tag>
                        <table>core_cache_tag</table>
                    </cache_tag>
                    <cache_option>
                        <table>core_cache_option</table>
                    </cache_option>
                </entities>
            </core_resource>
        </models>
    </global>
    <default>
        <system>
            <filesystem>
                <base>{{root_dir}}</base>
                <app>{{root_dir}}/app</app>
                <code>{{app_dir}}/code</code>
                <design>{{app_dir}}/design</design>
                <locale>{{app_dir}}/locale</locale>
                <etc>{{app_dir}}/etc</etc>
                <media>{{root_dir}}/media</media>
                <upload>{{root_dir}}/media/upload</upload>
                <skin>{{root_dir}}/skin</skin>
                <var>{{var_dir}}</var>
                <cache>{{var_dir}}/cache</cache>
                <session>{{var_dir}}/session</session>
                <tmp>{{var_dir}}/tmp</tmp>
                <pear>{{var_dir}}/pear</pear>
                <export>{{var_dir}}/export</export>
            </filesystem>
        </system>
        <general>
            <locale>
                <code>en_US</code>
                <timezone>America/Los_Angeles</timezone>
            </locale>
        </general>
    </default>
    <varien>
        <class>Varien</class>
    </varien>
</config>

и local.xml:

<?xml version="1.0"?>
<!--
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category   Mage
 * @package    Mage_Core
 * @copyright  Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
-->
<config>
    <global>
        <install>
            <date><![CDATA[Tue, 26 Apr 2011 15:59:54 +0000]]></date>
        </install>
        <crypt>
            <key><![CDATA[XXXXXXXXXXXXXXXXXXXXXXXXXXXX]]></key>
        </crypt>
        <disable_local_modules>false</disable_local_modules>
        <resources>
            <db>
                <table_prefix><![CDATA[]]></table_prefix>
            </db>
            <default_setup>
                <connection>
                    <host><![CDATA[XXXXXXXXX]]></host>
                    <username><![CDATA[XXXXXXXXXX]]></username>
                    <password><![CDATA[XXXXXXXXXX]]></password>
                    <dbname><![CDATA[XXXXXXX]]></dbname>
                    <active>1</active>
                </connection>
            </default_setup>
        </resources>
        <session_save><![CDATA[files]]></session_save>
    </global>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <frontName><![CDATA[admin]]></frontName>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

Ответы [ 7 ]

7 голосов
/ 31 августа 2011

Эта ошибка сводится к проблеме конфигурации.Модель установки пытается установить / обновить какой-либо модуль в вашей установке и завершается неудачно, когда не может найти соединение для записи для ресурса.Похоже, это указывает на одно из двух мест с неправильной конфигурацией: глобальная конфигурация (/app/etc/*.xml) или конкретная конфигурация модуля (etc / config.xml в модуле).

Проблемный модуль может иметь раздел конфигурации / config / global / resources, который содержит ссылки на соединения установки / чтения / записи.Проверьте, так ли это, и правильна ли ссылка на соединение для записи.Если это не определенный модуль, проверьте правильность глобальных ресурсов core_ (read | write | setup) и default_ (read | write | setup).

3 голосов
/ 03 сентября 2011

Пожалуйста, перейдите на \app\code\core\Mage\Core\Model\App.php, строка 402, вы увидите там

protected function _initModules() 
{
 ...

Поставьте после { этот код print_r(Mage::getConfig()->getNode('global/resources'));exit(); и покажите нам, что вы получили на экране. В моем случае я вижу следующее:

Mage_Core_Model_Config_Element Object
(
    [default_setup] => Mage_Core_Model_Config_Element Object
        (
            [connection] => Mage_Core_Model_Config_Element Object
                (
                    [host] => localhost
                    [username] => root
                    [password] => Mage_Core_Model_Config_Element Object
                        (
                        )

                    [dbname] => magento
                    [initStatements] => SET NAMES utf8
                    [model] => mysql4
                    [type] => pdo_mysql
                    [pdoType] => Mage_Core_Model_Config_Element Object
                        (
                        )

                    [active] => 1
                )

        )

    [default_write] => Mage_Core_Model_Config_Element Object
        (
            [connection] => Mage_Core_Model_Config_Element Object
                (
                    [use] => default_setup
                )

        )

    [default_read] => Mage_Core_Model_Config_Element Object
        (
            [connection] => Mage_Core_Model_Config_Element Object
                (
                    [use] => default_setup
                )

        )

    [core_setup] => Mage_Core_Model_Config_Element Object
        (
            [setup] => Mage_Core_Model_Config_Element Object
                (
                    [module] => Mage_Core
                )

            [connection] => Mage_Core_Model_Config_Element Object
                (
                    [use] => default_setup
                )

        )

    [core_write] => Mage_Core_Model_Config_Element Object
        (
            [connection] => Mage_Core_Model_Config_Element Object
                (
                    [use] => default_write
                )

        )

    [core_read] => Mage_Core_Model_Config_Element Object
        (
            [connection] => Mage_Core_Model_Config_Element Object
                (
                    [use] => default_read
                )

        )

    [db] => Mage_Core_Model_Config_Element Object
        (
            [table_prefix] => Mage_Core_Model_Config_Element Object
                (
                )

        )

)
1 голос
/ 14 января 2015

Другая возможность состоит в том, что ваш каталог magento / lib не обновляется. Если вы выполняли ручной процесс, как я, вы, возможно, пропустили обновление этого каталога. Я обнаружил, что существует несколько причин, по которым объект подключения может быть пустым:

  • Неправильная конфигурация (может отсутствовать материал, необходимый для 1.6+, может иметь неверную информацию, может быть кэширован со старыми данными) - кажется, что var/cache файлы также могут быть ответственны, в зависимости от того, как настроено ваше кэширование.
  • Что-то действительно запутано в конфигурации модуля. В нашем случае это не было проблемой: core_setup был обновляемым модулем.
  • Старые версии файлов классов (кажется, применимы для обновления с версии ниже 1.6 до 1.6+), в частности, при создании или получении объектов подключения он смотрит, расширяет ли он новый интерфейс, Varien_Db_Adapter_Interface.
  • Как всегда, существует возможность испортить права доступа к файлам.

В третьем случае быстрая проверка app/code/core/Mage/Core/Model/Resource.php показывает причины, по которым члены данных _connection могут быть недействительными. Одна из основных проверок, которую он выполняет, состоит в том, чтобы увидеть, является ли созданный объект соединения экземпляром (включает в себя подкласс) Varien_Db_Adapter_Interface. Из библиотек для 1.4.1.1 (в нашем случае)

class Varien_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql

но в 1.6 +

class Varien_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql implements Varien_Db_Adapter_Interface

ergo, проверка не пройдена, и даже при правильной конфигурации вы не получите объекты подключения. Это плохое программирование с их стороны, что оно не REPORT этой проблемы ОЧЕНЬ СПЕЦИАЛЬНО , поскольку оно создает поведение состояния ошибки , идентичное, но никак не связанное с , еще одна распространенная ошибка: неправильная настройка соединения с базой данных. Это не похоже на пассивную проверку. Они явно проверяют наличие нового интерфейса, но затем не регистрируют и не генерируют какую-либо потенциальную отладочную информацию, касающуюся этого.

В качестве заключительного замечания, во время обновления, если у вас много вещей, вы можете явно записать этот сбой в случае, если что-то в вашем коде каким-то образом использует старый адаптер БД. (в нашем случае некоторый код, написанный другим подрядчиком, переопределил адаптер в пространстве имен local, что снова вызвало эту ошибку.)

1 голос
/ 15 июня 2012

Будьте осторожны с правами доступа к файлам, у меня была такая же проблема. Просто убедитесь, что вы устанавливаете magento с соответствующими правами доступа к файлу (например, пользователь является владельцем файлов)

0 голосов
/ 07 июля 2016

Я тоже сталкиваюсь с подобной проблемой.

В моем случае при установке Magento, когда я заполнил все детали БД и нажал на кнопку «Продолжить», я получал ниже Фатальная ошибка:

PHP Fatal error:  Call to a member function insert() on boolean in /var/www/public_html/app/code/core/Mage/Core/Model/Resource/Resource.php on line 133"

Magento пытался подключиться с помощью адаптера записи / чтения, но подключение не установлено, поскольку файл local.xml был пуст.

В файле app \ code \ core \ Mage \ Install \ Model \ Installer \ Config.php в строке 103 magento пытается извлечь содержимое файла local.xml.template и создать узлы файла local.xml.

    $template = file_get_contents(Mage::getBaseDir('etc') . DS . 'local.xml.template');
    foreach ($data as $index => $value) {
        $template = str_replace('{{' . $index . '}}', '<![CDATA[' . $value . ']]>', $template);
    }
    file_put_contents($this->_localConfigFile, $template);

Итак, я проверил, что там нет файла app / etc / local.xml.template, потому что мы не сохранили его в нашем git-коде. После размещения файла local.xml.template проблема устранена.

Надеюсь, это поможет другим.

0 голосов
/ 12 апреля 2016

У меня возникла эта проблема, когда я переписал метод _construct из родительского класса Model Resource, но я забыл вставить, добавить собственную настраиваемую логику, строку Essentail в каждый конструктор модели Resource:

$this->_init('catalog/category_flat', 'entity_id');

Когда я положил это обратно, все работало как шарм.

0 голосов
/ 24 июня 2015

Для меня решение было установить соединение с базой данных в config.xml, чтобы <active>1</active>

IMHO Magento должен вызывать исключение в Mage_Core_Model_Resource, когда соединение не активно, вместо того, чтобы просто возвращать false и распространять этоложное значение в том месте, где ожидается объект.

...