Неустранимая ошибка в /app/code/core/Mage/Core/Model/Resource/Resource.php в Magento

Только что обновил установку 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);

конфиг.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 [email protected] 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>

и локальный.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 [email protected] 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>

person chris    schedule 25.08.2011    source источник
comment
Не могли бы вы опубликовать свои файлы /app/etc/config.xml и /app/etc/local.xml (конечно, отредактировано)   -  person Lee Saferite    schedule 30.08.2011
comment
Я также столкнулся с той же проблемой. В моем случае в app/etc/local.xml.template файла не было, поэтому magento создавал пустой файл local.xml. Magento пытался подключиться с помощью адаптера записи/чтения, но соединение не было установлено, поскольку файл local.xml был пуст. В файле app\code\core\Mage\Install\Model\Installer\Config.php в строке 103 magento пытается получить содержимое файла local.xml.template и создает файл local.xml. Это происходит потому, что мы не сохранили файл local.xml.template как часть нашего кода git.   -  person Satish Sojitra    schedule 07.07.2016
comment
У меня та же проблема, тот же файл, та же строка. Должно быть что-то не так с самим Magento. Я удалил все сторонние (локальные и общественные) модули, удалив их файлы .xml из каталога app/etc/modules, оставив внутри только собственные модули magento. Проблема все еще сохраняется.   -  person Vladimir Despotovic    schedule 16.10.2017


Ответы (7)


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

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

person Lee Saferite    schedule 30.08.2011
comment
Что ж, проблема, которую я обнаружил, заключалась в том, что новый параметр для подключения к базе данных устанавливается начиная с Magento 1.6. Пожалуйста, проверьте эти добавленные параметры в вашем файле local.xml <model><![CDATA[mysql4]]></model> <type><![CDATA[pdo_mysql]]></type> <pdoType><![CDATA[]]></pdoType> - person Subesh Pokhrel; 05.09.2011
comment
Эта информация мне очень помогла. Спасибо, Субеш! - person MagePsycho; 28.03.2012

Пожалуйста, перейдите на \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
                (
                )

        )

)
person Dmytro Zavalkin    schedule 03.09.2011
comment
Вы просите разъяснений по проблеме, не давая ответа. Это должен был быть комментарий к вопросу. - person Lee Saferite; 08.09.2011
comment
@Lee Saferite Я знаю, но этот вопрос нельзя вставить в поле для комментариев из-за ограничения количества символов. Виноват интерфейс stackoverflow... В следующий раз лучше вообще ничего не спрашивать в этом случае, спасибо всем, кто нажал -1. - person Dmytro Zavalkin; 09.09.2011
comment
@Zyava, не теряй сердца, приятель, +1 за твой вклад - person Zaffar Saffee; 19.10.2012

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

В моем случае при установке 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 проблема решилась.

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

person Satish Sojitra    schedule 07.07.2016
comment
Также проверьте права доступа к файлу local.xml и владельца. - person kiatng; 21.01.2020
comment
Ждать! Разве сценарий install.php не должен заботиться о создании файла local.xml? - person mhyousefi; 07.04.2020

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

person gurbieta    schedule 15.06.2012

Другая возможность заключается в том, что ваш каталог 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

следовательно, проверка завершается неудачно, и даже при допустимых конфигурациях вы не получаете объекты соединения. Плохое программирование с их стороны, что они не СООБЩАЮТ об этой проблеме, ОЧЕНЬ КОНКРЕТНО, поскольку это создает поведение состояния ошибки, идентичное, но никак не связанное с , еще одна распространенная ошибка: неправильная настройка подключения к базе данных. Это не пассивная проверка. Они явно проверяют наличие нового интерфейса, но затем не регистрируют и не создают никакой потенциальной отладочной информации о нем.

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

person Community    schedule 14.01.2015

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

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

person mort    schedule 24.06.2015

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

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

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

person Bartosz Kubicki    schedule 12.04.2016