我有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();
}
?>
有人能帮我解决这个问题吗?
1条答案
按热度按时间91zkwejq1#
如果你看一下文档
array_combine()
您将看到它的目的是构建一个关联数组。您在中使用此函数csvToArray()
但稍后在代码中,您将尝试使用数字键获取数据。我没想到你会插任何东西。顺便说一句,你一次又一次地重复准备同一份声明,完全违背了准备好的声明的目的。一次准备,多次执行。很少需要单独绑定参数,在几乎所有情况下都可以将数据提供给
PDOStatement::execute()
作为一个数组。在数据库中存储html实体也是一种不好的形式;如果需要输出到html,则在该点执行转义。类似的方法应该可以工作(根据需要调整数组键名称)