Only variables should be passed by reference in lib/Varien/Db/Adapter/Pdo/Mysql.php on line 2841

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Алексей Пересыпкин
  • Группа: Клиент
  • Сообщений: 5
  • Регистрация: 09.12.2014

13.12.2014 20:51

Добрый день!
Ошибка после установки сборки:

Exception Object
(
[message:protected] => Strict Notice: Only variables should be passed by reference in /home/ebidet/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php on line 2841
[string:private] =>
[code:protected] => 0
[file:protected] => /home/ebidet/public_html/app/code/core/Mage/Core/functions.php
[line:protected] => 245
[trace:private] => Array
(
[0] => Array
(
[file] => /home/ebidet/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php
[line] => 2841
[function] => mageCoreErrorHandler
[args] => Array
(
[0] => 2048
[1] => Only variables should be passed by reference
[2] => /home/ebidet/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php
[3] => 2841
[4] => Array
(
[fieldName] => main_table.store_id
[condition] => Array
(
[gt] => 0
)

[conditionKeyMap] => Array
(
[eq] => {{fieldName}} = ?
[neq] => {{fieldName}} != ?
[like] => {{fieldName}} LIKE ?
[nlike] => {{fieldName}} NOT LIKE ?
[in] => {{fieldName}} IN(?)
[nin] => {{fieldName}} NOT IN(?)
[is] => {{fieldName}} IS ?
[notnull] => {{fieldName}} IS NOT NULL
[null] => {{fieldName}} IS NULL
[gt] => {{fieldName}} > ?
[lt] => {{fieldName}} < ?
[gteq] => {{fieldName}} >= ?
[lteq] => {{fieldName}} <= ?
[finset] => FIND_IN_SET(?, {{fieldName}})
[regexp] => {{fieldName}} REGEXP ?
[from] => {{fieldName}} >= ?
[to] => {{fieldName}} <= ?
[seq] =>
[sneq] =>
)

[query] =>
)

)

)

[1] => Array
(
[file] => /home/ebidet/public_html/lib/Varien/Data/Collection/Db.php
[line] => 483
[function] => prepareSqlCondition
[class] => Varien_Db_Adapter_Pdo_Mysql
[type] => ->
[args] => Array
(
[0] => main_table.store_id
[1] => Array
(
[gt] => 0
)

)

)

[2] => Array
(
[file] => /home/ebidet/public_html/lib/Varien/Data/Collection/Db.php
[line] => 414
[function] => _getConditionSql
[class] => Varien_Data_Collection_Db
[type] => ->
[args] => Array
(
[0] => main_table.store_id
[1] => Array
(
[gt] => 0
)

)

)

[3] => Array
(
[file] => /home/ebidet/public_html/lib/Varien/Data/Collection/Db.php
[line] => 385
[function] => _translateCondition
[class] => Varien_Data_Collection_Db
[type] => ->
[args] => Array
(
[0] => main_table.store_id
[1] => Array
(
[gt] => 0
)

)

)

[4] => Array
(
[file] => /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Store/Collection.php
[line] => 84
[function] => addFieldToFilter
[class] => Varien_Data_Collection_Db
[type] => ->
[args] => Array
(
[0] => main_table.store_id
[1] => Array
(
[gt] => 0
)

)

)

[5] => Array
(
[file] => /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Store/Collection.php
[line] => 166
[function] => setWithoutDefaultFilter
[class] => Mage_Core_Model_Resource_Store_Collection
[type] => ->
[args] => Array
(
)

)

[6] => Array
(
[file] => /home/ebidet/public_html/lib/Varien/Data/Collection.php
[line] => 741
[function] => load
[class] => Mage_Core_Model_Resource_Store_Collection
[type] => ->
[args] => Array
(
)

)

[7] => Array
(
[file] => /home/ebidet/public_html/app/code/local/Df/Catalog/Model/Setup/2/23/5.php
[line] => 25
[function] => getIterator
[class] => Varien_Data_Collection
[type] => ->
[args] => Array
(
)

)

[8] => Array
(
[file] => /home/ebidet/public_html/app/code/local/Df/Catalog/Model/Setup/2/23/5.php
[line] => 7
[function] => processCategories
[class] => Df_Catalog_Model_Setup_2_23_5
[type] => ->
[args] => Array
(
)

)

[9] => Array
(
[file] => /home/ebidet/public_html/app/code/local/Df/Catalog/sql/df_catalog_setup/mysql4-data-upgrade-1.0.0-2.23.5.php
[line] => 11
[function] => process
[class] => Df_Catalog_Model_Setup_2_23_5
[type] => ->
[args] => Array
(
)

)

[10] => Array
(
[file] => /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Setup.php
[line] => 624
[args] => Array
(
[0] => /home/ebidet/public_html/app/code/local/Df/Catalog/sql/df_catalog_setup/mysql4-data-upgrade-1.0.0-2.23.5.php
)

[function] => include
)

[11] => Array
(
[file] => /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Setup.php
[line] => 392
[function] => _modifyResourceDb
[class] => Mage_Core_Model_Resource_Setup
[type] => ->
[args] => Array
(
[0] => data-upgrade
[1] =>
[2] => 2.23.5
)

)

[12] => Array
(
[file] => /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Setup.php
[line] => 289
[function] => _installData
[class] => Mage_Core_Model_Resource_Setup
[type] => ->
[args] => Array
(
[0] => 2.23.5
)

)

[13] => Array
(
[file] => /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Setup.php
[line] => 269
[function] => applyDataUpdates
[class] => Mage_Core_Model_Resource_Setup
[type] => ->
[args] => Array
(
)

)

[14] => Array
(
[file] => /home/ebidet/public_html/app/code/core/Mage/Core/Model/App.php
[line] => 351
[function] => applyAllDataUpdates
[class] => Mage_Core_Model_Resource_Setup
[type] => ::
[args] => Array
(
)

)

[15] => Array
(
[file] => /home/ebidet/public_html/app/Mage.php
[line] => 684
[function] => run
[class] => Mage_Core_Model_App
[type] => ->
[args] => Array
(
[0] => Array
(
[scope_code] =>
[scope_type] => store
[options] => Array
(
)

)

)

)

[16] => Array
(
[file] => /home/ebidet/public_html/index.php
[line] => 87
[function] => run
[class] => Mage
[type] => ::
[args] => Array
(
[0] =>
[1] => store
)

)

)

)
Error in file: "/home/ebidet/public_html/app/code/local/Df/Catalog/sql/df_catalog_setup/mysql4-data-upgrade-1.0.0-2.23.5.php" - Strict Notice: Only variables should be passed by reference in /home/ebidet/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php on line 2841

