【问题标题】:How to update a database using php by uploading a CSV file?如何通过上传 CSV 文件使用 php 更新数据库?
【发布时间】:2020-03-04 08:01:35
【问题描述】:

我这里有一些代码可以根据 CSV 中的两列更新我的数据库。 CSV 文件如下所示:

ID 响应

1 你好1

2 你好2

3 你好3

在我的数据库中,我有一个表,其中还包含一个 id 列和一个与响应匹配的额外列。想法是上传此 CSV 文件,并将填充与 ID 号匹配的响应。

基本上是这样的:“UPDATE tbl_data SET response = {$response} WHERE id = {$id}

执行此操作的表单如下所示:

<form method="post" name="uploadCSV" enctype="multipart/form-data">
    <label>Choose CSV File</label>
    <input type="file" name="csv_file" id="file" accept=".csv" />
    <button type="submit" name="import" class="read-more smaller">Upload</button>
</form>

但是,我认为我不明白如何正确执行此操作,因为我收到 SQL 错误,或者表单只是坐在那里,好像什么都没发生一样。请参阅下面的代码。

if (isset($_POST["import"])) {

    if($_FILES["csv_file"]["name"]){

        $filename = explode(".", $_FILES["csv_file"]["name"]);

        if(end($filename) == "csv"){

            $handle = fopen($_FILES["csv_file"]["tmp_name"], "r");

            while ($data = fgetcsv($handle)){

                $id = $data[0];
                $response = $data[1];

                $query ="UPDATE tbl_data SET response = {$response} WHERE id = {$id}";
                $update_data = mysqli_query($connection,$query);

                if (!$update_data) {
                    $message = "There was a problem updating your CSV file. If this problem reoccurs, please contact admin";
                    die (mysqli_error($connection));
                }

            }

            fclose($handle);

            header("Location: upload.php?uploaded=1");

        } else {
            $message = "You can only upload a CSV file.";
        }

    } else {
        $message = "Please select a CSV file.";
    }

}

我有 $message 来显示消息。但它没有显示任何消息,并且数据库中的更新似乎也没有发生。

我的代码中是否有任何我可能忽略的错误?还是有更好的方法来做到这一点?

【问题讨论】:

  • “我有 $message 变量回显到页面,但它没有显示任何消息”...你呢?在哪里?而这个$message = "There was a problem updating your CSV file... 无论如何永远不会显示,因为你die() 之后立即停止脚本执行。但是您应该在那种情况下看到 mysqli 错误。你见过吗?您提到有时会出现 SQL 错误,但没有告诉我们它们是什么。
  • 这能回答你的问题吗? Importing CSV data using PHP/MySQL
  • 我怀疑这可能与字符串有关,因为 $response 是一个字符串(例如“hello”),但您没有在 SQL 语句中将其括在引号中。老实说,尽管您确实应该使用prepared statements and parameterised queries 来防止CSV 文件中的恶意输入将您变成SQL injection 的受害者的可能性。它还将处理诸如正确转义字符串输入之类的事情,从而避免 SQL 语句中出现意外的语法错误。
  • P.S.带有 REPLACE 修饰符的 LOAD DATA 命令在这里也可能更适合您,并加快速度。检查 RichYen 链接的问题以及MySQL documentation
  • 我没有看到你在回应$message

标签: php mysql csv


【解决方案1】:

通过以下方式让它工作

if(isset($_POST["importcsv"])){

        $file = $_FILES["csv_file"]["tmp_name"];
        $handle = fopen($file,"r");

        while ($row = fgetcsv($handle)) {

            $id = $row[0];
            $response = $row[1];

            $sql = "UPDATE table SET response = ? WHERE id = ?";
            $update_data_stmt = mysqli_stmt_init($connection);

            if (!mysqli_stmt_prepare($update_data_stmt, $sql)){
                die("Something went wrong with the upload. " . mysqli_error($connection));
            } else {
                mysqli_stmt_bind_param($update_data_stmt, "ss", $response, $id);
                mysqli_stmt_execute($update_data_stmt);
                if ($id == "ID" && $response == "Response"){
                    echo "";
                } else {
                    echo "Lead <b>{$id}</b>'s response was updated to <b>{$response}</b>.</p>";
                }
            }

        }

    }

【讨论】:

  • 在代码中使用die(mysqli_error($conn)); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die?
  • @Dharman 你是对的,谢谢你提醒我我把它留在里面了。有一些我留下来进行测试,但在现场他们没有必要!
  • 最好避免手动错误检查并使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);启用mysqli错误
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2017-10-25
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多