【问题标题】:PHP load csv into sql table only works when all permissions granted @localhostPHP 将 csv 加载到 sql 表中仅在授予所有权限 @localhost 时才有效
【发布时间】: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


【解决方案1】:

如果错误是“无数据库连接”,则您的代码在此处显示的第一个代码行上失败。您的数据库用户帐户信息(或自己的帐户)有问题。也许主机不是“本地主机”而是别的东西?

如果 Drupal 运行良好,请检查它的连接。检查文件/sites/default/settings.php。存储了有关数据库连接的信息,因此您可以从那里复制您的帐户数据。

顺便说一句,您可以更轻松地使用 file_get_contents() 函数,而不是 PHP 上的老式 fopen。

【讨论】:

  • 正如我所提到的,当我授予@localhost 的所有权限时,它可以工作。但我无法在 Drupal 服务器上更改它。
猜你喜欢
  • 2016-12-07
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2014-02-04
相关资源
最近更新 更多