【发布时间】:2015-06-19 06:30:20
【问题描述】:
这个问题has been asked 但还没有答案...
有一个 csv 上传表单可以加载到现有的 MySQL 表中,以便在 Drupal 页面上使用,因此所有内容都在一个 php.ini 中。这就是我所拥有的(感谢 coyotelab):
$mysqli = new mysqli($server, $user, $password, $database);
if ($mysqli->connect_error) {
die("Failed to connect: " . $mysqli->connect_error);
}
if (isset($_POST['submit'])) {
if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
echo "<h2>" . "File ". $_FILES['filename']['name'] ." uploaded successfully." . "</h2>";
}
$handle = fopen($_FILES['filename']['tmp_name'], "r");
if ($handle !== FALSE) {
$import="LOAD DATA LOCAL INFILE '" . $_FILES['filename']['tmp_name'] . "' INTO TABLE Demo2 CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' IGNORE 1 LINES;";
mysql_query($import) or die('<p style="color:red;">Database import unsuccessful: ' . mysql_error() . '</p>');
}
fclose($handle);
print "<p style='color:blue;'>Import done</p>";
echo "<p style='position: relative; top: 10px;'><strong>Displaying contents:</strong></p>";
readfile($_FILES['filename']['tmp_name']);
unset($_POST);
} else {
print "<p>Import new csv</p>\n";
print "<form enctype='multipart/form-data' action='?q=drupal-relative-path-to/upload.php' method='post'>\n";
print "<input size='50' type='file' name='filename'><br />\n";
print "<input type='submit' name='submit' value='Import'></form>";
首先,表单在本地进行测试,并授予本地主机的所有权限,并且成功导入了数据。但是在 Drupal 服务器上,不会更改 localhost 权限。其他插入 SQL 数据的表单在 Drupal 页面中运行良好。只有上传文件功能才会发生。
到目前为止,表单显示在 Drupal 上,但是在上传和提交 CSV 时,我收到与在没有权限的情况下在 localhost 上进行测试相同的错误。错误是“未选择数据库”
我的想法是更改上传的临时文件所在的位置,但还没有想出来,或者在 Drupal 服务器上可能无法实现。尝试添加第二条数据库连接线,但这不起作用。一定和临时目录有关。
此表单将位于专用网络上。
【问题讨论】:
-
好吧,除非是错字,否则您没有使用正确的数据库函数来运行您的查询...它应该是
mysqli_query($mysqli, $import)而不是mysql_query($import)。那就是说您仍然需要适当的权限才能执行LOAD...INFILE。 -
有没有办法为数据集提供临时权限?就像一种将匿名用户屏蔽为具有适当权限的用户的方法?
-
数据库连接在
LOAD DATA INFILE...之前失败,检索内容时似乎失败了。我尝试将上传的 CSV 移动并重命名为 localhost 的根目录,但连接仍然失败。 -
您只需要使用与具有适当权限的用户的连接,无论该用户是您的 drupal 的默认用户,还是完全不同的用户。如果您无法调整它,那么只需解析 CSV 并进行自己的插入。它的性能不会那么高,但安全风险较小,并且不需要数据库级别的配置。
-
尝试允许匿名@localhost 授予权限。在
LOAD DATA之前添加了声明GRANT ALL...。格兰特工作,但没有加载。使用单独的 connect 和 db_connect 语句回到早期版本。主要使用上述内容测试了文档,并且有效。必须使用REVOKE ALL来重置权限。正如@prodigitalson 所说,LOAD DATA需要适当的权限。将尝试从 csv 和INSERT创建一个数组。
标签: php mysql csv drupal drupal-7