我刚刚开始使用PDO方法,并设法创建一个表并从.csv文件插入10个测试记录。我检查了phpMyAdmin中的表,发现包含语音标记的字段(在csv文件中)完全用双引号括起来,例如“ORIGINAL CSV VALUE”“WOULD”“有点像这样” - 这是正确的还是我做错了什么?
如果这是正确的,如何在没有额外双引号的情况下正常显示输出?
我希望这有道理吗?我已经阅读了Q& A的大量类似于这个问题的内容,但它们都没有解释数据库本身应该发生什么,以及随后如何将数据拉出来并在涉及特殊字符时正确显示。我可以将它拉出并显示出来 - 但只有额外的引号才能显示出来。救命!请!
到最后到达那里。谢谢您的帮助。你是对的,它是包含转义字符的CSV文件所以它正在工作,因为它应该真的不是我想要它。下面的最终代码,希望它将来会帮助其他人。它从CSV数据中删除双引号等,并将它们存储在表格中: - )
<?php
require_once ('mysql_connect.php');
$databaseFile = fopen('products.csv', 'r');
if ($databaseFile === false) {
die('Could not open the CSV file!');
}
fgetcsv($databaseFile, 0, "|"); // Removes the CSV header line
$stmt = $dbConnection->prepare('INSERT INTO products (id,category,title,price,shipping,live,height,width,depth) VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?)');
while (($csvRow = fgetcsv($databaseFile, 500, "|")) !== FALSE) {
$stmt->bindValue(1, $csvRow[0]);
$stmt->bindValue(2, $csvRow[1]);
$stmt->bindValue(3, $csvRow[2]);
$stmt->bindValue(4, $csvRow[3]);
$stmt->bindValue(5, $csvRow[4]);
$stmt->bindValue(6, $csvRow[5]);
$stmt->bindValue(7, $csvRow[6]);
$stmt->bindValue(8, $csvRow[7]);
$stmt->execute();
}
fclose($databaseFile);
$dbConnection = null;
?>
答案 0 :(得分:2)
你看到的是CSV式转义。在CSV中,"
被转义两次写入(""
)。您在数据库中看到这一点的事实可能意味着CSV文件中的行和字段在插入之前未正确 un 从CSV转换(转换)为常规文本。
您可以使用内置的PHP函数str_getcsv()
(如果您已经在字符串变量中包含CSV文件)和fgetcsv()
解析(并自动取消)CSV字符串(对于CSV是仍在文件中。)
请参阅链接函数中的示例,以便更好地理解如何使用它们。
获得CSV中的值(新分析和非转义)后,您可以将它们插入数据库中,""
应该再次成为常规"
。
请记住,要将它们插入数据库,它们需要再次进行数据库样式转义(这与CSV样式转义不同)。最简单的方法是通过PDO准备的语句。
一个例子:
$fileHandle = fopen('someCSVfile.csv', 'rb');
if ($fileHandle === false) {
die('Could not open the file!');
}
$db = new PDO('mysql:dbname=test;host=localhost', 'user', 'pass');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $db->prepare('INSERT INTO testTable(column1, column2, column3) VALUES (?, ?, ?)');
while (($csvRow = fgetcsv($fh) !== false) {
if (count($csvRow) !== 3) {
echo 'Encountered a row with a wrong number of fields.';
continue;
}
$stmt->bindValue(1, $csvRow[0]);
$stmt->bindValue(2, $csvRow[1]);
$stmt->bindValue(3, $csvRow[2]);
$stmt->execute();
}