通过网页上的php将CSV文件导入postgres

时间:2013-08-29 12:24:38

标签: php postgresql csv

您好我正在尝试构建一个允许人们将csv文件的内容导入postgresql数据库的Web界面。下面是我正在尝试做的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);
}   

?>

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:5)

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

摘自documentation

  

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函数打开文件并将其逐行提供给与pg_put_line()

的postgres连接