Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

импорт отдельных столбцов CSV


Recommended Posts

Добрый день. Стоит задача обновлять наличие по определенным столбцам в CSV-файле - 3 столбец это артикул, 8 - наличие. Попытался решить её таким образом:

public function import83() {

if($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validate()) {

if(is_uploaded_file($this->request->files['import83']['tmp_name'])) {

if(($handle = fopen($this->request->files['import83']['tmp_name'], "r")) !== FALSE) {
$headers = fgetcsv($handle, 0, ';', '"');

$k = 0; //счетчик позиций
while(($data = fgetcsv($handle, 0, ';', '"')) !== FALSE) {
for ($i=1; $data = fgetcsv($handle, 0, ';', '"'); $i++)
 {
   $sql = "select sku, quantity from product";
   $res = mysql_query($sql);
	while ($row = mysql_fetch_array($res)){  
          if ($data[3]==$row['sku']){							
           $quan = (int)preg_replace("/\D/","", $data[8]);
           $sku = (int)preg_replace("/\D/","", $data[3]);
	    if ($data[8] != $row['quantity']) {

               $sql = mysql_query("UPDATE". DB_PREFIX . "product SET quantity = ". $quan . "WHERE sku =" . $sku);
	       $k++;
												
				}
	  else {echo 'что-то пошло не так!';}
											
		}
										
	}
									
	}
	}
					
						
	fclose($handle);
	$this->session->data['success'] = sprintf($this->language->get('Обновлено %s позиций'), $k);
	$this->cache->delete('product');
		}
		}
	$this->redirect($this->url->link('module/csvimport', 'token=' . $this->session->data['token'], 'SSL'));
		}

	}

Но позиции обновляются как-то выборочно.

Надіслати
Поділитися на інших сайтах


