2013-03-07 87 views
1

我在PostgreSQL中有这个问题,我在解析一个网页元标记,然后输入请求到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之类的方式运行它,它就可以工作。所以查询不是无效的。任何想法为什么发生这种情况?

我应该提到,当我添加触发器来更新全文搜索tsvector时,此行为可能已经开始,但我不明白这是如何相关的。

更新

另外我想补充一点,我有一个同步功能是儒,但后来只执行了元标记的分析和查询工作。所以有些地方阻止了查询的执行。

+1

你确定吗?我没有看到你的代码中的任何调试?使用'echo pg_last_error($ dbconn);'并再次检查... – 2013-03-07 11:45:26

+0

这是一个摘录,有调试,因为每当查询失败,它都会提醒我。 – 2013-03-07 11:54:43

+0

_但是如果我复制查询..._只是为了确定。你从哪里复制了查询?你'回声$查询'? – 2013-03-07 11:57:20

回答

1

现在你说数据块正在运行,因为你可以将查询回显到屏幕并运行。这大大缩小了可能性。

在我心中,最可能的情况就是您忘记提交您的交易。尝试:

pg_query('commit'); 

循环后。这可能会解决你的问题。

另一种可能性是连接已关闭,但通常IME至少会引发警告。您可能想要在同一连接上尝试一些选择查询,以确保它是开放的,以确保一切。

最后,您可能想尝试使用网络分析器来监视数据库的流量(假设您没有使用本地套接字)。这应该让你更清楚地知道究竟发生了什么。

+0

这似乎已经做到了!有什么我应该担心的性能问题吗?一般在每个查询之后应该调用提交吗? – 2013-03-07 14:58:26

+0

进行提交,您已达到要将所有语句作为块回滚或提交的点。性能价格略有降低,但幅度不大。举例来说,你可能想要确保一堆事情都发生在一起或根本不会发生。该提交在该系列的结尾。 – 2013-03-07 15:11:18

+0

只有在使用BEGIN或START TRANSACTION开始事务时才需要COMMIT。 – 2013-03-07 15:12:43