Created
March 31, 2018 11:58
-
-
Save Nor1m/26258a0956c84afb7f70b43887a2899e to your computer and use it in GitHub Desktop.
EXPORT / IMPORT CSV IN PHP (Экспорт / Импорт CSV в PHP)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* класс импорта csv | |
*/ | |
class ExportCSV{ | |
private $filename; // имя файла | |
private $limitflag; // флаг использования лимитов | |
private $limit_start; // лимит стартовая позиция | |
private $limit_end; // лимит конечная позиция | |
private $tablename; // имя таблицы | |
// конструктор | |
function __construct( $options ){ | |
// Указываем, что общаемся с БД только в UTF-8 | |
mysql_query("SET NAMES 'utf8'"); | |
mysql_query("SET CHARACTER SET 'utf8'"); | |
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'"); | |
// инициализация свойств | |
$this -> limitflag = $options['limitflag']; | |
$this -> filename = $_SERVER['DOCUMENT_ROOT'] . "/" . $options['filename']; | |
$this -> limit_start = $options['limit_start']; | |
$this -> limit_end = $options['limit_end']; | |
$this -> tablename = $options['tablename']; | |
$this -> protect(); | |
} | |
/** | |
* функция проверки данных | |
* @return none | |
*/ | |
private function protect(){ | |
if( $this -> limitflag ){ | |
if( !is_numeric( $this -> limit_start ) || !is_numeric( $this -> limit_end ) ){ | |
echo 'Error Limit'; exit(); | |
} | |
} | |
if( $this -> tablename == 'users' ){ | |
echo 'Error tablename'; exit(); | |
} | |
} | |
/** | |
* функция отправки запроса бд | |
* @return $query данные запроса | |
*/ | |
private function query(){ | |
// запросы на вывод информации из бд | |
if( $this -> limitflag ) | |
$limit = "LIMIT " . $this -> limit_start.", " .$this -> limit_end; | |
$query = mysql_query("SELECT * FROM `".$this -> tablename."` $limit "); | |
return $query; | |
} | |
/** | |
* функция записи данных в файл | |
* @return type | |
*/ | |
public function startExport(){ | |
$file = fopen($this -> filename, "w"); // открываем файл для записи | |
$query = $this -> query(); | |
$header = array(); | |
$content_array = array(); | |
// заголовки таблицы | |
$row = mysql_fetch_assoc($query); | |
foreach( $row as $item => $value){ | |
array_push( $header, $item ); // пушим в массив все данные | |
} | |
fputcsv( $file, $header ); | |
// тело таблицы | |
while( $row = mysql_fetch_assoc( $query ) ){ | |
array_push( $content_array, $row ); // пушим в массив все данные | |
} | |
// парсим массив и построчно пишем в файл | |
foreach( $content_array as $item ){ | |
$result = fputcsv( $file, $item ); | |
} | |
fclose($file); // закрываем файл | |
echo $result; | |
} | |
} | |
// опции | |
$options = array( | |
'limitflag' => true, | |
'limit_start' => 0, | |
'limit_end' => 10, | |
'filename' => 'export.csv', | |
'tablename' => 'users', | |
); | |
$export = new ExportCSV($options); // обьект класса ExportCSV | |
$query = $export -> startExport(); // запускаем экспорт | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* класс импорта csv | |
*/ | |
class ImportCSV{ | |
private $delimiter; // разделитель | |
private $file; // массив данных файла импорта | |
private $tablename; // имя таблицы | |
// конструктор | |
function __construct( $options ){ | |
// преобразуем каракули в кириллицу | |
setlocale ( LC_ALL, 'nl_NL' ); | |
// Указываем, что общаемся с БД только в UTF-8 | |
mysql_query("SET NAMES 'utf8'"); | |
mysql_query("SET CHARACTER SET 'utf8'"); | |
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'"); | |
// инициализация свойств | |
$this -> delimiter = $options['delimeter']; | |
$this -> files = $options['file']; | |
$this -> tablename = $options['tablename']; | |
} | |
/** | |
* функция загрузки файла во временное хранилище | |
* @return type | |
*/ | |
public function downloadCSV(){ | |
$types = array('text/plain','text/csv', 'application/vnd.ms-excel'); | |
$size = 100 * 1024 * 1024; // 100 мб | |
if( $this -> files['fileimport']['size'] > $size ){ | |
$msg = "Файл слишком большого размера! (макс 100мб)"; | |
} | |
else if( !in_array($this -> files['fileimport']['type'], $types) ){ | |
$msg = "Доступный тип файла CSV!"; | |
} | |
else if( strlen( $this -> files['fileimport']['name'] ) > 30){ | |
$msg = "Сократите название файла! (макс 30 символов)"; | |
} | |
else if( strpos( strlen( $this -> files['fileimport']['name'] ) , '&') === true ){ | |
$msg = "Недопустимый символ в названии файла!"; | |
} | |
else{ | |
$tmp_name = $this -> files['fileimport']['tmp_name']; | |
return $tmp_name; | |
} | |
echo json_encode( $msg ); // отправка ответа в json | |
exit(); | |
} | |
/** | |
* Функция для вывода данных CSV в массив | |
* @param string $filename имя файла | |
* @return array массив | |
*/ | |
public function CSVToArray() { | |
$this -> filename = $this -> downloadCSV(); | |
// если файла нет или не доступен для чтения | |
if(! file_exists( $this -> filename ) || ! is_readable( $this -> filename ) ){ | |
echo json_encode( "Файл ".$this -> filename." не был найден или недоступен для чтения !" ); | |
exit(); | |
return FALSE; | |
} | |
$data = array(); // массив для данных | |
// если данные удачно считались | |
if ( ( $open_file = fopen( $this -> filename, 'r' ) ) !== FALSE ) { | |
// читаем строку из файла и производим разбор данных CSV | |
while ( ( $row = fgetcsv( $open_file, 1000, $this -> delimiter) ) !== FALSE ) { | |
array_push($data, $row); // забиваем массив данными | |
} | |
// закрываем файл | |
fclose( $open_file ); | |
} | |
return $data; | |
} | |
/** | |
* Функция выдачи строки для запроса | |
* @param int $index индекс | |
* @return string строка для запроса | |
*/ | |
public function getCSVContent($index){ | |
// если тело то выдаем по индексу, иначе шапку | |
if( $index !== false ) { | |
$array = $this -> CSVToArray()[$index][0]; | |
} | |
else { | |
$array = $this -> CSVToArray()[0][0]; | |
} | |
$arr = explode(',', $array); | |
$line = ''; | |
// создаем строку, форматируем текст | |
foreach ( $arr as $key ) { | |
if( $k > 0 ) $del = ', '; | |
// если это шапка или число, то не ставим ковычки | |
if( $index === false || is_numeric($key) ) $quot = ''; | |
else $quot = "'"; | |
$line .= $del . $quot . $key . $quot; | |
$k++; | |
} | |
return $line; | |
} | |
/** | |
* функция отправки данных в бд | |
* @param string $query запрос | |
* @return string ответ | |
*/ | |
public function CSVInDb($query){ | |
mysql_query("ALTER TABLE `".$this -> tablename."` DISABLE KEYS"); // отключаем индексацию таблицы, для максимального быстродействия | |
$res = mysql_query($query); | |
// если ошибка то выводим ее | |
if(! $res ) die( json_encode( mysql_error() ) ); | |
else echo json_encode(1); | |
mysql_query("ALTER TABLE `".$this -> tablename."` ENABLE KEYS"); // включаем индексацию таблицы | |
} | |
/** | |
* функция создания запроса | |
* @return string запрос | |
*/ | |
public function createQuery(){ | |
$size = count( $this -> CSVToArray() );// размер массива с учетом шапки | |
$headline = $this -> getCSVContent(false); // данные заголовка | |
$query = "INSERT INTO `".$this -> tablename."` ($headline) VALUES"; | |
// проходимся циклом по каждой мтроке и добавляем ее в запросы | |
for ($i=1; $i < $size; $i++) { | |
$line = $this -> getCSVContent($i); // данные тела | |
if( $i > 1 ) $del = ','; | |
$query .= $del . " ($line)"; | |
} | |
$query = $query.";"; | |
return $query; | |
} | |
} | |
//ВЫЗОВ | |
function downloadCSVAction(){ | |
if ($_SERVER['REQUEST_METHOD'] == 'POST'){ | |
// опции | |
$options = array( | |
'delimeter' => $_POST['delimiter'], | |
'file' => $_FILES, | |
'tablename' => $_POST['tablename'], | |
); | |
$import = new ImportCSV( $options ); // обьект класса ImportCSV | |
$query = $import -> createQuery(); // создаем запрос | |
$import -> CSVInDb( $query ); // отправляем запрос в базу | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment