【问题标题】:PHP postgresql: INSERT values from query array resultPHP postgresql:从查询数组结果中插入值
【发布时间】:2016-06-08 21:27:31
【问题描述】:

我有一些来自这个查询语句的行:

SELECT * from jkd where idno='$id';

我想将这些行中的值“复制”到其他表:

INSERT INTO tmpjkd(pop, name, address) VALUES($pop, $name, $address);

我试过这个:

$jkd = SELECT * from jkd where idno='$id';
$sql = pg_query("SELECT * from jkd where idno='$id'");
while ($row = pg_fetch_object($sql)){
$pop = $jkd['pop'];
$name = $jkd['name'];
$address = $jkd['name'];
pg_query("INSERT INTO tmpjkd(pop, name, address) VALUES($pop, $name, $address)");}

但是没有运气。请帮帮我...

更新: 我在 Drupals 中写道:

$sql = db_query("SELECT * from jkd where idno='$id'");
while ($row = db_fetch_object($sql)){
$pop = $jkd['pop'];
$name = $jkd['name'];
$address = $jkd['name'];
db_query("INSERT INTO tmpjkd(pop, name, address) VALUES($pop, $name, $address)");}

【问题讨论】:

  • 这是构建查询的一种糟糕方式,因为您让自己对 SQL 注入攻击敞开大门。尝试阅读准备好的语句,Postgres 支持它们,PHP PDO Postgres 驱动程序也支持
  • 另外,为什么要将行复制到另一个表中?也许您应该阅读数据库规范化。您应该从另一个表中引用您需要的数据,而不是复制它。希望你能收到这个。
  • 我需要将值复制到临时表中,以便进一步处理。关于sql注入,这在drupal上写安全吗?实际代码已更新

标签: php postgresql sql-insert


【解决方案1】:

您的代码需要一些更改

$sql = pg_query("SELECT * from jkd where idno=$id");
while ($row = pg_fetch_object($sql)) {
    $pop = $row->pop;
    $name = $row->name;
    $address = $row->address;
    pg_query("INSERT INTO tmpjkd(pop, name, address) VALUES ('$pop', '$name', '$address')");
}

pg_fetch_object 正在返回一个对象而不是数组,在您旁边,您使用的是 $jkd,它对实际值没有任何作用。

还有,第一行$jkd = SELECT * from jkd where idno='$id';,不知道是干什么用的,多半是你真的不需要。

【讨论】:

    【解决方案2】:

    上面提出的解决方案执行 N + 1 个查询。这导致性能问题。为什么不为此使用 CTE?

    $query = <<<SQL
    WITH
      to_be_inserted AS (SELECT pop, name, address FROM jkd WHERE idno = $1)
    INSERT INTO tmpjkd (pop, name, address)
      SELECT pop, name, address FROM to_be_inserted;
    SQL;
    
    pg_query_params($sql, [$id]);
    

    此外,这会进行原子事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2018-03-14
      • 2016-06-10
      相关资源
      最近更新 更多