Skip to content

Instantly share code, notes, and snippets.

@Nor1m
Created March 31, 2018 11:58
Show Gist options
  • Save Nor1m/26258a0956c84afb7f70b43887a2899e to your computer and use it in GitHub Desktop.
Save Nor1m/26258a0956c84afb7f70b43887a2899e to your computer and use it in GitHub Desktop.
EXPORT / IMPORT CSV IN PHP (Экспорт / Импорт CSV в PHP)
<?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(); // запускаем экспорт
<?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