Мне нужно сохранить строку в базе данных MySQL. Значения позже будут использоваться в CSV. Как избежать строки, чтобы она была CSV-безопасна? Я предполагаю, что мне нужно избегать следующего: запятая, одинарная кавычка, двойная кавычка.
Функция addslashes
PHP addslashes
:
одиночная кавычка ('), двойная кавычка ("), обратная косая черта () и NUL (байт NULL).
Так что это не сработает. Предложения? Я бы предпочел не пытаться создать какое-то решение регулярных выражений.
Кроме того, мне нужно иметь возможность unescape.
Используйте fputcsv()
для записи и fgetcsv()
для чтения.
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. Исправьте его, объявив массивы старым синтаксисом и заменив лямбда-функцию классическим.
Не храните данные CSV в базе данных. fputcsv
его, когда вы экспортируете в CSV, используя fputcsv
. Если вы сохраняете CSV, вы сохраняете мусор для всех целей, кроме CSV-экспорта.
Для тех из вас, кто пытается дезинформировать данные с помощью PHP и выводить их как CSV, это можно сделать с помощью функции fputcsv () PHP без необходимости записи в файл как таковой:
<?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;