• Как сделать PDO + IN?

    Я для данной цели написал класс, который работает следующим образом
    $stmt = false;//Требуется объявить так как передаётся в метод execute по ссылке
    $params = array("ids"=>array(1,4,7));
    $sql = "SELECT * FROM `users` WHERE `id` IN (:ids)";
    nikolaevevgePDOIn::execute($pdo,$sql,$params,$stmt);

    Сам код класса выложен тут: https://blog.ivru.net/?id=270
    P.S. в моём случаи для формирования отчёта требовалось выполнить сразу ряд запросов в которых предполагалась передача массива значений в конструкцию IN(и даже нескольких массивов в несколько конструкций IN), поэтому применение данного класса вполне оправдано.
    Ответ написан
    Комментировать
  • Что с ipgeobase.ru?

    IPGeoBase в очередной раз закончился blog.ivru.net/?id=82
    Ответ написан
  • Как используя \Bitrix\Catalog\ProductTable::getList получить список товаров по определённому инфоблоку?

    nikolaevevge
    @nikolaevevge Автор вопроса
    <?php
    require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
    
    $result = \Bitrix\Catalog\ProductTable::getList(array(
        'filter' => array("=IBLOCK_ELEMENT.IBLOCK_ID"=>46),
    ));
    
    if($product=$result->fetch()) {
      var_dump($product);
    }
    Ответ написан
    Комментировать
  • В корзине bitrix использую самописный ajax api на CSaleBasket::Update через который не всегда обновляется колличество товаров. Кеш?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Заменил код функции следующим:
    function productUpdateInBasket($prodId=0,$QUANTITY=0) {
        if ($prodId == 0) {return false;}
          $basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(CSaleBasket::GetBasketUserID()), \Bitrix\Main\Context::getCurrent()->getSite());
          $basket->refresh();
    
          $dbRes = \Bitrix\Sale\Basket::getList(array(
            "select"=>["PRODUCT_ID","NAME","QUANTITY","ID"],
            "filter"=>array(
            "=FUSER_ID"=>\Bitrix\Sale\Fuser::getId(),
            "=ORDER_ID" => null,
            "=LID"=>\Bitrix\Main\Context::getCurrent()->getSite(),
            "=CAN_BUY"=>"Y",
            "=PRODUCT_ID"=>$prodId
          )
        ));
    
        $itemId = false;
    
        while ($item = $dbRes->fetch()) {
          if (isset($item["ID"]) and $item["ID"] and isset($item["PRODUCT_ID"]) and ($item["PRODUCT_ID"] == $prodId)) {
            $itemId = $item["ID"];
          }
        }
    
        if ($itemId) {
          $itemProd = $basket->getItemById($itemId);
          if ($QUANTITY==0) {
            $itemProd->delete();
          } else {
            $itemProd->setField("QUANTITY",$QUANTITY);
          }
          $basket->save();
          $basket->refresh();
          return true;
       }
      return false;
    }

    Так ещё инфа с примерами кода по ситуации тут blog.ivru.net/?id=51
    Ответ написан
    Комментировать
  • Как изменить масштаб отображения страниц в FireFox?

    Чтобы вернуть масштаб вкладки Firefox в исходное состояние кликните левой кнопкой мыши по информации о процентном отношении масштаба страницы по отношению к стандартному, которая находится в конце строки ввода URL при условии, что размер страницы отличается от стандартного. Масштаб станет стандартным а информация пропадёт. На следующем скрине показано где именно находится эта информация.
    switch-page-zoom-to-standard-in-firefox.jpg
    Решение взял отсюда: blog.ivru.net/?id=225
    Ответ написан
    Комментировать
  • Можно ли установить Virtual Box на Windows Vista?

    Привет, помню сталкивался с такой ситуацией.
    То что Вы до пятой версии спустились вниз - этого просто мало, должна быть какая то аж из 4-х.
    Сейчас посмотрел на своём облачном диске где у меня всякие драйвера и программы для тоже не нового ноута с лицензионной вистой, версия VirtualBox-4.1.30-91550-Win у меня работала. Тут же отпишусь, что я не знаю какая максимально поддерживаемая для Vista, версия про которую я пишу просто та которой пользовался я.
    Я сейчас проверил она ищется в Интернете на скачивание, если не найдёте отпишитесь - выложу куда нибудь.

    По поводу ошибок в работе о которых Вам тут ответили - лично я не сталкивался с проблемами. Я машиной пользовался у меня в ней были Windows Xp и CentOs 6 (7-ой CentOs помоему я в неё не пробовал ставить, потому что слез уже с висты). CentOs 6 могу сказать работал стабильно, ну а касемо XP бывало она зависала, вот только я не буду утверждать что это вина виртуальной машины, всё таки работа на одних из первых двухядерных процессорах + 2 гб памяти не сказать что это большие ресурсы, из которых вот машину выделялось где то 512. Так что смело ставьте, проблем быть не должно, по крайней мере каких то глобальных которые помешают сильно жить.
    Ответ написан
    1 комментарий
  • Можно ли отправить на UDP дейтаграммы прямо через слушающий сокет?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Частично разобрался.
    Касаемо вопроса: можно ли через слушающий серверный сокет отправлять назад сообщение для клиента: да можно, доходит, клиент получает.
    Касаемо почему клиентский порт на клиентской программе отличается от клиентского порта в серверной программе - не понял почему, но у меня они отличаются. Причём всё доходит.
    Вот скринсшот ситуации:
    udp-server-and-client-echo-message.jpg
    А ситуация что у меня по sendto не отправлялось сообщение клиенту - нашёл ошибку в коде, оказалось я процедуру использовал по кнопке прямо из класса, а нужно было её вызывать у экземпляра объекта, таким образом получалось что серверный сокет в той процедуре был не инициализирован.

    Исходники клиентской и серверной программы на Delphi и прочие детали по ссылке blog.ivru.net/?id=199

    __________________________________________
    Редактирую ответ, поскольку нашёл причину почему порты отличались:
    __________________________________________
    Как оказалось в случаи клиентской программы я не использовал ntohs для перестановки старшего и младшего байты порта в переменной адреса, а в случаи серверной программы использовал ntohs. Вот и получились integer числа в одном случаи младший и старший байт шли в одном порядке а в другом в обратном порядке.
    Более детально ситуация описана тут https://ru.stackoverflow.com/questions/1137180/win...
    Ответ написан
    Комментировать
  • Как работает Вебвизор от Яндекса?

    Вопросов у Вас много, что то Вы ответили сами.
    Часть работает на JavaScript часть на серверном языке, поскольку JS шлёт данные о поведении клиента на сервер через WinSocket или Ajax. Там они сохраняются. Есть настройка у вебвизора она позволяет DOM дерево текущего состояния страницы на сервере сохранить, то есть посетитель берёт HTML и шлёт его на сервер по JS а на сервере уже сохраняется. Есть другой вариант когда робот приходит и берёт HTML текущего состояния страницы, то есть тогда по JS он от пользователя не передаётся, но тут может быть разница в информации на странице, поскольку пользователь мог быть авторизован, а робот яндекса если придёт авторизован не будет. Тут я описал почему в iframe отображается та версия страницы которая была при посещении(но повторюсь вроде как есть какая то настройка, можно отключить этот момент и будет отображается новая версия). Ещё моё предположение что iframe вообще нужен чтобы имитировать размер окна пользователя который заходил.
    Касаемо курсора JS не торгает Ваш курсор, а использует рисование чтобы показать как во времени двигался курсор. А нарисовать можно хоть круг, хоть квадрат, хоть указатель аналогичный курсору - так что ответ Вам, вебвизор при воспроизведении Ваш курсор не трогает.
    Считаю что зря Вы отметили вопрос как сложный. Если примерно ответить как работает или предположить как то достаточно понятно по-моему. Я не говорю о взять и сделать аналог. В любом случаи это бы уже была задача не для сайта вопросов.
    В комментариях пишите если что то ещё по вопросу нужно пояснить.
    Ответ написан
    Комментировать
  • Почему gmail smtp не принимает логин и пароль?

    Предположительно когда Вы переключаете настройку небезопасных приложений, изменения вступают в силу не сразу. Пробуйте отправку через SMTP к примеру через час после того как поменяете настройку, сталкивался с подобной проблемой, отписался по проблеме и ситуации по ссылке, посмотрите PHP. PhpMailer как отправить почту по SMTP через gmail.com от Google?Почему ошибка авторизации?

    P.S. я вижу что Вы вопрос задавали более 3-х лет назад, просто наткнулся в поиске на ваш вопрос, а у меня подобная ситуация. Может надо кому.
    Ответ написан
    Комментировать
  • Как сделать генератор случайных строк JavaScript?

    var rndStroka = getAlphaNumericRandom(15);//Генерирует случайную последовательность из букв и цифр длиной 15 символов, причём первый символ строчная или заглавная буква, но не цифра.

    Код функции доступен по ссылке: blog.ivru.net/?id=196
    Ответ написан
    Комментировать
  • PHP. PhpMailer как отправить почту по SMTP через gmail.com от Google?Почему ошибка авторизации?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Сделал следующее, поьзователь wisgest предложил переключить флажок небезопасных приложений по ссылке https://myaccount.google.com/lesssecureapps, он у меня был выключен переключил сразу не помогло.(потом я его кстати назад переставил так что и при выключенном видимо отправляется).

    Затем я из кода убрал строку(закомментировал): $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    вместо неё добавил такую $mail->SMTPSecure = 'tls';

    Вот окончательный код с использованием которого у меня отправилось:

    <?php
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\SMTP;
    use PHPMailer\PHPMailer\Exception;
    
    require 'vendor/autoload.php';
    $mail = new PHPMailer(true);
    
    try {
      $mail->SMTPDebug = SMTP::DEBUG_SERVER;
      $mail->isSMTP();
      $mail->Host = 'smtp.gmail.com';
      $mail->SMTPAuth   = true;
      $mail->Username   = 'gmaillogin@gmail.com';
      $mail->Password   = 'password';
      $mail->Port = 587;
      $mail->setFrom("gmaillogin@gmail.com","Имя от кого отправлять");
      $mail->addAddress("komuotpravlyaem@yandex.ru","");//Кому отправляем
    //$mail->addReplyTo("kudaotvetit@yandex.ru","Имя кому писать при ответе");
      $mail->SMTPSecure = 'tls';
      $mail->isHTML(true);//HTML формат
      $mail->Subject = "Тема сообщения";
      $mail->Body    = "Содержание сообщения";
      $mail->AltBody = "Альтернативное содержание сообщения";
    
      $mail->send();
      echo "Сообщение отправлено";
    } catch (Exception $e) {
      echo "Ошибка отправки: {$mail->ErrorInfo}";
    }


    Уже когда всё заработало увидел что оказывается google вот такое уведомление присылал:
    5ea5fd45bf5da648691348.jpeg
    Так что возможно переключатель небезопасных приложений имел значение, не смотря на то что я его сейчас выключил и без него тоже отправляется. Так же есть предположение что после переключения настройки небезопасных приложений, это изменение применяется не сразу, поэтому есть смысл повторно попробовать к примеру через час после его переключения.
    Ответ написан
    Комментировать
  • Как отформатировать текст письма, отправляемого на почту?

    Вот как раз вопрос задал по SMTP тут есть пример кода под Ваш вопрос - PHP. PhpMailer как отправить почту по SMTP через gmail.com от Google?Почему ошибка авторизации?
    Только в теле сообщения передавайте нужный Ваш HTML типа Благодарим вас за выбор нашей компании!Вам скоро перезвонят для уточнения деталей. и так далее

    Это если у Вас достаточно простое текстовое сообщение.
    Если же всё красиво делать то для разметки в письмах используется табличная верстка. Информацию в поисковиках ищите как верстать письма.
    Ответ написан
    Комментировать
  • Bitrix при использовании включаемой области (IncludeComponent("bitrix:main.include") параметры по умолчанию) сервер выдаёт ошиюбку 500. Почему?

    nikolaevevge
    @nikolaevevge Автор вопроса
    В настоящий момент вопрос решен, только как именно я не совсем понял.

    Сделал следующее. Удалил старый файл(index_inc.php) который содержал информацию из встраиваемой области(хотя в нем был в общем то обычный html), далее создал из "Изменить страницу" в нужном месте включаемую область. Через админку Bitrix записал в файл HTML с предыдущего сервера, захожу по URL - работает. Затем ещё вынес область в подключаемый файл области в отдельный файл через $APPLICATION->IncludeFile где она ранее и подключалась. Теперь работает. Вроде как по коду всё то же самое и осталось.

    Странная ситуация. Когда удалял старый файл встраиваемой области не обратил внимания какие у него были права, может в этом было дело.
    Ответ написан
    Комментировать
  • Как наложить текст на изображение с помощью PHP?

    Если Вам нужно вывести русский(кирилический) текст на изображении которое геренируется с помощью языка информацию можно найти по ссылке blog.ivru.net/?id=189
    Ответ написан
    Комментировать
  • Как парсить выдачу yandex?

    Если говорить про разбор HTML кода яндекса и определение позиций, то вот код скрипта на php - https://blog.ivru.net/?id=185
    Ответ написан
    Комментировать
  • Php работа с регистром русских символов в UTF-8?

    Как на счёт использования следующего класса: blog.ivru.net/?id=187

    Примеры использования:
    mystrto::lower("АБВГABCD"); результат: абвгabcd
    mystrto::upper("абвгabcd"); результат: АБВГABCD.
    Ответ написан
    Комментировать
  • Кто сталкивался с Wantresult, как он работает?

    На самом деле вполне возможно без кликджекинга.
    А как тогда? Варианты возможных технологий описаны тут - blog.ivru.net/?id=183
    Ответ написан
    Комментировать
  • Как в bitrix установить свойство типа список(enum) у инфоблока методами api?

    nikolaevevge
    @nikolaevevge Автор вопроса
    В результате написал функцию которая принимает 3 параметра: 1) значение которое должно быть у списочного свойства, 2) Ид инфоблока, 3) код свойства - функция возвращает Ид существующего свойства, а если не найдёт - создает запись в свойстве и возвращает её Ид. При ошибке возвращается false

    Код функции и примеры использования тут blog.ivru.net/?id=175

    Непосредственно по заданному вопросу, создание товаров или торговых предложений с привязкой свойства типа список(enum) осуществляется следующим образом:

    $el = new CIBlockElement;
    
    $arLoadProductArray = array(
      "IBLOCK_ID"=>2, // IBLOCK торговых предложений
      "NAME"=>"Имя торгового предложения",
      "ACTIVE"=>"Y",
      "PROPERTY_VALUES"=>array(
        "CML2_LINK"=>$PRODUCT_ID, // Свойство типа "Привязка к товарам (SKU)", связываем торг. предложение с товаром
        "CML2_ARTICLE"=>"Артикул торгового предложения",
        "SIZE"=>$sizePropId,
        "CLOTH"=>$clothPropId
      )
    );
    
    $product_offer_id = $el->Add($arLoadProductArray);


    В коде выше у меня свойства SIZE и CLOTH типа список(enum) в переменных $sizePropId и $clothPropId передаются идентификаторы необходимых значений свойств.

    Для получения идентификатора по значению, я привёл ссылку на соответствующую функцию.
    Ответ написан
    Комментировать
  • Не отображаются свойства товара(материал и размер оба свойства типа Enum) в заказах административной панели Bitirx. Как сделать чтобы отобразились?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Оказалось следующее:

    У меня в файле который принимал по ajax id товара и количество для добавления в корзину была самописная функция:

    function productAddToBasket($PRODUCT_ID=0,$QUANTITY=0) {
      return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array());
    }


    В случаи если не используется стандартный компонент для добавления в корзину галочка "Значение добавляется в корзину" бесполезна, то есть если Вы пишите свой вариант добавления в корзину на API то добавление свойств необходимо производить самостоятельно, и возможно это сделать и в функции Add2BasketByProductID(не смотря на то что она устаревшая), для этого передавать свойства требуется в третьем параметре.

    Моя ошибка была в том, что я не помещал свойства в ещё один массив, то есть 3-ий параметр должен выглядеть так: array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение")) ну или несколько вложенных массивов внутри внешнего через запятую.

    То есть в моём случаи я поправил строчку:

    return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array());

    на строчку:

    return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение")));

    То есть исправление потребовалось только в файле добавляющем товары в корзину. Файл же который из корзины формирует заказ я не трогал. В результате замены вышеуказанной строчки в админке получил следующее:

    5e21a7d7c8b43501761093.jpeg

    Методом о которым пишет Роман Грицук тоже возможно, например следующим кодом:

    $fields = array("PRODUCT_ID"=>$PRODUCT_ID,"QUANTITY"=>2,"PROPS"=>
       array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение"))
    );
    $r = \Bitrix\Catalog\Product\Basket::addProduct($fields);


    Зачем в массиве свойств передаётся CODE не совсем понятно, при этом экспериментальным путём установлено что этот код не обязан совпадать с кодом указанным в свойствах инфоблока.

    Возможно кому то потребуется метод для получения свойств инфоблока у которых отмечена галочка "Значение добавляется в корзину"(информацию по этому поводу нашёл тут https://dev.1c-bitrix.ru/support/forum/forum48/top... )

    $IBlockId = 2;//В данном случаи передаю Id инфоблока торговых предложений
    $ee = \Bitrix\Catalog\Product\PropertyCatalogFeature::getBasketPropertyCodes($IBlockId);
    var_dump($ee);//возвращает:array(2) { [0]=> string(2) "11" [1]=> string(2) "42" } 11 и 42 это Id свойств торговых предложений отмеченных галочкой "Значение добавляется в корзину"


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

    function productAddToBasket($PRODUCT_ID=0,$QUANTITY=0) {
        $TPIBlockId = 2;//Инфоблок торговых предложений(в данной задаче требуется только он, возможно в другой потребуется выбирать свойства из обоих инфоблоков)
        $propIds = \Bitrix\Catalog\Product\PropertyCatalogFeature::getBasketPropertyCodes($TPIBlockId);//Получаем Id свойств отмеченные галочкой "Значение добавляется в корзину"
    
        $dbProps = CIBlockElement::GetProperty($TPIBlockId,$PRODUCT_ID,array(),Array("ID"=>$propIds));
        $propsForBasketAr = array();
        while($oneProp = $dbProps->Fetch()) {
    //В следующей строчке условие которое выбирает значения только для ENUM свойств, если есть другие требуется дописать
          if (isset($oneProp["VALUE_ENUM"]) and $oneProp["VALUE_ENUM"] and isset($oneProp["NAME"]) and $oneProp["NAME"] and isset($oneProp["CODE"]) and $oneProp["CODE"]) {
            $propsForBasketAr[] = array("NAME"=>$oneProp["NAME"],"CODE"=>$oneProp["CODE"],"VALUE"=>$oneProp["VALUE_ENUM"]);
          }
        }
        return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,$propsForBasketAr);
    }


    Есть ещё одно решение, которое предложил PetrPo. Подробности находятся в комментариях под его ответом. Если сделать как он написал результат будет таким:

    5e21b0c570092546639769.jpeg
    Ответ написан
    Комментировать
  • Влияет ли 301 редирект на позиции сайта?

    Нафиг он не нужен, если Вас только не смущает что в яндексе и google может задваиваться индекс(в индексе отдельно считаются страницы без www и с ним, иногда поисковик в последствии оставляет только один вариант)

    Более детальная инфа по ссылке - blog.ivru.net/?id=133

    Сейчас на том же сайте тестирую повлияет ли как либо редирект с http на https (ранее сайт позволял набирать адрес как угодно, при этом в индексе обоих поисковиков был только https, причем я их о этом не просил, они сами переиндексировали всё на https как только появился сертификат, касается и яндекса и google)
    SSL сертификат платный на 2 года(Sectigo Limited).
    Ответ написан
    Комментировать