【发布时间】: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。