【问题标题】:Inserting data from mysql from CSV using PHP PDO使用 PHP PDO 从 CSV 从 mysql 插入数据
【发布时间】:2018-10-23 16:07:45
【问题描述】:

我有 CSV 格式的数据列表,需要将此数据插入 MySQL 数据库。这些数据应安全插入,即卫生。因此,我使用 PDO 对象来纠正 SQL 注入。但是,它无法从 CSV 文件中获取数据并插入空值。

这是一个例子,

<?php
$servername = "localhost";
$username   = "root";
$password   = "";

try {
    $conn = new PDO("mysql:host=$servername;dbname=contact_list",$username,$password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "connection successfully";
}
catch(PDOException $e)
{
    echo "connection Failed:" . $e -> getMessage();
}

// Create  CSV to Array function
function csvToArray($filename = '', $delimiter = ',')
{
    if (!file_exists($filename) || !is_readable($filename)) {
        return false;
    }

    $header = NULL;
    $result = array();
    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
            if (!$header)
                $header = $row;
            else
                $result[] = array_combine($header, $row);

        }
        fclose($handle);
    }

    return $result;
}

// Insert data into database   

$all_data = csvToArray('contact.csv');
foreach ($all_data as $data) {

    $data = array_map(function($row){
        return filter_var($row, FILTER_SANITIZE_STRING, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
        }, $data);

    $sql = $conn->prepare("INSERT INTO contact 
                (title, first_name,last_name,company_name,date_of_birth,notes) 
        VALUES (:t, :fname, :lname,:cname,:dob,:note)");

    $sql->bindParam(':t', $data[1], PDO::PARAM_STR);
    $sql->bindParam(':fname', $data[2], PDO::PARAM_STR);
    $sql->bindParam(':lname', $data[3], PDO::PARAM_STR);
    $sql->bindParam(':cname', $data[0], PDO::PARAM_STR);
    $sql->bindParam(':dob', $data[4], PDO::PARAM_STR);
    $sql->bindParam(':note', $data[15], PDO::PARAM_STR);
    print_r($data);
    $sql->execute();    
}
?>

谁能帮我解决这个问题?

【问题讨论】:

标签: php mysql pdo fgetcsv


【解决方案1】:

如果您查看array_combine() 的文档,您会发现它的目的是构建一个关联数组。您在csvToArray() 中使用此功能,但稍后在您的代码中您尝试使用数字键获取数据。我没想到你会插入任何东西。

顺便说一句,通过一遍又一遍地重复准备相同的语句,您完全违背了准备语句的目的。一次准备,多次执行。很少需要单独绑定参数,几乎在所有情况下,您都可以将数据作为数组提供给PDOStatement::execute()。将 HTML 实体存储在数据库中也是一种不好的形式。如果需要输出到 HTML,则在该点执行转义。

这样的事情应该可以工作(根据需要调整数组键名。)

$all_data = csvToArray('contact.csv');
$sql = $conn->prepare("INSERT INTO contact 
    (title, first_name, last_name, company_name, date_of_birth, notes) 
    VALUES (:t, :fname, :lname,:cname,:dob,:note)");
foreach ($all_data as $data) {
    $params = [
        ":t"     => $data["t"],
        ":fname" => $data["fname"],
        ":lname" => $data["lname"],
        ":dob"   => $data["dob"],
        ":note"  => $data["note"],
    ];
    $sql->execute($params);
}

【讨论】:

  • 我通过更改数组索引值(如 $data[0],$data[1]....)尝试了这种方法,但它仍然存储空值。
  • 你读过我回答的第一段吗?我在哪里说你的整个问题是使用数字索引?
猜你喜欢
  • 2013-12-27
  • 2016-03-27
  • 2013-10-01
  • 1970-01-01
  • 2015-10-24
  • 2015-01-19
  • 2018-08-01
  • 2018-02-18
  • 2016-12-22
相关资源
最近更新 更多