php - 如何将多个迭代提取的数据值连接到单个函数调用中?

标签 php sql postgresql

这是我写过的最丑陋的东西,但我就是不知道有什么别的方法可以做到这一点。 问题是我需要向依赖于使用迭代从另一个位置提取的信息的数据库提交 SQL 查询。

EG:我可以使用嵌套的 for 循环提取数据,但随后需要将整行重新组合在一起以对 SQL 进行插入查询。我尝试将单元格数据临时存储在变量中并以这种方式进行,但这看起来也很糟糕并且没有用。

这是我现在使用的代码:

请不要生气。我知道这很糟糕。我想变得更好。 附带说明一下,我已将此行(第 98 行)称为 kiloline,因为它超过 1000 个字符长。

$res1 = pg_query("INSERT INTO Project_Time_Sheet VALUES ('" . 
    $objWorksheet->getCellByColumnAndRow(0, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(1, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(2, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(3, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(4, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(5, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(6, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(7, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(8, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(9, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(10, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(11, $row)->getFormattedValue() . "', '" . 
    $objWorksheet->getCellByColumnAndRow(12, $row)->getFormattedValue() . "')");

请告诉我一个更好/更优雅/不愚蠢的方法来做到这一点。

最佳答案

因此,我将尝试直接改进此语句的汇编。这可能无法完全回答您的问题,但至少应该让您走上正确的道路。

$res1 = pg_query("INSERT INTO Project_Time_Sheet VALUES ('" . $objWorksheet->getCellByColumnAndRow(0, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(1, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(2, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(3, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(4, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(5, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(6, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(7, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(8, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(9, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(10, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(11, $row)->getFormattedValue() . "', '" 
    . $objWorksheet->getCellByColumnAndRow(12, $row)->getFormattedValue() . "')");

现在,这看起来不是更好吗?不?更恐怖一点?对不起。

假设:您将始终以数字作为第一个参数调用 getCellByColumnAndRow,它始终以 1 开头,并可能在任何时候结束。不要像那样构建 SQL,而是先使用循环来收集数据...

$max = 12;
$values = array();
foreach(range(1, $max) as $index)
    $values[] = "'" . $objWorksheet->getCellByColumnAndRow($index, $row)->getFormattedValue() . "'";

现在您可以将数组粘合在一起。

$sql = 'INSERT INTO Project_Time_Sheet VALUES(' . join(', ', $values) .')';

嗯。 getFormattedValue 是 SQL 安全的,对吧?如果不是呢?

还有一些需要改进的地方。 PostgreSQL 支持 prepared statements .在这里使用它们可能是明智的。

同样,让我们​​盲目地假设事物是适度动态的。 PHP 的 PG 扩展使用了非标准的占位符,这让我们的日子不好过。让我们对数据收集做一个小改动:

$max = 12;
$values = array();
foreach(range(1, $max) as $index)
    $values[ '$' . $index ] = "'" . $objWorksheet->getCellByColumnAndRow($index, $row)->getFormattedValue() . "'";

数组现在是键控的,使用 PG 的准备语句占位符。

我们现在将使用而不是值来重新组装 SQL:

$sql = 'INSERT INTO Project_Time_Sheet VALUES(' . join(', ', array_keys($values)) .')';

$sql 现在看起来像

INSERT INTO Project_Time_Sheet VALUES($1, $2, $3 ...);

让我们准备并执行!

$sth = pg_prepare($dbh, '', $sql);
$res = pg_execute($dbh, '', array_values($values));

准备好的语句给我们带来了两件事:

  1. 增加了对 SQL 注入(inject)的保护,并且
  2. 在循环中使用时的潜在性能优势。一次准备,多次执行。

关于php - 如何将多个迭代提取的数据值连接到单个函数调用中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817577/

相关文章:

sql - Postgres : update a row on conflict insert and return old values

php - MySQL 到 XML

mysql - Xampp 字段名称更改

mysql - 错误 : #1054 - Unknown column 'NOPL' in 'where clause' ?

java - 当 SQL 进行排序时,如何启用 GUI 行为来对 JTable 进行排序?

postgresql - 空日期的 postgres 表分区

Postgresql 创建数据库

php - 如何防止 HTML 中的组合框下拉?

php - Doctrine - ORM - 使用具有关联的 entityManager 获取所有数据

php - CodeIgniter 没有正确插入 sql 数据