Подтвердить что ты не робот

Эвакуация для CSV

Мне нужно сохранить строку в базе данных MySQL. Значения позже будут использоваться в CSV. Как избежать строки, чтобы она была CSV-безопасна? Я предполагаю, что мне нужно избегать следующего: запятая, одинарная кавычка, двойная кавычка.

Функция PHP addslashes:

одинарная кавычка ('), двойная кавычка ("), обратная косая черта() и NUL (байт NULL).

Так что это не сработает. Предложения? Я бы предпочел не пытаться создать какое-то регулярное выражение.

Кроме того, мне нужно иметь возможность unescape.

4b9b3361

Ответ 1

Используйте fputcsv() для записи и fgetcsv() для чтения.

Ответ 2

fputcsv() не всегда требуется, особенно если вам не нужно писать какой-либо файл, но вы хотите вернуть CSV в качестве ответа HTTP. Все, что вам нужно сделать, - это удвоить кавычки каждого значения и избежать двойных кавычек, повторяя двойную кавычку каждый раз, когда вы ее найдете.

Вот несколько примеров:

hello -> "hello"
this is my "quote" -> "this is my ""quote"""
catch 'em all -> "catch 'em all"

Как вы видите, одиночный кавычек не нуждается в экранировании.

Выполняет полный рабочий пример:

<?php

$arrayToCsvLine = function(array $values) {
    $line = '';

    $values = array_map(function ($v) {
        return '"' . str_replace('"', '""', $v) . '"';
    }, $values);

    $line .= implode(',', $values);

    return $line;
};

$csv = [];
$csv[] = $arrayToCsvLine(["hello", 'this is my "quote"', "catch 'em all"]);
$csv[] = $arrayToCsvLine(["hello", 'this is my "quote"', "catch 'em all"]);
$csv[] = $arrayToCsvLine(["hello", 'this is my "quote"', "catch 'em all"]);

$csv = implode("\r\n", $csv);

Если вы получаете сообщение об ошибке, просто потому, что используете старую версию PHP. Исправьте его, объявив массивы с их старым синтаксисом и заменив лямбда-функцию классическим.

Ответ 3

Не храните данные CSV в базе данных. Escape it при экспорте в CSV с помощью fputcsv. Если вы сохраняете CSV, вы сохраняете мусор для всех целей, кроме экспорта CSV.

Ответ 4

Для тех из вас, кто пытается дезинформировать данные с помощью PHP и выводить их как CSV, это можно сделать с помощью функции PHP fputcsv() без необходимости записи в файл как таковой:

<?php
// An example PHP array holding data to be put into CSV format
$data = [];
$data[] = ['row1_val1', 'row1_val2', 'row1_val3'];
$data[] = ['row2_val1', 'row2_val2', 'row2_val3'];

// Write to memory (unless buffer exceeds 2mb when it will write to /tmp)
$fp = fopen('php://temp', 'w+');
foreach ($data as $fields) {
    // Add row to CSV buffer
    fputcsv($fp, $fields);
}
rewind($fp); // Set the pointer back to the start
$csv_contents = stream_get_contents($fp); // Fetch the contents of our CSV
fclose($fp); // Close our pointer and free up memory and /tmp space

// Handle/Output your final sanitised CSV contents
echo $csv_contents;