【发布时间】:2022-11-10 23:32:01
【问题描述】:
我正在尝试将 csv 文件写入 Mysql 表。我已经让数据库接受 csv 文件的一行,但似乎无法弄清楚如何遍历表的每一行并将其全部写入数据库。我可以回显“修剪”列,它会在屏幕上打印所有数据。我假设我需要创建一个数组或一些循环来对数据库执行此操作,但只是无法弄清楚。
我正在尝试这样做,因此当用户登录时,它将运行此代码并更新/插入 csv 中的最新数据。很可能一天一次。
我是一个非常业余的人/知道足以成为危险的“编码器”,所以请原谅我的无知。
任何帮助将不胜感激。 以下是我到目前为止所拥有的...
$file = "../../inventory/dealer.csv";
if (($handle = fopen("$file", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000)) !== FALSE) {
foreach($data as $i => $content) {
$data[$i] = $conn->real_escape_string($content);
}
$stock = $data[14];
$img = $data[13];
$year = $data[3];
$make = $data[4];
$model = $data[6];
$trim = $data[8];
$url = $data[12];
echo $data[8]."<br>"; // test only
$sql = "INSERT INTO FT_Inventory (StockNumber, FirstImage, Year, Make, Model, Trim, DetailPageUrl)
VALUES ('$stock', '$img', '$year', '$make', '$model', '$trim', '$url')";
}
fclose($handle);
}
【问题讨论】:
-
你在哪里运行
$sql?你对 SQL 注入持开放态度。摆脱real_escape_string,使用占位符,并将$data绑定到执行,或者如果mysqli则将其喷出...您也可能在没有PHP dev.mysql.com/doc/refman/8.0/en/load-data.html 的情况下执行此操作 -
您忘记实际执行查询。但是,是的,这不是将数据批量加载到 mysql 中的最佳方式
-
@user3783243 SQL 注入?没有从外部来源提交的任何内容。除非 OP 将注入代码放在他自己的 CSV 文件中?
-
@user3783243 “外部来源”是任何人提交的东西。这里情况不同。没有任何迹象表明
dealer.csv不是内部资源。如果dealer.csv是用户上传的,那么您可能会有案例。即便如此,SQL 注入也不是那么简单。我假设您对 SQL 注入的了解来自销售“SQL 注入解决方案”的 Jackals。 -
@Misunderstood
An "outside source" would be something submitted by anybody. That is not the case here...怎么会这样?你不知道文件来自哪里,或者谁填充了它,或者用了什么。治疗要安全得多全部输入作为潜在威胁。此外,即使这不是一个严重的威胁,此代码(以及您的答案中的版本)也可能容易受到简单、愚蠢的语法错误的影响,这些错误会破坏 SQL。参数化还可以防止该常见问题,因此值得为此而做。real_escape_string并没有抓住一切,而且已经过时了 20 年。