我正在尝试array_map
清理一个我从csv文件创建的数组。这是我的代码:
if (isset($_FILES['csv']['size'])) {
if ($_FILES['csv']['size'] > 0 && $_FILES['csv']['size'] != NULL ) {
//Clear existing qty_csv table
mysqli_query($conn,'TRUNCATE TABLE qty_csv');
$row_count = 0;
//get the csv file
$filename = $_FILES['csv']['tmp_name'];
$handle = fopen($filename,"r");
$delimiter = ',';
$unescapedArray = array();
$data = csv_to_array($filename,$delimiter);
function array_map_callback($a)
{
global $conn;
return mysqli_real_escape_string($conn, $a);
}
$data2 = array_map('array_map_callback',$data);
每当我运行我的代码时,我都会收到警告:
警告:mysqli_real_escape_string()期望参数2为字符串,数组在C:\ xampp \ htdocs \
中给出
为什么会发生这种情况,我该如何解决?
这是原始数据的结构:
part_code varchar(20)
part_descr varchar(255)
part_location varchar(20)
part_qty_in_stock int(11)
reorder_level int(11)
reorder_qty int(11)
part_price decimal(6,2)
答案 0 :(得分:1)
这是评论中的人们用准备好的陈述谈论的内容。声明为pre-loaded with ?
placeholders,然后每个占位符为bound to a variable。
所以file()
为我们提供了一个数组元素中文件的每一行,我们可以使用foreach
轻松地循环。在循环中,我们使用str_getcsv()
将每个CSV行转换为数组(如果您愿意自己推送,请成为我的访客)和execute the prepared statement。
每次执行语句时,都会检查绑定变量值并将其放入语句中。设置数据库的开销只进行一次,从而减少了很多开销。另外,你可以得到不需要逃避字符串的奖励; MySQL为你做到了。
当然,对于生产代码,您希望包含检查以确保语句准备,变量绑定和执行不会丢失任何错误。您也没有包含CSV样本,因此您可能必须允许str_getcsv()
中的任何非标准分隔符或终结符。
//assuming you have up here something like this:
$conn = new mysqli($host, $user, $pass, $dbase);
if (!empty($_FILES['csv']['size'])) {
//Clear existing qty_csv table
$conn->query('TRUNCATE TABLE qty_csv');
//get the csv file
$filename = $_FILES['csv']['tmp_name'];
$data = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$row_count = count($data);
//value has to exist for bind_param to work
$csv = str_getcsv($data[0]);
$query = "INSERT INTO table (part_code, part_descr, part_location, part_qty_in_stock, reorder_level, reorder_qty, part_price) VALUES (?,?,?,?,?,?,?)";
$stmt = $conn->prepare($query);
$stmt->bind_param("sssiiid", $csv[0], $csv[1], $csv[2], $csv[3], $csv[4], $csv[5], $csv[6]);
foreach ($data as $row) {
$csv = str_getcsv($row);
$stmt->execute();
}
}
答案 1 :(得分:0)
错误是由$ data中的项目引起的,该项目不是字符串。在将数据传递给数组映射之前,执行var_dump以查看$ data中的内容。或者你可以这样做:
function array_map_callback($a)
{
global $conn;
if (is_array($a) {
foreach($a as $idx => $item) {
$a[$idx] = mysqli_real_escape_string($conn, $item)
}
return $a;
} else {
return mysqli_real_escape_string($conn, $a);
}
}
但这只是一个可能的解决方案,最好找出你的$ data数组中有非字符串的原因,并确保它没有到达那里。