PHP PDO基础知识!逃避/取消特殊字符

时间:2013-08-12 22:32:21

标签: php pdo escaping special-characters

我刚刚开始使用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;
?>

1 个答案:

答案 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();
}