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

mario512

Користувачі
  • Публікації

    355
  • З нами

  • Відвідування

Повідомлення, опубліковані користувачем mario512

  1. 09.04.2022 в 21:34, chukcha сказал:

    пробуйте

    Зачем вам подготовленный запрос для инсерта?

    Я могу понять подготовленный для множественных селектов (getProduts + getProduct), когда не будет потрачено время на план запроса
     

    Да в принципе на данном этапе просто пытаюсь оптимизировать скрипт для заливки товаров на сайт. Мысль уловил. Огромное спасибо. Харьков - Держитесь!

  2. 09.04.2022 в 21:08, chukcha сказал:

    можно и для PDO так сделать

     

    Да, но насколько я понял, если не использовать подготовленный запрос. Просто придётся накидать дополнительно новый метод для такого случая)

  3. 09.04.2022 в 18:36, chukcha сказал:

    а в чем трудность написать свой запрос (не в рамках PDO и выполнить

    или так

    $data = [
        ['aaa','nnn', 'xxx'],
        ['bbb','mmm', 'yyy']
    ];
    $query = $pdo->prepare("INSERT INTO table (f1, f2, f3) VALUES (?,?,?)");
    foreach ($data as $row) {
            $query->execute($row);
    }

    @buslikdrev дал ссылку на пример

    Я уже понял. Так примерно и сделал. Просто не до конца разобрался. Думал что $query->execute($row); нет необходимости выполнять в цикле. Хотел этого избежать, т.к. в будущем планировал запись большого количества строк в бд. 

    При использовании mysqli использовал данный способ:

    $query = ""INSERT INTO table (f1, f2, f3) VALUES ";

    foreach ($data as $key => $value) {

        $query .= '(' . $value['f1'] . ',' . $value['f2] . ',' . $value['f3] . '),';

    }

    Это давало мне необходимую производительность. 

  4. В общем, насколько я понял, с PDO и подготовленным запросом, много строк за одну транзакцию не вставить. В цикле можно передавать параметры только для одной строки, затем фиксировать. Такой трюк работает только с msqli. Вопрос закрыт.

    P.S. В коде есть ошибка, execute() вынесен из цикла...

  5. @buslikdrev Массив содержит ключ, который равен именованному указателю в самом запросе. Пример  :order_id Ключ 'data' => переменная со со значением, которое необходимо вставить в запрос, ключ 'type' => тип значение (PDO::PARAM_INT или PDO::PARAM_STR). Если не указать тип значения, то запрос в который передаётся значение переменной (int), вызывает ошибку, требуя явно указать тип значения. Данная задача не относиться на прямую к OpenCart. Но в в версии OpenCart 2.3 это реализовано так:

    Скрытый текст
    public function bindParam($parameter, $variable, $data_type = \PDO::PARAM_STR, $length = 0) {
    		if ($length) {
    			$this->statement->bindParam($parameter, $variable, $data_type, $length);
    		} else {
    			$this->statement->bindParam($parameter, $variable, $data_type);
    		}
    	}

     

     

  6. Добрый день. Подскажите, как правильно выполнить множественный запрос на запись данных использую PDO и подготовленный запрос.

    Вот код

    Скрытый текст
    $resultQuery = $this->db->prepare($query);
    
    if ($queryParam) {
        foreach ($queryParam as $key => $valueParam) {
           foreach ($valueParam as $param => &$dataParam) {
              $resultQuery->bindParam(":$param", $dataParam['data'], $dataParam['type']);
           }
        }
    }
    
    $resultQuery->execute();

     

    Данные формирует данный метод:

    Скрытый текст
    private static function insertOrderProduct($productData, $orderId)
        {
            if (!empty($productData) || !empty($orderId)) {
                $db = Registry::get('db');
                $query = 'INSERT INTO orders_product ( '
                    . 'order_id, product_id, quantity'
                    . ') VALUES ( '
                    . ':order_id, '
                    . ':product_id, '
                    . ':quantity '
                    . ')';
                foreach ($productData as $key => $product) {
                    $queryParam[] = array(
                        'order_id' => array(
                            'data' => $orderId,
                            'type' => PDO::PARAM_STR
                        ),
                        'product_id' => array(
                            'data' => $product['product_id'],
                            'type' => PDO::PARAM_STR
                        ),
                        'quantity' => array(
                            'data' => $product['quantity'],
                            'type' => PDO::PARAM_STR
                        )
                    );
                }
                $db->query($query, $queryParam);
            }
        }

     

    Вот массив, который он формирует:

    Скрытый текст
    Array
    (
        [0] => Array
            (
                [order_id] => Array
                    (
                        [data] => 116
                        [type] => 2
                    )
    
                [product_id] => Array
                    (
                        [data] => 66
                        [type] => 2
                    )
    
                [quantity] => Array
                    (
                        [data] => 1
                        [type] => 2
                    )
    
            )
    
        [1] => Array
            (
                [order_id] => Array
                    (
                        [data] => 116
                        [type] => 2
                    )
    
                [product_id] => Array
                    (
                        [data] => 65
                        [type] => 2
                    )
    
                [quantity] => Array
                    (
                        [data] => 1
                        [type] => 2
                    )
    
            )
    
        [2] => Array
            (
                [order_id] => Array
                    (
                        [data] => 116
                        [type] => 2
                    )
    
                [product_id] => Array
                    (
                        [data] => 64
                        [type] => 2
                    )
    
                [quantity] => Array
                    (
                        [data] => 1
                        [type] => 2
                    )
    
            )
    
    )

     

    Структура таблицы:

    Скрытый текст

    1.thumb.png.cdb212344644ff5bebe7a1fbda4167e7.png

    Проблема заключается в том, что в таблицу залетает только первая запись.

     

  7. 8 минут назад, egor23 сказал:

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

    и по опыту скажу, бегут не только оттуда, но и с битрикса, а уж про WP я лучше промолчу )

    приведите пример подтверждающий ваши слова, назовите платный движок которой по вашему высказыванию будет дешевле опенкарта с одинаковым функционалом.

     

    Какой функционал вы имеете ввиду? Стандартный голый OC? Некоторых устраивает функционал pron.ua. Я ище раз повторюсь. Я не пропагандирую использование платных и готовых решений. Я сторонник OC. Я пытался донести мысль, что полногстью готовый и настроенный магазин на этом бесплатном движке, не такой уж и бесплатный. А что самое неудобное, это фрагментация модулей от разных разработчиков, которые иногда конфликтуют с шаблонами, другими модулями и т.д. 

    Вот такой пример. Он не про OC. Работаю с одним поставщиком товаров, который сайт не мог родить лет пять. Задал ему вопрос, почему? На что он поведал интересную историю.

     Захотел он сайт для оптовой торговли. Наименований товара порядка 20к. Естественно стал пробивать по знакомым. Посоветовали ему Васяна, который якобы сайты делает. Этот Васян с него доил примерно год. Не знаю на чём был сайт, но без слёз на него не посмотришь. причем это не только касаемо технической части. Так его и не запустили. Заказчик в итоге дал ему пинка, и перешел на porn.ua. Там его доили еще два года. После всего он нашел нормального исполнителя, который на престажоп запилил ему сносный магазин, который работает по сей день. Всего он потратил порядка 12k вечно зеленых. Так вот я уверен, если бы он зная наперед, через что ему придется пройти, предложили бы готовое решение за 10k, наверняка согласился бы. Таким людям пофиг на чём работает их магазин. Главное чтобы быстро и без *боты всякой. 

     

  8. 7 минут назад, Pascha сказал:

    Скройте бесплатный дистрибутив, сделайте платный, баксов за 500-1000,  шаблонный вариант Опенкарт нашпигованный никогда не пригодящихся модулей и подобные типы заткнутся.
    Скажут: Опенкарт крутой...он дешевле чем Битрикс...
    Ключевое слово - бесплатный движок (но ни кто не говорил "бесплатный интернет магазин") всех раздражает.

    Уверен, покупателей будет достаточно))))

  9. 17 минут назад, nikifalex сказал:

    Вот же какой у людей бред то в голове. Что мешает не заниматься всем этим, а просто найти кто все сделает "под ключ". ну кроме жадности.

    Так вот уверяю вас, в других движках все тоже самое будет или хуже или дороже. И вам всеравно нужна будет техподдержка, и она будет гораздо более редкая или более дорогая.  Просто она вам понадобиться чуть чуть позже, когда уже "засосет в это болото". Для примера просто посмотрите на тот же битрикс или ваш любимый хорошоп. Когда вы чуть чуть попытаете выйти за рамки.

     

     

    Изложил данное из опыта общения с людьми, которые через это прошли. Вопрос не столько в жадности а сколько в добросовестности и компетентности разработчиков, которые предлогают свои услуги. Я же это указал.

    2 часа назад, mario512 сказал:

    Если смотреть глазами заказчика

    Хорошоп терпеть ненавижу. Просто пример привел. Ай Лав Опенкарт

  10. 12 минут назад, OCdevWizard сказал:

    Ваше сообщение какое имеет отношение к тематике этого поста?

    Ответ:

    В 21.07.2021 в 13:20, tdslava сказал:

    В сообществе маркетологов обсуждали на чем сайты делать и люди активно выступали за WP и WooCommerce. Удивился тому, что никто не вспомнил про Опенкарт и полез за агит-материалами. Обнаруженное неприятно удивило:

    судя по статистике Google Trends, Опенкарт давно прошел пик популярности и теряет позиции, падая уже ниже того самого WC. Вордстат не даёт такого периода наблюдений, но подтверждает тенденцию. Битрикс тоже плавно скатывается.

    Моё сообщение - размышление на тему падения популярности OC. Лично не имею ничего против енного, т.к. сам его активно юзаю. Я не в коем случае не оскорбляю чувства верующих.

  11. Если смотреть глазами заказчика, то запуск им на бесплатном OC сравним к походу к врачу в "государственную" больницу при нашей "бесплатной" медицине. По факту, не за деньги, его только скачать можно. Для заказчика начинается реальный геморой:

     

     1) поиск и перебор исполнителей для запуска и мелких правок (не всегда компетентных, за деньги) 

     2) выбор шаблонов и покупка (за деньги) 

     3) покупка модулей для им (за деньги) 

     4) поиск и перебор SEO специалистов (не всегда компетентных, за деньги) 

     5) самомтоятельный поиск решений различных вопросов на форуме, где в него любезно тычут ссылками на платные модули (зачастую функционально не соответствующих своей стоимости и косвенно удовлетворяющих потребности)

     

    Это только то что на ум приходит. Конечно люди все чаще предпочитают маркетплейсы и хорошопы. Как это не прискорбно, но бесплатный OC нередко выходит дороже платных и готовых решений. Все преимущества, которые у него есть, они очевидны только разработчикам и программистам. Клиентам на это плевать. 

     

  12. Только что, Domanvi сказал:

    Привет!

    Каким образом организовал перевод!? Все товары вручную переводил или есть модуль для автоматического перевода?

     

    В шапке не все переведено

    image.thumb.png.2a614c091e8e9b5c2d952030b0b8c77c.png

    Использовал API Яндекс, пока не прикрыли лавочку. Спасибо за замечание. Исправлю.

  13. Если у товара в 1с и OpenCart есть одинаковый реквизит, по которому их можно связать, то для обновления цен и остатков можно использовать mysql-connector-odbc-5.3.13-win32. 

    Пример кода обработки 1с:

    Перем Соединение;
    
    Процедура УстановкаСоединения()
    	Драйвер = "MySQL ODBC 5.3 Unicode Driver";	
    	Сервер = "";
    	База = "";
        Логин = "";
        Пароль = "";
        КодСтр = "";
    	КодСтр = "STMT=set character_set_results=cp1251;"    
    
    	Соединение = СоздатьОбъект("ADODB.Connection");
    	
    	
    	
    	СтрокаСоединения = "DRIVER="+СокрЛП(Драйвер)+";SERVER="+СокрЛП(Сервер)+";DataBase="+СокрЛП(База)+";UID="+СокрЛП(Логин)+";PWD="+СокрЛП(Пароль)+";"+СокрЛП(КодСтр);
    	Соединение.ConnectionString = (СтрокаСоединения);
    	Попытка
    		Соединение.Open();
    		Conect=1;
    	Исключение
    		Conect=0;
    		Сообщить("Не могу подключиться к базе!!!");
    	КонецПопытки;
    КонецПроцедуры
    
    Процедура ВыгрузитьОстатки()
    	УстановкаСоединения();
    	ЗапросНоменклатура = СоздатьОбъект("Запрос");
    	ТекстЗапроса = 	"//{{ЗАПРОС(ВыбратьНоменклатуру)
    	|Номенклатура = Справочник.ДопРеквизиты.ТекущийЭлемент;
    	|НоменклатураТМЦ = Справочник.ДопРеквизиты.ТМЦ.ТекущийЭлемент;
    	|НоменклатураЦена = Справочник.ДопРеквизиты.ТМЦ.ТекущийЭлемент.Цена2;
    	|Условие(Номенклатура.АйДи <> 0);
    	|Условие(Номенклатура.Включить = Перечисление.ДаНет.Да);
    	|Группировка Номенклатура;
    	|Функция Сч = Счётчик();
    	|";//}}ЗАПРОС
    	Если ЗапросНоменклатура.Выполнить(ТекстЗапроса) = 0 Тогда
    		Возврат;
    	КонецЕсли;
    	Кол = 0;
    	Размер = ЗапросНоменклатура.Сч;
    	Пока ЗапросНоменклатура.Группировка(1) = 1 Цикл
    		Номенклатура = ЗапросНоменклатура.Номенклатура;
    		НоменклатураТМЦ = ЗапросНоменклатура.НоменклатураТМЦ; 
    		НоменклатураЦена = ЗапросНоменклатура.НоменклатураЦена;
    		Если Номенклатура.ЭтоГруппа() = 0 тогда
    			Кол = Кол+1;
    			глПрогрессор("Выгружаю Остатки",Размер,Кол);
    			Ид = СокрЛП(Номенклатура.АйДи);
    			Остаток = Регистр.Остатки.СводныйОстаток(0,НоменклатураТМЦ,Константа.БазСклад,,"Кво");
    			Запрос = "UPDATE `oc_product` SET `quantity` = "+Остаток+", `price`="+НоменклатураЦена+" WHERE `product_id` = "+Ид; 
    			Соединение.Execute(Запрос);
    		КонецЕсли;
    	КонецЦикла;
    КонецПроцедуры

     

    При данном подходе, запись производится непосредственно в бд. Сам магазин модифицировать необходимости нет.

  14. 23 часа назад, kulinenko сказал:

    пленка под разные модели ?

     

    ответ на плодить или не плодить всегда есть в семантике : частота есть - плодить

    Вообще стандартная, в базе данный плоттера более 10k моделей устройств, на которые он ее режет. Сама плёнка имеет три разновидности. Думал что просто создать три варианта, и показывать во всех связанных по тематике категориях, привязав ко всем моделям смартфонов, в значениях фильтрах товара. Далее, для каждого производителя устройств, создать посадочную страницу, с поисковыми ключами наиболее актуальных моделей.

  15. @egor23 Спасибо за замечания по корзине. Доработал. 

    Добавил возможность редактировать заказ в корзине. 

    Провел различные оптимизации по скорости работы сайта. Товаров примерно 17k.

    Спойлер

    pagespeeds.thumb.jpg.54f322727ac7868cb244b5b0c35ad2c8.jpg

     

  16. Добрый день. Сайт с мобильными аксессуарами. Есть универсальная позиция товара (гидрогелиевая пленка). Не могу решить, как правильно поступить. Плодить кучу практически одинаковых позиций или создать одну, связав с нужными значениями фильтра? OCFilter. 

  17. 16 часов назад, searchingman сказал:

    Catalog ничего не знает про модели из Admin.

    Как вариант, перенести нужную модель в пространство Catalog, или сделать helper (библиотеку) и подключать ее.

    Спасибо. 

    Перенес в каталог, но не могу обратиться к процедуре. Файл copyfilter.php лежит в каталоге catalog/controller/api/

    Содержимое:

    Спойлер
    
    <?php
    class ControllerApiCopyFilter extends Controller {
    
    	public function copy() {
        
      $json = array();
     
       if (!isset($this->session->data['api_id'])) {
          $json['error'] = $this->language->get('error_permission');
     	} else {
        	
        	//$this->load->language('extension/module/ocfilter');
         
        	if ($this->request->server['REQUEST_METHOD'] == 'POST') {
          		
              $this->load->model('extension/module');
    
          		$this->extension_module_filtercopy->Write($this->request->post);
          		
          		$json['success'] = "success";//$this->language->get('text_complete');
        	}
        }
    
    		$this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
      }
    } 

     

    Файл filtercopy.php лежит catalog/model/extension/module/

    код:

    <?php
    class ModelExtensionModuleFiltercopy extends Model {
      public function Write($data = array()){
        $this->log->write(print_r($data, true));
      }
    }

    При обращении к нему получаю: Fatal error:  Call to a member function Write() on null in /var/www/korney01/data/www/test.caseroom.in.ua/catalog/controller/api/copyfilter.php on line 18

    Что не так?  

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

Important Information

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