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

时间:2014-03-23 22:43:52

标签: 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";

1 个答案:

答案 0 :(得分:3)

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。任何PGSQL_TUPLES_OKSELECT查询都应为... RETURNING,而对于不返回元组的命令应为PGSQL_COMMAND_OK。如果还有其他问题,您应该使用pg_result_error和/或pg_result_error_field来获取错误详细信息并对其采取相应措施 - 通常会将其记录下来并向用户报告一般错误(如果有的话) ;面向公众的网站。

SQL注入

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

`'); DROP TABLE items; --`

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

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

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

交易,并发

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

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

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

ANSI加入

请,请用明确的INNER JOIN来撰写您的问题。当您有更大的查询时,这开始变得对可读性至关重要。 E.g。

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"