gpt4 book ai didi

php - 如何在使用 PHP 导入 SQL 之前正确转义 CSV 文件

转载 作者:行者123 更新时间:2023-11-29 02:10:01 25 4
gpt4 key购买 nike

我必须建立报告网站,其中将使用从另一个系统导出的 csv 文件导入 SQL 数据。

我构建了代码,但我无法继续它,要在 SQL 中导入,我只有消息QUERY FAILED,而不是 SQL 错误或数据库连接错误。

有人可以检查我的代码并告诉我我的错误在哪里吗?我在数据上使用了 escape,因为我得到了这样的数据......“John's company”:

<?php

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

$filename = $_FILES['file']['tmp_name'];

if($_FILES['file']['size'] > 0 ) {
$file = fopen($filename, 'r');

while (($data = fgetcsv($file, 10000, ",")) !== FALSE ) {
$data = array_map('mysqli_real_escape_string', $data);
$query = "INSERT INTO purchasing ";
$query .= "(
purchase_req,
pr_date,
pr_item,
pr_created_by,
po_created_by,
purch_group,
purchase_ord,
po_date,
po_item,
po_state,
vendor_numb,
vendor_name,
mat_desc,
gl_acc,
cost_cent,
po_qty,
po_del_date,
po_delivered_qty,
po_to_be_del
) ";
$query .= "VALUES (
'" . $data[0] . "',
'" . $data[1] . "',
'" . $data[2] . "',
'" . $data[3] . "',
'" . $data[4] . "',
'" . $data[5] . "',
'" . $data[6] . "',
'" . $data[7] . "',
'" . $data[8] . "',
'" . $data[9] . "',
'" . $data[10] . "',
'" . $data[11] . "',
'" . $data[12] . "',
'" . $data[13] . "',
'" . $data[14] . "',
'" . $data[15] . "',
'" . $data[16] . "',
'" . $data[17] . "',
'" . $data[18] . "'
) ";

$send_to_database = mysqli_query($conn, $query);

if(!$send_to_database) {
die("QUERY FAILED <br>" . mysqli_error($conn));
} else {
header("Location: index.php");
}
}
fclose($file);
}
}

?>

///根据建议更新代码

<?php

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

$filename = $_FILES['file']['tmp_name'];

if($_FILES['file']['size'] > 0 ) {
$file = fopen($filename, 'r');

$conn = new mysqli("localhost", "####", "####", "####");

if($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$stmt = $mysqli->prepare("INSERT INTO purchasing (purchase_req, pr_date, pr_item, pr_created_by, po_created_by, purch_group, purchase_ord, po_date, po_item, po_state, vendor_numb, vendor_name, mat_desc, gl_acc, cost_cent, po_qty, po_del_date, po_delivered_qty, po_to_be_del) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ");

fgetcsv($file, 10000, ",");
while(($data = fgetcsv($file, 10000, ",")) !== FALSE) {
$data = fgetcsv($file);

$stmt->bind_param("sssssssssssssssssss", $data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6], $data[7], $data[8], $data[9], $data[10], $data[11], $data[12], $data[13], $data[14], $data[15], $data[16], $data[17], $data[18]);

$stmt->execute();
}
fclose($file);
}
}

?>

对于第二种情况,我打印了数组,但我还是无法将它发送到 SQL...

最佳答案

在修改后的代码中,您正在使用准备和绑定(bind)参数,但您错过了准备语句的好处之一:您可以准备一次并使用不同的值执行多次。

顺便说一句,当你绑定(bind)时,你需要一个控制字符串,其字符数与参数的个数一样多。在这种情况下,您需要一个长度为 19 的字符串。

$stmt = $mysqli->prepare("INSERT INTO purchasing (purchase_req, pr_date, pr_item, 
pr_created_by, po_created_by, purch_group, purchase_ord, po_date, po_item, po_state,
vendor_numb, vendor_name, mat_desc, gl_acc, cost_cent, po_qty, po_del_date,
po_delivered_qty, po_to_be_del) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ");

while(($data = fgetcsv($file, 10000, ",")) !== FALSE) {
$data = fgetcsv($file);

$stmt->bind_param("sssssssssssssssssss", $data[0], $data[1], $data[2], $data[3], $data[4], $data[5],
$data[6], $data[7], $data[8], $data[9], $data[10], $data[11], $data[12],
$data[13], $data[14], $data[15], $data[16], $data[17], $data[18]);

$stmt->execute();
}

这样效率会高一点,因为 MySQL 不必为 CSV 输入的每一行重新解析 SQL 语句。

提示:我更喜欢使用 PDO 而不是 mysqli,因为它有一个更好的接口(interface)来使用准备好的语句。您不必绑定(bind)任何变量。如果您将数据数组作为参数传递给 execute(),PDO 会为您完成。 :

$stmt = $pdo->prepare("INSERT INTO purchasing (purchase_req, pr_date, pr_item, 
pr_created_by, po_created_by, purch_group, purchase_ord, po_date, po_item, po_state,
vendor_numb, vendor_name, mat_desc, gl_acc, cost_cent, po_qty, po_del_date,
po_delivered_qty, po_to_be_del) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ");

while(($data = fgetcsv($file, 10000, ",")) !== FALSE) {
$data = fgetcsv($file);
$stmt->execute($data);
}

我经常感到困惑,为什么更多的 PHP 开发人员不使用 PDO。

PDO 被认为是异国情调的东西而名不副实,因为早在 PHP 5.0 时代它就没有包含在默认的 PHP 安装中。但是从 PHP 5.1 开始,PDO 就成为了官方 PHP 发行版的一部分。奇怪的是,即使在 15 年后,开发人员仍会避免使用它!


您需要养成习惯的一件事是检查错误。这在 PHP 和其他语言中也是如此。

如果出现错误,Mysqli 函数将返回 FALSE。然后您应该记录错误,以便您可以使用它来进行故障排除。

像这样:

$stmt = $mysqli->prepare(...);
if ($stmt === false) {
error_log($mysqli->error);
die("Internal error");
}

$ok = $stmt->execute();
if ($ok === false) {
error_log($stmt->error);
die("Internal error");
}

您需要在每次 调用prepare() 后检查错误或 execute() .这很痛苦,但否则你怎么知道出了什么问题?

在您开发和测试代码时,请打开一个窗口来跟踪您的 http 错误日志,这样您就可以在记录错误时看到它们。

向用户输出一般错误消息是一种很好的做法,因为您不想向用户透露太多关于您的代码的信息。但将更多技术信息记录到错误日志中,以便您自己进行故障排除。

关于php - 如何在使用 PHP 导入 SQL 之前正确转义 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54963148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com