2013-03-07 2 views
1

У меня есть эта проблема в PostgreSQL, где я обрабатываю метатеги webpages, а затем вводя запрос в pg_query. Для краткости в этом примере данные не подвергаются дезинфекции.PHP pg_query не исполняется

Так что-то вроде этого:

foreach ($metas as $meta) { 
    $property = $meta->getAttribute('property'); 
    $content = $meta->getAttribute('content'); 

$query = "UPDATE " . $tablename . " SET article_meta = article_meta || '$property=>$content'::hstore where article_id = '{$this -> article_id}' ;"; 

pg_query($conn, $query); 

} 

Проблема заключается в том, запрос не выполняются они не выходят из строя или бросать какие-либо ошибки. Но если я копирую запрошенный запрос и запускаю его через что-то вроде pgadmin, он работает. Таким образом, запрос не является недопустимым. Любые идеи, почему это происходит?

Я должен упомянуть, что это поведение могло начаться, когда я добавил триггер для обновления полнотекстового поиска, но я не вижу, как это связано.

Update

Также я хочу добавить, что у меня есть синхронизации функцию, RU позже, но только выполняет разбор мета-тегов, и запрос работает. Поэтому где-то что-то блокирует выполнение запроса.

+1

Вы уверены? Я не вижу отладки в вашем коде? используйте 'echo pg_last_error ($ dbconn);' и снова проверьте ... – 2013-03-07 11:45:26

+0

Это отрывок, есть отладка, потому что всякий раз, когда запрос терпит неудачу, он предупреждает меня. –

+0

_Но если я скопирую запрос ... Просто. Откуда вы скопировали запрос? Вы «эхо-запрос»? –

ответ

1

Теперь вы говорите, что блок данных запускается, потому что вы можете эхо-запрос на экран и он запускается. Это значительно сужает возможности.

Самый вероятный случай, на мой взгляд, заключается в том, что вы забываете совершить транзакцию. Попробуйте:

pg_query('commit'); 

после петли. это может решить вашу проблему.

Другая возможность заключается в том, что соединение закрыто, но, как правило, IME по меньшей мере предупреждает в этом случае. Возможно, вам захочется попробовать несколько запросов на одно и то же соединение, чтобы убедиться, что он открыт, чтобы быть уверенным.

Наконец, вы можете попытаться использовать сетевой анализатор для просмотра трафика в/из базы данных (при условии, что вы не используете локальные сокеты). Это должно дать вам более точное представление о том, что именно происходит.

+0

Это похоже на трюк! Есть ли проблемы с производительностью, о которых я должен беспокоиться? Должна ли быть вызвана фиксация после каждого запроса в целом? –

+0

Сделайте фиксацию, где вы достигли точки, в которой вы хотите, чтобы все ваши операторы откатывались назад или фиксировались как блок. Существует небольшая стоимость исполнения, но она незначительна. Так, например, вы можете захотеть убедиться, что все вещи происходят вместе или вообще не происходят. Конец идет в конце этой серии. –

+0

Вам нужно только COMMIT, когда вы начинаете транзакцию, используя BEGIN или START TRANSACTION. –

Смежные вопросы