我这里有一些代码可以根据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显示消息。但是它不显示任何消息,并且数据库中的更新也似乎没有发生。
我的代码中是否存在任何可能被忽略的错误?还是有更好的方法呢?
我怀疑您的数据库出了问题,因为您说在所有这些之后都回显了$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()
应该给您足够的日志以查看出什么问题。