Запрос к базе данных Joomla возвращает старое значение после обновления

Я реализую базовый прослушиватель (civicrm_post ловушка), которая срабатывает после обновления/добавления строки БД. Проблема, с которой я сталкиваюсь, заключается в том, что даже если строка в таблице была изменена, загрузка той же строки через объект базы данных Joomla возвращает предыдущее значение.

Допустим, я меняю имя объекта с «foo» на «bar».

$db =& JFactory::getDBO();
$db->setQuery("SELECT ...");

возвращает 'foo' в качестве имени, тогда как

$c = mysql_connect("host","user","password");
mysql_select_db("db", $c);
$result = mysql_query("SELECT ...");

возвращает «бар».

Происходит ли какое-либо кэширование и можно ли его как-то очистить?

Для справки:

  • Джумла 2.5.6
  • PHP 5.3.10
  • MySQL 5.1.36

Изменить: вот тема, которую я начал на форумах CiviCRM, которая содержит более подробную информацию: http://forum.civicrm.org/index.php/topic,25200.0.html

Редактировать 2: «Последние события» и некоторые пояснения.

Я использую хук для отправки обновленной ленты iCal, которая предоставляется интерфейсным компонентом CiviCRM. Он не обновляется, когда срабатывает хук, даже если база данных обновляется в этот момент и нет кэширования на обоих концах. Судя по всему, CiviCRM использует свой собственный коннектор базы данных, поэтому приведенная выше формулировка больше не является строго действительной. Использование хука, который срабатывает немного позже (civicrm_postProcess), решило проблему, но это «хакерское» исправление.


person Celos    schedule 29.06.2012    source источник
comment
Проблема не в кэшировании. На самом деле я очень уверен, что вы должны запрашивать две разные базы данных, таблицы или записи. Я очень уверен, что это не проблема Joomla.   -  person Søren Beck Jensen    schedule 06.07.2012


Ответы (1)


Как я понимаю, есть три варианта:

  1. @SørenBeckJensen, наверное, прав! попробуйте запустить:
    select DATABASE() from dual
    и посмотрите, какая БД вызывается каждым.

  2. Другой вариант — autocommit отключен, и в этом случае вам нужно зафиксировать:
    $db->setQuery("COMMIT");

  3. 3-й вариант - INSERT написано неправильно (в первом случае) и не получается. Но мне нужно увидеть запрос, чтобы быть уверенным.

person Nir Alfasi    schedule 14.07.2012
comment
Я отредактировал вопрос, добавив ссылку на форумы сообщества CiviCRM, где я начал обсуждение этой проблемы. Проблема, вероятно, заключается в другой области кода, тем более, что CiviCRM, по-видимому, использует собственную оболочку БД. Что касается сделанных вами замечаний, запросы верны и нацелены на правильную БД. - person Celos; 16.07.2012
comment
(а) вы уверены, что нет состояния гонки? и (b) пытались ли вы commit перед вызовом select ? Я бы печатал, чтобы регистрировать время выполнения каждого действия, просто чтобы убедиться, что хук действительно вызывается после обновления. - person Nir Alfasi; 16.07.2012
comment
Крючки срабатывают корректно. Дело в том, что если я вызову CRM_Event_Page_ICalendar напрямую (вещь, которая создает канал iCal), результат будет таким, каким он должен быть, тогда как вызов того же канала через предоставленный URL-адрес создает канал со старыми значениями. У меня нет фактического контроля над запросами, так как я не хочу изменять базовый код (вся цель этого состоит в том, чтобы отойти от сложного в обслуживании пользовательского компонента, который настроил предыдущий разработчик). - person Celos; 16.07.2012
comment
@Celos, если вы не можете добавить распечатки в журнал, боюсь, будет очень сложно найти корень проблемы ... - person Nir Alfasi; 16.07.2012