使用array_map清理数组

时间:2016-02-08 20:12:15

标签: php csv mysqli

我正在尝试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)

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数组中有非字符串的原因,并确保它没有到达那里。