#0 /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Setup.php(645): Mage::exception('Mage_Core', 'Error in file: ...')
#1 /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Setup.php(392): Mage_Core_Model_Resource_Setup->_modifyResourceDb('data-upgrade', false, '2.23.5')
#2 /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Setup.php(289): Mage_Core_Model_Resource_Setup->_installData('2.23.5')
#3 /home/ebidet/public_html/app/code/core/Mage/Core/Model/Resource/Setup.php(269): Mage_Core_Model_Resource_Setup->applyDataUpdates()
#4 /home/ebidet/public_html/app/code/core/Mage/Core/Model/App.php(351): Mage_Core_Model_Resource_Setup::applyAllDataUpdates()
#5 /home/ebidet/public_html/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#6 /home/ebidet/public_html/index.php(87): Mage::run('', 'store')
#7 {main}

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

14.12.2014 10:58

Это дефект ядра Magento Community Edition.
В указанной интерпетатором PHP дефектной точке программы расположен код:
$key = key(array_intersect_key($condition, $conditionKeyMap));

Согласно спецификации языка PHP, функция key принимает свой единственный параметр по ссылке:
mixed key ( array &$array )

Согласно спецификации языка PHP по ссылке можно передавать лишь переменные, выражения new и ссылки, возвращаемые другими функциями:
Об этом (в упрощённой, не совсем точной и корректной форме) и предупреждает диагностическое сообщение: «Only variables should be passed by reference» (сообщение не совсем точно, потому что ради краткости не упоминает о редко используемых возможностях передавать по ссылке вызовы new и ссылки, возвращаемые другими функциями).
В то же время дефектный программный код Magento Community Edition ошибочно передаёт функции key не переменную, а результат выполнения другой функции array_intersect_key.
Согласно своей спецификации результат функции array_intersect_key не обозначен как ссылка (не указан символ амперсанда; обратите внимание, что в приведённой выше спецификации функции key у параметра символ амперсанда указан):
array array_intersect_key ( array $array1 , array $array2 [, array $... ] )

Поэтому вызов функции key с параметром в качестве вызова функции array_intersect_key является нарушением спецификации языка PHP.
На мой взгляд, разработчикам интерпретатора PHP стоило бы доработать интерпретатор и изменить спецификацию, чтобы подобные вызовы можно было осуществлять, однако в настоящее время интерпретатор PHP работает именно так, и это задокументировано, поэтому дефектным является именно поведение Magento, а не интерпретатора PHP.
Для устранения данного сбоя надо разбить общую дефектную операцию на две: сначала присвоить некой переменной результат работы функции array_intersect_key, а затем передать эту переменную в качестве параметра функции key.
Например:
$array_intersect_key = array_intersect_key($condition, $conditionKeyMap);
$key = key($array_intersect_key);


Поделиться темой: