【问题标题】:PHP PDO Basics! Escaping/Unescaping Special CharactersPHP PDO 基础知识!转义/取消转义特殊字符
【发布时间】:2013-08-12 22:32:21
【问题描述】:

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

【问题讨论】:

  • 邮政编码和示例数据。

标签: php pdo escaping special-characters


【解决方案1】:

您看到的是 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多