1

您好我正在尝试构建一个 Web 界面,允许人们将 csv 文件的内容导入到 postgresql 数据库中。下面是我正在尝试做的 php 组件,但是当我运行时,我只是从我的 die 命令中得到“上传数据时出现问题:”,但没有其他错误。

对于此示例,我为 csv 文件硬编码了一个值,但目的是让用户指向他们机器或网络位置上的 csv 文件。

<?php

if ($_POST['submit']) {
// attempt a connection
$dbh = pg_connect("host=localhost dbname=blah user=user password=pass123");
if (!$dbh) {
die("Error in connection: " . pg_last_error());
}
// execute query
$sql = "COPY personaldetails(name, email, postaladdress, phone, username, password) FROM '../Test/Book1.csv' WITH DELIMITER ',' CSV";

$result = pg_query($dbh, $sql);
if (!$result) {
die("There was a problem uploading you data: " . pg_last_error());
}

echo "Data successfully inserted!";

// free memory
pg_free_result($result);

// close connection
pg_close($dbh);
}   

?>

我很感激可以提供的任何帮助。

4

1 回答 1

4

COPY FROM file必须由超级用户帐户运行,此限制使其通常不适合 Web 使用

文档摘录:

COPY 命名文件只允许数据库超级用户使用,因为它允许读取或写入服务器有权访问的任何文件。

但是 PHP 提供的支持COPY FROM stdin没有这个限制。这个来自 php 文档的示例显示了它是如何完成的:

  $conn = pg_pconnect("dbname=foo");
  pg_query($conn, "create table bar (a int4, b char(16), d float8)");
  pg_query($conn, "copy bar from stdin");
  pg_put_line($conn, "3\thello world\t4.5\n");
  pg_put_line($conn, "4\tgoodbye world\t7.11\n");
  pg_put_line($conn, "\\.\n");
  pg_end_copy($conn);

如果是文件,您需要使用 php 函数打开文件并将其逐行提供给 postgres 连接pg_put_line()

于 2013-08-29T12:55:33.460 回答