public function import83() {
первая мысль - "куда делись предыдущие 82 метода? О_о". :D

для начала приведи код к читабельному виду.

всё, что у тебя внутри

for ($i=1; $data = fgetcsv($handle, 0, ';', '"'); $i++)
 {
дикий трэш, вызывающий вот такую реакцию - facepalm.gif

особенно - сначала сравнение sku

if ($data[3]==$row['sku']){
а ПОТОМ вырезание из него всего, кроме цифр

           $sku = (int)preg_replace("/\D/","", $data[3]);
и использование его покоцанного в sql-выборке

..."WHERE sku =" . $sku);

Но позиции обновляются как-то выборочно.

в чем это проявляется?

Надіслати
Поділитися на інших сайтах

 первая мысль - "куда делись предыдущие 82 метода? О_о".  :D

 

Они не выдержали)

 

 

 

использование его покоцанного в sql-выборке

 

Так мне и нужны одни цифры, встречаются пробелы в артикуле.

 

 

 

в чем это проявляется?

 

Эм, работает только счетчик и показывает сколько нашлось совпадений артикулов.

Надіслати
Поділитися на інших сайтах


 Благодарю за модуль. Но мне нужно ОБНОВЛЯТЬ наличие по артикулам из других файлов - прайс-листов поставщика.

Надіслати
Поділитися на інших сайтах


приведи код к читабельному виду.

определись:

"позиции обновляются..." или "работает только счетчик..."?

 

 

Читабельному какому? Если бы я знал какой читабельный, он был бы читабелен. 

Так?

for ($i=1; $data = fgetcsv($handle, 0, ';', '"'); $i++){
$sql = "select sku, quantity from product";
$res = mysql_query($sql);
$quan = (int)preg_replace("/\D/","", $data[8]);
$sku = (int)preg_replace("/\D/","", $data[3]);
  while ($row = mysql_fetch_array($res)){  
    if ($sku == $row['sku']){
	if ($quan != $row['quantity']) {
												
                $sql = mysql_query("UPDATE". DB_PREFIX . "product SET quantity = ". $quan . "WHERE sku =" . $sku);
		$k++;
												
			}
			else {echo 'что-то пошло не так!';}
											
		}
										
	}
									
}

Раньше относительно успешно обновлялись. Сейчас работает только счетчик.

Надіслати
Поділитися на інших сайтах


mysql_fetch_array

mysql_query

вы в код движка заглядывали?

 

Ну, как сказать))) Мне так проще было. Скажите, просто - что ты тут и тут не прав. А риторические вопросы мне проблему не решат (((

Надіслати
Поділитися на інших сайтах


выше ссылка на модуль которые делает похожее

смотрите как там сделано, переделывайте под свои нужды

то что вы написали это мусор, не думаю что у кого-то есть желание в нем копаться

Надіслати
Поділитися на інших сайтах

Воспользовался Вашим советом. Однако, не приносит нужных результатов. Тут тоже мусор?

public function import83() {

	if($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validate()) {

		if(is_uploaded_file($this->request->files['import83']['tmp_name'])) {

		if(($handle = fopen($this->request->files['import83']['tmp_name'], "r")) !== FALSE) {
		$headers = fgetcsv($handle, 0, ';', '"');

		$k = 0; //счетчик позиций
			while(($data = fgetcsv($handle, 0, ';', '"')) !== FALSE) {
				$num = count($data);
				$bad = 'не правильно!';
				$quan = (int)preg_replace("/\D/","", $data[8]);
				$sku = (int)preg_replace("/\D/","", $data[3]);
					for($c = 0; $c < $num; $c++) {
						if(isset($headers[$c])) { //если файл есть, то
							if($sku == $this->allowed_fields->sku) { 
									
								var_dump ($data);	
									
								} else {
								var_dump ($bad); exit;}
							
							}
						}
					}
				}
			$this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = ". $quan . "WHERE sku =" . $sku);
		$k++;
				
			fclose($handle);
			$this->session->data['success'] = sprintf($this->language->get('Обновлено %s позиций'), $k);
			$this->cache->delete('product');
		}
		}
			$this->redirect($this->url->link('module/csvimport', 'token=' . $this->session->data['token'], 'SSL'));
		}
Надіслати
Поділитися на інших сайтах


ДА.

upd:

но меньше :-)

upd2:

$this->allowed_fields->sku --- тут что?
...
if($sku == $this->allowed_fields->sku) {
var_dump ($data);
...
>>

...
if($sku == $this->allowed_fields->sku) {
$this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = ". $quan . "WHERE sku =" . $sku);
$k++;
var_dump ($data);
...
Змінено користувачем afwollis
Надіслати
Поділитися на інших сайтах

$this->allowed_fields->sku --- тут что?

 

На сколько я понимаю, массив из таблицы product))

public $allowed_fields = array('model', 'sku', 'upc', 'location', 'quantity', 'stock_status_id', 'image', 'manufacturer_id', 'shipping', 'price', 'points',
								   'tax_class_id', 'date_available', 'weight', 'weight_class_id', 'length', 'width', 'height', 'length_class_id', 'subtract',
								   'minimum', 'sort_order', 'status', 'date_added', 'date_modified', 'viewed');
Надіслати
Поділитися на інших сайтах


facepalm.gif

http://php.net/manual/ru/function.fgetcsv.php

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num полей в строке $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>

$row = 1;
$k = 0;
if (($handle = fopen($this->request->files['import83']['tmp_name'], "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num полей в строке $row: <br /></p>\n";
        if (isset($data[3]) && isset($data[8])) { // ты уверен, что 3-8, а не 2-7 ?
            $sku = (int)preg_replace("/\D/","", $data[3]);
            $qty = (int)preg_replace("/\D/","", $data[8]);
            $this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = ". (int)$qty . "WHERE sku =" . $this->db->escape($sku));
            $k++;
        }
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
Змінено користувачем afwollis
Надіслати
Поділитися на інших сайтах

Слегка подправил. 

while(($data = fgetcsv($handle, 0, ';', '"')) !== FALSE) {
				$num = count($data);
				$bad = 'не правильно!';
				$sku_db = $this->allowed_fields['sku'];
				$quan = (int)preg_replace("/\D/","", $data[8]);
				$sku = (int)preg_replace("/\D/","", $data[3]);
					for($c = 0; $c < $num; $c++) {
						if(isset($headers[$c])) { //если файл есть, то
							
							if($sku == $sku_db) {
							$this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = ". $quan . "WHERE sku =" . $sku);
							$k++;
							//var_dump ($data);
							}
						}
						}
			}
По выполнению - белый экран ((

Если закоментить запрос к базе, то выводит дату.

Надіслати
Поділитися на інших сайтах


Благодарю. Только не перезаписывает поля с наличием. Выходит, даже тот ахтунг, что у меня был, раньше работал и менял наличие. А сейчас, как и Ваш код - он не обновляет наличие. Видимо, причина тут в другом. ((( На счет полей уверен.

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.