Задать вопрос
  • Как вывести не id элемента, а слово, которое к нему привязано?

    @alexalexes
    После этой строчки:
    $countryN->execute([':id' => $countries_id]);
    ... вам нужно применить один из методов:
    $rows = $countryN->fetchAll();
    var_dump($rows);

    или
    $row = $countryN->fetch();
    var_dump($row);

    Почитать тут и тут.
    Вкратце, работа с базой идет по таким этапам:
    1) Подключение к БД (хост, логин пароль и тд)
    1.1) Обработка ошибок подключения
    2) Передача параметров кодировки, форматов даты/время, локали и тд
    3) Подготовка запроса (prepare функция)
    3.1) Обработка синтаксических ошибок текста запроса.
    4) Подготовка входных и выходных параметров запроса (bind функция)
    4.1) Обработка ошибок параметров (результат возврата значения bind функции).
    5) Выполнение (execute функция).
    5.1) Обработка ошибок выполнения (обычно, смотрят состояние возврата значения execute функции).
    6) Выборка результата (фетчинг, используем fetch-функции).
    *) https://www.php.net/manual/ru/pdo.errorinfo.php получение состояния ошибки на любом этапе.
    Ответ написан
    Комментировать
  • В чем может быть ошибка Select2?

    @alexalexes
    К переменной data применяют метод работы с массивом slice(), но в этот момент data не является массивом (он же object в понимании JS).
    Такие ошибки возникают, когда перед обработкой массива забывают прописать исключительные состояния, когда объект data может быть сформирован не в виде пустого массива, а, например, может содержать в себе сведения об ошибке, переданные из слоя абстракции, который в обычной ситуации генерирует data как массив.
    Ответ написан
    Комментировать
  • Как сделать рандом с процентами?

    @alexalexes
    Возьмите интервал генерации случайных чисел (от 0 до 99) и раскидайте сгенерированные числа по эквивалентным интервалам (0...69, 70...89, 90...99) - если число попало в опред. интервал, значит ширина интервала будет вероятностью попадания в него этого числа.
    $rnd_number = rand(0, 99);
    switch(true)
    {
      case $rnd_number < 70: 
       echo "One";
        break;
     case $rnd_number >= 70 && $rnd_number < 90:
        echo "Two";
        break;
     case $rnd_number  >= 90:
        echo "Three";
        break;
    }

    Чтобы в этом убедиться, повторите эксперимент, например, 1000 раз:
    $counter = array('One'=> 0, 'Two' => 0, 'Three' => 0);
    for($i = 0; $i < 1000; $i++)
    {
      $rnd_number = rand(0, 99);
      switch(true)
      {
        case $rnd_number < 70: 
         $counter["One"]++;
          break;
       case $rnd_number >= 70 && $rnd_number < 90:
          $counter["Two"]++;
          break;
       case $rnd_number  >= 90:
          $counter["Three"]++;
          break;
      }
    }
    var_dump($counter);

    Если хотите эксплуатировать именно функцию array_rand(), то ей нужно предоставить такой массив:
    $block_array = array('One','One','One','One','One','One','One','Two','Two','Three');
    $counter = array('One'=> 0, 'Two' => 0, 'Three' => 0);
    for($i = 0; $i < 1000; $i++)
    {
     $gen_value = array_rand($block_array);
     $counter[$gen_value]++;  
    }
    var_dump($counter);

    Вес каждого элемента увеличивается путем его тиражирования пропорционально вероятности его выпадания.
    Решение не будет отличаться от классики.
    Ответ написан
    Комментировать
  • Как составить SQL запрос?

    @alexalexes
    Зачем вам таблица t1?
    У продукта могут быть несколько родителей?
    Если нет, то t1 избыточна, вам будет достаточно в каждой записи продукта указывать, кто у нее parent.
    Если нужно найти самый дешевый продукт в пределах одного родителя, то делается это так:
    select *
    from (select parent, product,
                        rank() over (partition by parent order by price) price_rnk
               from t2
             )  a
    where price_rnk = 1

    Клауза over partition поддерживается mySQL не ниже 8 версии. Самым распространенным версиям (5 или 6, не помню), нужно делать велосипед из пользовательских переменных @.
    Ответ написан
    1 комментарий
  • Не приходит товар на почту после оплаты?

    @alexalexes
    Подключите в отдельном php файле модуль include "includes/setmailer.php";
    и попробуйте себе что-нибудь отправить, отдельно от бизнес-логики оплаты.
    PS: Возможно, придется исправить конфиг этого модуля по части smtp протокола.
    PPS: У хостинга, от куда вы отправляете письмо, могут быть особенности с работой smtp - уточняйте.
    Ответ написан
    4 комментария
  • Как получить вложенные изображения при отправке формы?

    @alexalexes
    Ваша форма должна как-то сообщить серверу, что пользователь удалил файлы.
    Например, в скрытых input полях (у которых type="hidden") держать перечень метаданных (id или имя файла) удаленных файлов, которые были загружены на сервер ранее. При отправке формы, сравнивать список удаленных файлов и имеющихся файлов.
    Если форма не отправляется целиком в привычном понимании, то при помощи аякс-запросов при клике на удалить сообщать серверу, что именно удалили.
    Ответ написан
  • Почему js переменная выводится как объект?

    @alexalexes
    Переменная itemImg у вас как объект DOMElement.
    Его нельзя просто так вставить в строковое представление HTML.
    Чтобы получить itemImg как HTML строку, нужно проделать такой кульбит с использованием контейнера:
    var wrap = document.createElement('div'); //побочный контейнер для извлечения innerHTML
    wrap.appendChild(itemImg.cloneNode(true)); // клонируем внутрь контейнера интересуемый элемент
    var itemImgAsHTML = wrap.innerHTML; // извлекаем содержимое контейнера как HTML строку, то что вам и нужно.

    Потом это примените тут:
    var itemResult = "<div class='order-item'><div class='order-item__data-left'><div class='order-item__data-left__img'>"+itemImgAsHTML+"</div><div class='order-item__data-left__item-data'>${itemName}${itemVendorCode}</div></div><div class='order-item__data-right'><div class='order-item__data-right__delete-item'><button class='delete-item'>Удалить</button></div><div class='order-item__data-right__item-price'><h3>Цена: ${itemPrice}р</h3></div></div>";// Записываю нужную мне конструкцию для вставки в корзину

    PS: Можно предельно сократить преобразование:
    var itemResult = "<div class='order-item'><div class='order-item__data-left'><div class='order-item__data-left__img'>"+document.createElement('div').appendChild(itemImg.cloneNode(true)).innerHTML+"</div><div class='order-item__data-left__item-data'>${itemName}${itemVendorCode}</div></div><div class='order-item__data-right'><div class='order-item__data-right__delete-item'><button class='delete-item'>Удалить</button></div><div class='order-item__data-right__item-price'><h3>Цена: ${itemPrice}р</h3></div></div>";// Записываю нужную мне конструкцию для вставки в корзину
    Ответ написан
  • Почему в PHP zlib не работает во врапперах?

    @alexalexes
    Попробуйте одинарные кавычки вместо двойных.
    'php://filter/read=convert.base64-decode|zlib.inflate/resource='.$sourceFile

    PS:
    Нашел вот такой комментарий на Хакере.
    https://xakep.ru/2012/11/22/php-filter-wrapper-attacks/
    При всех выгодах данный метод уничтожения стопперов не может быть универсальным. В 2009 году было замечено, что функция base64_decode некорректно обрабатывает строки, содержащие в середине знаки равенства [#47174]. Этот баг был довольно оперативно исправлен для функции base64_decode, но для фильтра convert.base64-decode никаких исправлений сделано не было. Поэтому, если при «выдавливании» на каком-то шаге получаются данные, содержащие знак равенства, дальнейшее применение фильтра convert.base64-decode уничтожит преобразуемую строку.

    $s = 'php://filter/read=convert.base64-decode/resource=data:,dGVzdA==CRAP'; 
    var_dump(file_get_contents($s)); // print: string(0) ""

    Ответ написан
  • Как занести сразу несколько значении в таблицу?

    @alexalexes
    Самый топорный способ подготовки файла с данными.
    1. Открываете файл в Notepad++.
    2. Ctrl+H (Замена).
    3. Режим поиска ставите "Регулярные выражения".
    4. Найти:
    ^
    5. Заменить (название таблицы подставляете свое):
    insert into table\(name\) values \('
    6. Нажать "Заменить все".
    7. Найти:
    \r
    8. Заменить:
    '\);
    9. Нажать "Заменить все".
    В итоге получаете 500 строк инсертов. Выполняете их одной транзакцией любым доступным способом.
    Ответ написан
    Комментировать
  • Как восстановить загрузчик виндовс?

    @alexalexes
    Если настольный компьютер, то скорее всего вход в биос будет по клавише DEL.
    Если ноутбук, то сочетание клавиш, принятое у этого производителя в качестве входа в биос (может быть DEL или F2, или Esc или любая другая нестандартная комбинация клавиш).
    Если у вас компьютер куплен не ранее пару лет назад, то вам предстоит повоевать с загрузчиком UEFI, чтобы адекватно начал грузиться носитель, с которого будете устанавливать ОС.
    Ответ написан
    Комментировать
  • Как найти значение которое генерируется в js?

    @alexalexes
    Если значение переменной v44 будет иметь предсказуемую позицию на странице (или в куках, или в глобальном объекте JS - window) после выполнения всех операций ее подготовки и загрузки, то вполне возможно получить нужный результат, если воспользоваться средой Selenium. Она позволяет создать окружение для получения страницы аналогично полноценному браузеру и позволяет манипулировать компонентами окружения в том числе для извлечения данных.
    Ответ написан
  • Нужно ли указывать заголовок Content-Type: form/multipart прии отправке формы?

    @alexalexes
    https://ru.wikipedia.org/wiki/Multipart/form-data
    Есть работа с отправкой файлов?
    - Есть. нужен заголовок.
    - Нет, тогда не нужен заголовок.
    Ответ написан
    Комментировать
  • Можно ли сохранить последовательность вывода полей?

    @alexalexes
    Все таки сделайте динамически формируемым данные об интервалах, то есть inters можно представить в виде таблицы или генерировать на основе prepod.
    Для "нет данных" можно определить интервал [null, null]:
    select case
             when a.begin is null and a.end is null then 'нет данных'
             when a.begin is not null and a.end is not null then concat(a.end, '-', a.begin)
             when a.begin is null and a.end is not null then concat('ранее ', a.end + 1)
             when a.begin is not null and a.end is null then concat('от ', a.begin)
           end interval_str,
           cnt
    from
    (
    select inters.begin, inters.end, count(prepod.name) cnt
    from
    (
      select null begin, 1969 end union all
      select 1970 begin, 1979 end union all
      select 1980 begin, 1989 end union all
      select 1990 begin, 1999 end union all
      select 2000 begin, null end union all
      select null begin, null end -- запись для тех, у кого нет данных др.
    ) inters -- таблица с интервалами
    left join 
    (
      select 'a' name, STR_TO_DATE('2013-02-11', '%Y-%m-%d') date_r union all
      select 'aa' name, STR_TO_DATE('2010-09-01', '%Y-%m-%d') date_r union all
      select 'b' name, STR_TO_DATE('1968-02-11', '%Y-%m-%d') date_r union all
      select 'bb' name, STR_TO_DATE('1969-01-21', '%Y-%m-%d') date_r union all
      select 'c' name, STR_TO_DATE('1980-02-11', '%Y-%m-%d') date_r union all
      select 'd' name, STR_TO_DATE('1989-02-11', '%Y-%m-%d') date_r union all
      select 'z' name,  null date_r -- препод, у которого нет данных др.
    ) prepod on inters.begin <= year(prepod.date_r) and inters.end >= year(prepod.date_r)
             or inters.begin is null and inters.end >= year(prepod.date_r)
             or inters.begin <= year(prepod.date_r) and inters.end is null
             or prepod.date_r is null and inters.begin is null and inters.end is null
    group by inters.begin, inters.end
    order by inters.begin desc, inters.end desc
    ) a
    Ответ написан
    4 комментария
  • Можно ли получить индекс элемента масива, если значение этого элемента повторяющееся?

    @alexalexes
    Ну так работайте с тем объектом, который кликнули.
    https://developer.mozilla.org/ru/docs/Web/API/Even...
    Ответ написан
    Комментировать
  • Как запретить перенос строки в textarea?

    @alexalexes
    Добавьте на textarea два обработчика события keydown, как на запрет перевода строки, так и на отправку контента.
    $(document).keydown(function (e) {
            if (e.which == 13) {
                document.getElementById("commentAdd").click();
                document.getElementById("messageArea").value = "";
                        }
        });
    
    $('textarea').on('keydown', function( el ) {
            if( el.keyCode === 13 ) {
                el.preventDefault();
                whenEnterPressed();
            }
        });
    Ответ написан
    1 комментарий
  • Как поменять мелодию Скайп?

    @alexalexes
    Если приложение купило MS или Mail group (в случае с ICQ), то будьте готовы к выходу урезанной версии приложения.
    https://answers.microsoft.com/ru-ru/skype/forum/al...
    Ответ написан
  • Переход сайта с http на https. Почему не работает getimagesize() по пути //site.ru?

    @alexalexes
    На стороне сервера нужно выявить места, где идет обращение к файлам сервера, где пути к файлам это не url в представлении клиента (браузера), а путь внутри файловой системы сервера, и переписать соответствие url и filepath.
    В вашем случае путь в файловой системе может выглядеть так:
    htdocs/TmpGif/tr_87754306592959_133380.gif
    Ответ написан
  • Как вывести данные в loadTpl?

    @alexalexes
    Скорее всего вызов шаблона при переборе строк будет такой:
    while ($news = $NewsQuery->fetch())
    {
       $lastNewsList .= loadTpl("/last_news/news.html", 
    [
      "created_at" => $news['created_at'],
      "title" => $news['title'],
      "content" => $news['content']
    ]);
    }

    ... или даже еще проще:
    while ($news = $NewsQuery->fetch())
    {
       $lastNewsList .= loadTpl("/last_news/news.html",  $news);
    }

    Как поведет себя шаблон в этой строчке -
    $pageData['lastNews'] = loadTpl("/last_news/parent.html", $data);

    Без кода parent.html - не ясно.
    Как обрабатывается $pageData при наличии ключа 'lastNews', тоже нужно поинтересоваться, а надо ли намерено где-то еще указывать 'lastNews', чтобы отрисовать этот контент.
    Ответ написан
  • Как можно автоматически поднимать объявление на сайтах?

    @alexalexes
    а) Если нажатие кнопки не сопровождено вводом каптчи или какой-то сложной функции проверки того, что это делал человек;
    б) плюс если авторизация в сервисе действует неограниченное время;
    в) плюс страница формы поднятия объявления находится на том же домене, что и сайт объявлений;
    г) и ее появление не отягощено работой сложной функции
    д) плюс кнопку поднятия можно выцепить css-селектором с фиксированными параметрами.
    .... то можно попробовать сделать JS вставку в консоль на страницу сервиса, в виде такой функции-костыля, которая будет запускаться раз в 12 часов.
    Вкладку в браузере не закрываем никогда, чтобы ожидание выполнения функции не прекращалось; комп не выключаем.
    function use_my_iframe()
          {
            var iframe = document.createElement('iframe'); // создаем фрейм
            iframe.onload = function() // добавляем обработчик по завершении загрузки содержимого фрейма
            {
              setTimeout(function()
              {
                var iframe_content = iframe.contentWindow.document; // получаем доступ к контенту фрейма
                var button = iframe_content.querySelector("input[type='button']"); // ищем интересуемую кнопку в контенте фрейма по селектору
                button.click(); // нажимает на кнопку
                setTimeout(function()
                {
                  document.body.removeChild(iframe);
                }, 30000); // удаление фрейма через некоторое время после активации кнопки
              }, 3000); // ждем некоторое время после загрузки фрейма (на случай, если интересуема кнопка не сразу появляется в контенте)
            };
            iframe.setAttribute('src', 'http://localhost/index2.html'); // добавляем адрес страницы, где находится интересуемая кнопка
            document.body.appendChild(iframe);
          }
          use_my_iframe(); //запускаем сейчас
          setInterval(use_my_iframe, 12 * 3600 * 1000 + 30000); // Запуск функции раз в 12 часов (+30 сек, чтобы сервис гарантировано посчитал истечение срока)
    Ответ написан
  • Как заставить WordPress использовать JSON_UNESCAPED_UNICODE?

    @alexalexes
    Это параметр для подключения к базе данных, в какой кодировке писать/читать из/в нее. К обмену сервера и клиента он не относится.
    define('DB_CHARSET', 'utf8');
    Попробуйте определить флаг JSON_UNESCAPED_UNICODE как значение по умолчанию в описании функции (предположительно, файл wp-includes/functions.php).
    Если при формировании интересуемого JSON ответа со стороны wp не используется этот параметр, то сработает то, что по умолчанию.
    function wp_json_encode( $data, $options = JSON_UNESCAPED_UNICODE, $depth = 512 ) 
    {
    ...

    PS: С WP не работал, пробуйте на свой риск.
    Ответ написан
    1 комментарий