如何通过上传CSV文件使用php更新数据库?

问题描述 投票:1回答:1

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

ID响应

1 Hello1

2 Hello2

3 Hello3

在我的数据库中,我有一个表,该表还包含一个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显示消息。但是它不显示任何消息,并且数据库中的更新也似乎没有发生。

我的代码中是否存在任何可能被忽略的错误?还是有更好的方法呢?

php mysql csv
1个回答
0
投票

我怀疑您的数据库出了问题,因为您说在所有这些之后都回显了$message,但为空。假设您的$data包含正确的信息(我建议使用var_dump()来确保),我只能想象该语句未按预期执行。

我不太了解mysqli,但是您可能要考虑使用PDO来查看它是否有效。它还可以保护您免受来自csv文件的潜在SQL注入攻击:

$conn = new PDO(db_host, db_user, db_pw)
while ($data = fgetcsv($handle)) {
    $id = $data[0];
    $response = $data[1];

    $sql = "UPDATE tbl_data SET response = :response WHERE id = :id";
    $st = $conn->prepare($sql)
    $st->bindValue(":response", $response, PDO::PARAM_STR)
    $st->bindValue(":id", $id, PDO::PARAM_INT)
    $st->execute();
    //Output
    print_r($st->errorInfo());
}
$conn = null;

尝试一下,errorInfo()应该给您足够的日志以查看出什么问题。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.