【问题标题】:insert into postgres db with for php statement使用 for php 语句插入 postgres db
【发布时间】:2017-04-26 05:24:05
【问题描述】:

我正在用这个函数编写代码:

function foo() {

    $input = array('bar');

    for ($i=0;$i<1000;$i++) {

        $db=connection_pgsql() or die('Connessione al DBMS non riuscita');

            pg_prepare( "run","INSERT INTO tab1(name) VALUES  ($1)");
            pg_execute("run",$input);

            pg_prepare( "run","INSERT INTO tab2(name) VALUES  ($1)");
            pg_execute("run",$input);

            pg_prepare( "run","INSERT INTO tab3(name) VALUES  ($1)");
            pg_execute("run",$input);

        pg_close($db);


    }
}   

这个函数执行后只有

20 行在 tab1,20 行在 tab2 和 20 行在 tab3

而不是

在 tab1 中

1000 行,在 tab2 中 1000 行,在 tab3 中 1000 行。

是php还是postgresql配置的问题?

【问题讨论】:

  • 我不懂 php,但您需要检查这些插入的结果。可能是约束失败或其他原因

标签: php postgresql for-loop


【解决方案1】:

你没有检查错误。

检查函数的返回值,使用PHP提供的错误信息函数。

见:

您还可以查看 PostgreSQL 错误日志。

如果使用 PDO 会更清晰;参见例如How is a Postgres "RAISE EXCEPTION" converted into a PDOException?.

另外,不要像这样在每个循环迭代中打开和关闭连接,性能会糟糕。最好在单个连接上的单个事务中完成所有工作。

【讨论】:

  • 我为每一行打印了最后一个错误、结果错误和影响行。最后一个错误和结果错误为空,受影响的行为 1。我尝试在 1000 个语句中只插入 1 个表。只有 130 个被执行...
  • 然后请更新您的问题(最好使用较小的迭代次数 - 例如循环超过 20 次,仅插入 19 行)并且结果错误为 null 左右。
  • 不打印结果,检查错误退出循环。当你阅读 1000 行输出时,你很容易错过一些东西。
  • 循环中没有错误。它只在 n 行后停止。
【解决方案2】:

检查返回的资源,或者至少检查它是否不是false。看docs的例子,你不应该只是pg_execute("run",$input);,而是

$result = pg_execute("run",$input);

这样你就可以运行了

var_dump($result);

这样您将看到在您的 html 页面上返回的完整转储值。

【讨论】:

  • var_dump($result) 返回:resource(number of $i) of type (pgsql result)
猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2021-06-04
相关资源
最近更新 更多