PHP PDO基础知识!逃离/解开特殊角色


PHP PDO Basics! Escaping/Unescaping Special Characters

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

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

我希望这有道理?我已经阅读了大量的问答;A与这个问题类似,但没有一个解释DB本身应该发生什么,以及当涉及特殊字符时,我如何将数据提取出来并正确显示它。我可以把它拔出来并显示出来,但前提是要有额外的引号。帮助请


最终到达了那里。谢谢你的帮助。你是对的,是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;
?>

您看到的是CSV样式的转义。在CSV中,通过两次写入"""),对其进行转义。您在数据库中看到的事实可能意味着CSV文件中的行和字段在插入之前没有正确地从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();
}