Задать вопрос
  • Как написать SQL запрос для данного случая?

    @alexalexes
    Сначала обновите записи в таблице checkanaliz:
    update  checkanaliz set id_napravlenie = 1 where id_napravlenie = 2

    Потом удалите из таблицы napravlenie записи:
    delete from napravlenie where id = 2
    Это же элементарные действия, которые вам доступны в SQL.
    Ответ написан
  • Валидация формы, как сохранить загруженные файлы?

    @alexalexes
    Делать отдельный файловый менеджер для загрузки не подходит - можно загрузить лишние файлы, появляются трудности в редактировании/обновлении записей. AJAX валидация формы решит проблему частично - если один из файлов не пройдет, то придется загружать все файлы заново.

    У вас как раз накопился технический долг в виде реализации полноценного файлового менеджера.
    Который должен сразу после выбора пользователем файлов отправлять каждый файл по ajax на сервер. Сервер в это время складывает файлы во временный каталог пользователя, отдавая в качестве ajax-ответа его временное хэш-имя. Во время отправки формы вы уже не отправляете содержимое input[type=file], а отправляете список хэш-имен удачно загруженных файлов, а на стороне сервера если все поля валидны и файлы валидны (их можно допроверить), то просто копируете файлы из временного каталога в постоянный (или в базу, или в облако, или другой каталог облака, смотря где основное хранилище). Если какая-та проверка неудачная, то вы легко можете вернуть обратно клиенту его заполненные поля, и список загруженных файлов, указав, в каком файле какая ошибка. На стороне клиента можно восстановить как поля, так и список файлов в менеджере.
    Если не хотите в полной мере решать технический долг, то можно поступить более простым путем.
    После выбора файлов пользователем, вычитываете их содержимое объектом FileReader и складываете в кодировке base64 в скрытые поля input[type=hidden] (при окончании зачищаете input[type=file], чтобы форма была нагружена только бинарными данными из скрытых полей), это позволит вам отправлять список файлов вместе с отправкой формы и восстанавливать input[type=hidden] поля при возникновении ошибки, при возврате данных формы обратно клиенту для корректировки.
    Такой подход увеличит время отправки и получения формы, не освободит от того, что вам нужно прорисовывать состояние списка файлов на форме, освободит только от использования ajax.
    Ответ написан
    Комментировать
  • Почему возвращается ошибка Fatal error: Function name must be a string in?

    @alexalexes
    Либо у вас сервер PHP ниже версии 5.3.0 (не позволяет использовать магический метод __invoke).
    Либо попробуйте $this добавить в замыкание (где use).
    return $current($context, function ($context) use ($this, $next) {
                return $this($context, $next);
    Ответ написан
  • Ошибка при направлении на другую страницу?

    @alexalexes
    Если хотите работать с заголовками, то размещать голый html с включениями php кода нельзя, будет засоряться лог предупреждениями.
    При исполнении php файла в начале он должен молчать как рыба, если логика работы предусматривает выбор - работать сначала с заголовками, а потом выводить контент, или просто выводить контент (через print, echo и т.д.).
    То есть, заголовки должны срабатывать первыми, любое echo между выполнением header() будет нарушать порядок.
    Ответ написан
    Комментировать
  • Как вывести не 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...
    Ответ написан