A
A
alexspi2016-03-18 17:37:07
PHP
alexspi, 2016-03-18 17:37:07

How to correctly update the database when importing from CSV?

Once again, hello everyone. I wrote a small code for importing from csv to mysql
-csv into an array, it converts normally
- it imports normally
, but with the fact that it would be by column if there is a value before doing update and not insert, I can’t figure it out either

<?php

$allowed_extensions = array('csv');

$upload_path = '/completed';

if (!empty($_FILES['file'])) {

  if ($_FILES['file']['error'] == 0) {
  $file = explode(".", $_FILES['file']['name']);
  $extension = array_pop($file);

  if (in_array($extension, $allowed_extensions)) {

    if (move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name'])) {

      $handle = $_FILES['file']['name'];


$options = array(
  'enable'        => true, // Скрипт работает только если значение TRUE
  /* Настройки CSV */
  'filename'      => $handle, // Имя файла CSV. Находиться должен в одной папке со скриптом
  'delimiter'     => ';', // Какой разделитель используется
  /* Настройки подключения к БД */
  'db_server'     => 'localhost', // Сервер БД
  'db_user'       => 'root', // Имя пользователя
  'db_password'   => '', // Пароль
  'db_base'       => 'dvigloshop' // Имя базы данных

);

if(!$options['enable']) die('Скрипт отключен, дальнейшая обработка данных невозможна!');

/*
*
*  Функции скрипта
*
*/

// Основная функция, из импортируемого файла выбираем данные в массив
// !Во время первой итерации значения первой строки будут являться ключами ассоциативного массива!

function csv_to_array($filename='') {
  if(!file_exists($filename) || !is_readable($filename)){
    return FALSE;
  }
  global $options;
  $header = NULL;
  $data = array();
  if (($handle = fopen($filename, 'r')) !== FALSE) {
    while (($row = fgetcsv($handle, 1000, $options['delimiter'])) !== FALSE) {
      if(!$header)
        $header = $row;
      else
        $data[] = array_combine($header, $row);
    }
    fclose($handle);
  }
  return $data;
}


/*
*  Подключаемся к Базе Данных
*
*/

$link = mysqli_connect($options['db_server'], $options['db_user'], $options['db_password'],$options['db_base']);
if (!$link) {
  die('Ошибка соединения: ' . mysqli_error($link));
}

// Указываем, что общаемся с БД только в UTF-8

mysqli_query($link,"SET NAMES 'utf8'");
mysqli_query($link,"SET CHARACTER SET 'utf8'");
mysqli_query($link,"SET SESSION collation_connection = 'utf8_general_ci'");

// Выбираем интересующую нас Базу

//$db_selected = mysqli_select_db($link,$options['db_base']);
//if (!$db_selected) {
//	die ('Не удалось выбрать базу db_data: ' . mysqli_error($link));
//}

// Отключаем индексацию таблицы, для максимального быстродействия

mysqli_query($link,"ALTER TABLE `".$options['db_base']."` DISABLE KEYS");
$obn=0;
$dob=0;
foreach (csv_to_array($options['filename']) as $val) {
  $rrrr="";
  // Тут собственно делаем запросы в соответствии с задачей
  echo 'Массив входящий';
  print_r($val);
  echo '</br></br>';

//получаю значение поля
  $zavnumber = current($val);
  //выбираю из базы по этому значению
  $zapnumber = "SELECT * FROM `sdvd_products` WHERE `zavnumber`='".$zavnumber."'";
//	$querynumber = mysqli_query($link,$zapnumber);
//	$row = mysqli_fetch_assoc($querynumber);
//	$rrrr = $row["zavnumber"];

  $zapnumber = mysqli_real_escape_string($link, $zapnumber);

  if ($result = mysqli_query($link, $zapnumber)) {
    echo 'Переменная result';
    print_r($result);
    echo '</br></br>';
    /* извлечение ассоциативного массива */
    while ($row = mysqli_fetch_assoc($result)) {
      printf ($row);
      $rrrr = $row["zavnumber"];
    }
    echo "ffff".$rrrr;
    echo '</br></br>';
    /* удаление выборки */
    mysqli_free_result($result);
  }



  echo 'Номер';
  var_dump($zavnumber);
  echo '</br></br>';
  echo 'Запрос на номер';
  var_dump($zapnumber);
  echo '</br></br>';
//	print_r($querynumber);
//	echo '</br></br>';
//	print_r($rrrr);
//	echo '</br></br>';

  if ($rrrr !== ""){

  $sql_values = array();
  while(list($key,$value) = each($val)){
    $keyval = "`".$key ."` = '".$value."'";

    print_r($keyval);
    echo '</br></br>';

    array_push($sql_values,$keyval);
  }

    print_r($sql_values);
    echo '</br></br>';
        $tab = implode(', ',$sql_values);
    $sql = "UPDATE `sdvd_products` SET ". $tab ." WHERE `zavnumber`=\'".$zavnumber."\'";

        $obn++;
    print_r($sql.'</br>');
  }else{
    $sql  = "INSERT INTO `sdvd_products`";
    // implode keys of $array...
    $sql .= " (`".implode("`, `", array_keys($val))."`)";
    // implode values of $array...
    $sql .= " VALUES ('".implode("', '", $val)."') ";

        $dob++;

    print_r($sql.'</br>');
  }

    mysqli_query($link,$sql);


    $sql = "";
}

// Включаем индексацию таблицы

mysqli_query($link,"ALTER TABLE `".$options['db_base']."` ENABLE KEYS");

// Закрываем соединение с БД

mysqli_close($link);

echo"Обновлено ".$obn;
    echo"Добавлено ".$dob;


    }
  } else {
        $message = '<span class="red">Only .csv file format is allowed</span>';
      }

    } else {
      $message = '<span class="red">There was a problem with your file</span>';
    }

  }

?>
<!DOCTYPE HTML>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>Upload CSV to MySQL</title>
  <meta name="description" content="" />
  <meta name="keywords" content="" />
  <link href="css/core.css" rel="stylesheet" type="text/css" />
  <!--[if lt IE 9]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  <![endif]-->
</head>
<body>

<section id="wrapper">	
  
  <form action="" method="post" enctype="multipart/form-data">
  
    <table cellpadding="0" cellspacing="0" border="0" class="table">
      <tr>
        <th><label for="file">Select file</label> <?php echo $message; ?></th>
      </tr>
      <tr>
        <td><input type="file" name="file" id="file" size="30" /></td>
      </tr>
      <tr>
        <td><input type="submit" id="btn" class="fl_l" value="Submit" /></td>
      </tr>
    </table>
    
  </form>
  
</section>

</body>
</html>

format csv
zavnumber
; price ; quantity
_
_ -12056;86753;3 rrr32-12057;86753;3 99132-12058;86753;3 99132-12059;86753;4 99132-12060;86753;3 99132-12061;86753;3 99132-12062;3; 8 12063;86753;3 99132-12064;86753;3 99132-12065;86753;3

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
alex stephen, 2016-03-18
@berezuev

LOAD DATA INFILE file.csv REPLACE INTO TABLE t1;
And it will work hundreds of times faster than your bike.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question