0

我刚开始使用 PDO 方法并设法创建一个表并从 .csv 文件中插入 10 条测试记录。我检查了 phpMyAdmin 中的表格,并注意到包含语音标记的字段(在 csv 文件中)完全用双引号括起来,例如“原始 CSV 值”“将”“像这样” - 这是正确的还是我做错了什么?

如果那是正确的,如何在没有额外双引号的情况下正常显示输出?

我希望这是有道理的?我已经阅读了大量与此问题类似的问答,但没有一个人解释了数据库本身应该发生的实际情况,以及随后我如何将数据拉回并在涉及特殊字符时正确显示。我可以把它拉出来并显示出来——但只有存在额外的引号。帮助!请!


最后到了那里。谢谢您的帮助。你是对的,它是包含转义字符的 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;
?>
4

1 回答 1

2

您看到的是 CSV 样式的转义。在 CSV 中,a通过写入两次 ( )"进行转义""。您在数据库中看到的事实可能意味着 CSV 文件中的行和字段在插入之前没有正确地从CSV转义(转换)为常规文本。

您可以使用内置的 PHP 函数解析(并自动取消转义)CSV 字符串str_getcsv()(如果字符串变量中已经有 CSV 文件)和fgetcsv()(当 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();
}
于 2013-08-12T22:42:13.980 回答