php - 如何在 postgresql 上将一个查询的输出作为另一个查询的输入?

标签 php sql postgresql

我对 PHP 和数据库很陌生。我想从搜索中获取查询并在 Order 表中输入信息。我使用了 pg_copy_from() 但它不起作用。

$keyword = pg_escape_string($_POST['keyword']);

$result = pg_query($dbh, "SELECT i.items_id, i.name, o.price, o.store_id, o.status, o.time, o.is_cancelled, o.gifting_carts_id FROM items i, orders o WHERE o.item_id = i.item_id AND i.name = $keyword");

// Printing results in HTML
echo "<table>\n";
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($line as $col_value) {
    echo "\t\t<td>$col_value</td>\n";
  }
  echo "\t</tr>\n";
}
echo "</table>\n";

// GET INFO FROM QUERY


$sql = "INSERT INTO orders (quantity, item_id, store_id) VALUES('$quantity', '$item_id', '$store_id') returning orders_id";
$result1 = pg_query($dbh, $sql);
if (!$result1) {
    die("Error in SQL query: " . pg_last_error());
    header("Location: error.php");
}
header("Location: success.php");

这是正确的语法吗:

 $line = pg_fetch_array($result, null, PGSQL_ASSOC)
 echo $line["i.item_id"] . " <- Item ID \n";                         
 $sql = "INSERT INTO orders (item_id) VALUES('$item_id') returning orders_id";

最佳答案

pg_copy_from 并没有按照您的想法行事

pg_copy_from PHP 函数设计用于使用类似于 CSV 的格式将行批量插入数据库,该格式作为 PHP 提供的数组提供。你不需要它来做你正在做的事情,它不会起作用。这些行中的每一行都因错误而失败,但您没有检查错误,因此您忽略了它们。如果您检查 PostgreSQL 日志文件,您将看到错误。

使用pg_fetch_... 函数

相反,你想要 pg_fetch_array (获取也按名称索引的数组),pg_fetch_result (获取单个字段)或 pg_fetch_object (要将其作为 PHP 对象获取,您可以使用字段作为列名进行访问)。

检查并处理错误

您的代码无法检查 pg_result_status数据库调用后。因此,如果数据库调用失败,它将以意想不到且通常很丑陋的方式失败。

您应该在每次调用后检查pg_result_status。对于任何 SELECT... RETURNING 查询,它应该是 PGSQL_TUPLES_OK,对于不支持的命令,它应该是 PGSQL_COMMAND_OK返回元组。如果是别的,你应该使用 pg_result_error和/或 pg_result_error_field 以获取错误详细信息并采取适当的措施 - 如果它是面向公众的网站,通常会记录它并向用户报告一般错误。

SQL注入(inject)

您的代码容易受到 SQL 注入(inject)攻击。想象一下如果有人发送关键字会发生什么:

`'); DROP TABLE items; --`

参见 http://bobby-tables.comthe PHP manual on SQL injection .您应该使用 pg_query_params 或 PDO。

这也可能导致更普通的问题。例如,任何包含单引号的文本值都将无法插入,因为它会终止文本字段,从而使您的 SQL 语句的语法无效。

始终使用参数化语句(通常称为“准备好的语句”,尽管它们实际上略有不同)。

事务、并发

如果这段代码的两个副本同时运行怎么办?它会做正确的事吗?

如果程序中途出现错误,数据库会处于合理状态吗?

在进行数据库编程时,你总是需要考虑这些事情。事务和锁定是确保结果正确的主要工具。我不会在这里详细讨论这些,但我强烈建议您查看 PostgreSQL tutorial和文档,其中详细讨论了它们。

ANSI 加入

拜托,拜托,请使用明确的 INNER JOIN 编写您的查询。当您有更大的查询时,这对于可读性开始变得至关重要。例如

SELECT
   i.items_id, 
   i.name, 
   o.price,
   o.store_id,
   o.status, 
   o.time, 
   o.is_cancelled,
   o.gifting_carts_id 
FROM items i
     INNER JOIN orders o ON (o.item_id = i.item_id)
WHERE i.name = $keyword"

关于php - 如何在 postgresql 上将一个查询的输出作为另一个查询的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22598121/

相关文章:

php - domxpath - 从第二个 ul 中提取 li 标签

php - Android app 101 : how do I sync web contents to the app? 刚刚开始构建应用程序

php - MySQL 将 2 行合并为 1 行

sql - Grails:在普通的 groovy 类中获取数据源

sql - 如何显示至少有 10 次销售的商店

postgresql - LEFT() 在 Postgres 中不起作用

php - Doctrine 查询生成器语法错误

php - 如何使用 php 将产品价格分组为范围并在导航中按价格列出商店

mysql - 在 hive 中使用多个 or 和 and 条件时出错

postgresql - 在 INTARRAY 列中进行更快的搜索