【发布时间】:2019-03-02 21:24:17
【问题描述】:
我必须建立报告网站,使用从另一个系统导出的 csv 文件导入 SQL 数据。
我构建了代码,但无法继续执行,要导入 SQL,我只有消息 QUERY FAILED,不是 SQL 错误或与数据库连接。
有人可以查看我的代码并写信告诉我我的错误在哪里吗?我用户对数据进行了转义,因为我收到了类似..."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...
【问题讨论】:
-
不要逃避它,而是准备它。现在您对文件中的 SQL 注入持开放态度,这种情况很容易发生。事实上,这个错误
. i user escape on data because i have come data like... "John's company"正在执行 sql 注入,这就是您的查询被破坏的原因。您的查询类似于..."VALUES ('John's company', ...)看看 apos 是如何完成第一个单引号VALUES ('John' [s company'], ...)然后您有s company'只是在那里不寒而栗。 -
那是因为您将
'注入到您的 SQL 中,您可以通过简单地使用准备好的语句来避免所有这些以及更多......我会发布一些代码,但可能有一个网络上有十亿个例子怎么做。 -
你说“准备”是什么意思,我理解你的观点,因为我的 csv 中的数据类型有问题,但我该如何防止呢?如何在 SQL 中处理这些数据?你能写下我的一行代码吗?
-
php.net/manual/en/mysqli.prepare.php
Prepares the SQL query, and returns a statement handle to be used for further operations on the statement. The query must consist of a single SQL statement. The parameter markers must be bound to application variables using mysqli_stmt_bind_param() and/or mysqli_stmt_bind_result() before executing the statement or fetching rows.基本上不是将数据连接到 sql 中,而是使用占位符,然后稍后发送数据。VALUES ( ?, ?, ?, ?) -
因为您的 sql
VALUES ( ?, ?, ?, ?)中不会有任何单引号,所以您不必担心转义它们,因为 DB 知道这是 SQL,当您使用时这是 DATA准备它。Could you please wrote my one line of code?- 不,只是谷歌“MySqli Prepared statements”之类的。