我对 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.com和 the 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/