这是我写过的最丑陋的东西,但我就是不知道有什么别的方法可以做到这一点。 问题是我需要向依赖于使用迭代从另一个位置提取的信息的数据库提交 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));
准备好的语句给我们带来了两件事:
- 增加了对 SQL 注入(inject)的保护,并且
- 在循环中使用时的潜在性能优势。一次准备,多次执行。
关于php - 如何将多个迭代提取的数据值连接到单个函数调用中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817577/