PHP PDO基础知识!转义/取消转义特殊字符

PHP PDO基础知识!转义/取消转义特殊字符,php,pdo,escaping,special-characters,Php,Pdo,Escaping,Special Characters,我刚开始使用PDO方法,并设法创建了一个表并从.csv文件中插入了10条测试记录。我检查了phpMyAdmin中的表,发现包含语音标记的字段(在csv文件中)完全用双引号括起来,如“原始csv值”“将”“类似于此”-这是正确的还是我做错了什么 如果这是正确的,如何在没有额外双引号的情况下使输出正常显示 我希望这有意义?我读过大量类似于这个问题的问答,但没有一个解释DB本身应该发生什么,以及在涉及特殊字符时,我如何将数据拉回来并正确显示。我可以把它拉出来并显示出来——但只有在有额外引号的情况下。救

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

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

我希望这有意义?我读过大量类似于这个问题的问答,但没有一个解释DB本身应该发生什么,以及在涉及特殊字符时,我如何将数据拉回来并正确显示。我可以把它拉出来并显示出来——但只有在有额外引号的情况下。救命啊!求你了


他最终到达了那里。谢谢你的帮助。你是对的,是CSV文件包含转义字符,所以它可以正常工作,而不是我想要的那样。下面是最后的代码,希望将来能对别人有所帮助。它从CSV数据中删除双引号等,并将其按预期方式存储在表中:-)


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

您可以使用内置PHP函数(如果字符串变量中已经有CSV文件)和(当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();
}

Post代码和示例数据。
$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();
}