• Из-за чего может возникать ошибка?

    Exomode
    @Exomode
    Архитектор ПО
    Читаем сверху вниз трассировку предупреждений:

    Warning: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error: in /var/www/u0294446/public_html/development/inquiry_photo.php on line 22

    Это говорит нам о том, что проблема в библиотеке GD. Идём дальше:

    Warning: imagecreatefromjpeg(): '78.jpeg' is not a valid JPEG file in /var/www/u0294446/public_html/development/inquiry_photo.php on line 22

    Это говорит нам о том, что вместо валидного битмапа, упакованного в формате JPEG, нам в либу на вход поступила какая-то шляпа. Разбираемся дальше:

    Warning: imagecopy() expects parameter 2 to be resource, boolean given in /var/www/u0294446/public_html/development/inquiry_photo.php on line 34

    Эврика! А вот и корень наших бед, в скрипте inquiry_photo.php, в строчке 34, где идёт вызов метода imagecopy(), ему на вход во втором аргументе пришла булева переменная вместо ссылки на буфер изображения GD. Вот там и проверяйте в чем может быть дело. Смотрите откуда у вас приходят эти данные и почему там bool, возможно не хватает какой-то банальной проверки на формат, когда скрипт попытался пихнуть в jpeg битмап, упакованный как gif или png.
    Ответ написан
    Комментировать
  • Как сохранить класс активной ссылки после перезагрузки страницы?

    Exomode
    @Exomode
    Архитектор ПО
    Можно сохранить параметр в куку, можно привязаться к хешу урла, после перезагрузки он никуда не исчезнет и можно будет проверить наличие:
    var hash = window.location.hash;
    var selectedOption = null;
    
    if (hash && hash != '#') {
      var parts = hash.split('=');
    
      if (parts.length == 2 && parts[0] == "select_option") {
        selectedOption = parts[1];
      }
    }

    Дальше просто присвоить свойство selected селектору "select option[name='" + selectOption + "']" при загрузке страницы, а в onchange списка обновлять хэш. Не часто вижу чтобы подобное решение применялось, но иногда оно вписывается куда элегантнее и проще, чем даже те же куки, которые можно очистить и всё слетит, или вообще отключить. Хэши напоминают строку GET-запроса, только работают исключительно в рамках клиентсайда.

    Эти два варианта подойдут для сугубо клиентской привязки. Можно еще и с помощью сервера организовать, сразу отдавать на клиент разметку с выделенным элементом списка в зависимости от параметра запроса или куки, или сессии, как угодно.

    Вместо списков можно применить к любому элементу, достаточно лишь изменить селектор и вместо свойства selected использовать атрибут классов, к примеру. Всё от вашей фантазии зависит, решений здесь много.
    Ответ написан
    Комментировать
  • Почему не срабатывает Javascript?

    Exomode
    @Exomode
    Архитектор ПО
    Потому что в jQuery метод load() работает как обработчик загрузки лишь если вызван у $(window), для других элементов он пытается подгрузить содержимое аяксом. Читайте документацию.
    Ответ написан
    4 комментария
  • Не могу вывести переменную с датой (месяц). В чём проблема?

    Exomode
    @Exomode
    Архитектор ПО
    \DateTime::createFromFormat("d.m.Y в H:i", $dateStr);

    Псевдоним: date_create_from_format.

    И никаких махинаций с explode не надо.

    По той же ссылке выйдете на примеры, как потом обратно в строку преобразовать, как работать с интервалами и как добраться до составных частей даты (год, день, месяц, час и тд).
    Ответ написан
    Комментировать
  • Как создать генератор?

    Exomode
    @Exomode
    Архитектор ПО
    $lexems = [
      "text" => "TEXT",
    ];
    
    $data = [];
    
    foreach ($_REQUEST as $k => $v) {
      if (array_key_exists($k, $lexems)) {
        $data[$k] => htmlspecialchars(trim($v));
      }
    }
    
    $sourceText = file_get_contents("/path/to/template.txt");
    
    foreach ($data as $k => $v) {
      $sourceText = str_replace('{' . $lexems[$k] . '}', $v, $sourceText);
    }
    
    echo $sourceText;


    Как оно работает:
    1. На странице есть набор input с именами, соответствующими ключам ассоциативного массива $lexems;
    2. После отправки данных на наш скрипт-обработчик, мы сохраняем все полученные данные в массив с теми же ключами;
    3. Получаем исходный текст шаблона, где содержатся наши лексемы;
    4. Проходимся массивом по полученным данным, выбираем по тем же ключам лексемы и заменяем их на пришедший с клиента текст, после чего выводим результат на экран.

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

    Exomode
    @Exomode
    Архитектор ПО
    Можно так. Если нужно чтобы пространство, которое должен занимать блок ссылки, оставалось исходной высоты, то можно эту ссылку обрамить в тег и задать ему text-align: right, или же просто добавить ссылке float: right. но в таком случае нужно будет ввести после неё ещё один элемент, которому задать clear: both, чтобы отступы работали правильно.
    Ответ написан
    Комментировать
  • Как сделать инпуты ровно?

    Exomode
    @Exomode
    Архитектор ПО
    label {
      display: inline-block;
      vertical-align: middle;
      width: 45%;
      box-sizing: border-box;
    }
    
    input:not([type="radio"]) {
      display: block;
      width: 100%;
    }

    В HTML у вас чуть-чуть ошибочка, там не совсем правильно обрамили радио, нужно открывающий тег перенести ниже, за предыдущий label.
    Если нужно выровнять в одну горизонтальную линию еще и надписи к полям ввода, текст надписи тоже нужно обрамить тегом и сделать его вместе с input display: inline-block, а так же зафиксировать ширину, чтобы это всё не плавало.
    Ответ написан
    Комментировать
  • Как сделать отправку данных из формы на несколько эмеил?

    Exomode
    @Exomode
    Архитектор ПО
    Как вариант, сформировать массив почтовых адресов и циклом повторить вызов метода отправки письма, меняя при этом адресата. Универсальный способ, который подойдёт даже для mail(). С uniMail я не знаком, возможно там уже предусмотрена автоматизация отправки нескольким получателям, тогда будет проще. Если там такого нет - опять же, способ с циклом и сюда подойдёт.

    UPD: посмотрел я эту uniMail... печально там всё. Вы сами можете написать за час библиотеку получше. Алгоритм примерно следующий:

    Сервер:
    1. Делаете хранение адресатов (можно конфиг, можно БД, как вам лучше подойдёт);
    2. Валидируете входные параметры запроса, делаете фильтрацию переменных, экранируете спецсимволы;
    3. Формируете массив адресатов из хранимых данных;
    4. Пишете функцию формирования письма, она же будет его и отправлять;
    5. Проходитесь циклом по массиву адресатов, передаёте аргументы в функцию и вызываете её на каждой итерации.

    Клиент:
    Здесь надо просто собрать данные и послать их на серверный скрипт обработки, который я выше описал. Как организуете отправку (ajax, прямой post и тд) - так и будет работать, главное, как ниже отметил Александр, не храните важную информацию в hidden-полях, да и вообще на клиенте не храните никогда ничего подобного, начиная с DOM и заканчивая куками и GET-параметрами в адресной строке.
    Ответ написан
    Комментировать
  • Как с помощью php читать из файла txt только вторую строку?

    Exomode
    @Exomode
    Архитектор ПО
    $show_info = fopen('events/kp1/dungeon1.txt', 'r');
    fgets($show_info);
    echo fgets($show_info);
    fclose($show_info);

    можно ещё сделать как-то так:
    function readLine($pathToFile, $index = 0) {
      if (!file_exists($pathToFile)) {
        return null;
      }
    
      $stream = fopen($pathToFile, 'r');
      $line = null;
    
      for ($i = 0; $i <= $index; $i++) {
        if ($index > 0) {
          fgets($stream);
        }
    
        if ($i == $index) {
          $line = fgets($stream);
        }
      }
    
      fclose($stream);
      return $line;
    }
    
    echo readLine('events/kp1/dungeon1.txt', 1);    // Выведет вторую строку файла.

    Не будет держать в памяти весь файл, как в предложенных вариантах выше, а значит подойдёт и для массивных файлов.
    Ответ написан
    2 комментария
  • Простая система хуков на php?

    Exomode
    @Exomode
    Архитектор ПО
    class Hook {
      protected $callbacks;
    
      public function __construct($callbacks = []) {
        $this->callbacks = [];
    
        if (!isset($callbacks) || !is_array($callbacks) || sizeof($callbacks)) {
          return;
        }
    
        foreach ($callbacks as $k => $v) {
          if (!is_string($k) || !isset($v) || !is_callable($v)) {
            continue;
          }
    
          $this->callbacks[$k] = $v;
        }
      }
    
      public function add($key, $callback) {
        if (!isset($key) || !isset($callback) || !is_string($key) || !is_callable($callback)) {
          return;
        }
    
        $this->callbacks[$key] = $callback;
      }
    
      public function remove($key) {
        if ($this->exists($key)) {
          unset($this->callbacks[$key]);
        }
      }
    
      public function exists($key) {
        return isset($key) && array_key_exists($key, $this->callbacks);
      }
    
      public function run($key, ...$args) {
        if ($this->exists($key)) {
          $func = $this->callbacks[$key];
    
          if (!isset($args) || !is_array($args)) {
            $args = [];
          }
          
          if (isset($func)) {
            $func(...$args);
          }
        }
      }
    }
    
    $hook = new Hook();
    $hook->add("my_hook", function ($args) {
      // todo
    });
    
    $hook->run("my_hook");
    $hook->run("my_hook", 1, "string", true);

    Что-то вроде такого?
    Ответ написан
    3 комментария
  • Создание отдельной таблицы для каждого пользователя. Правильно ли?

    Exomode
    @Exomode
    Архитектор ПО
    Попытаюсь народным языком передать суть реляционок. Каждая таблица должна представлять некую модель данных. Каждая запись - объект, каждый столбец - его свойство определенного типа. Юзер - это одна модель и объектов юзеров может быть множество. Комментарий - другая модель и тоже множество её объектов. Пост форума, товар и тд - другие модели. А выборка данных из других таблиц для какой-то записи в текущей потом делается через связывание, там несколько вариантов, например, JOIN для объединения результатов в одну модель или связывание самих таблиц, или хранение связок в спомогательных таблицах, вариантов масса, выбор нужного зависит от специфики задачи и требований к оптимизации запросов.
    Ответ написан
    Комментировать
  • Как сделать меню с полосками?

    Exomode
    @Exomode
    Архитектор ПО
    .menu .menu_item {
      border-left: 1px solid #c0c0c0;
    }
    
    .menu .menu_item:first-child {
      border-left: 0 none;
    }

    или
    .menu .menu_item {
      border-right: 1px solid #c0c0c0;
    }
    
    .menu .menu_item:last-child {
      border-right: 0 none;
    }


    Вариант для вашей вложенности меню: codepen.io
    Ответ написан
  • Как сделать адаптивное меню с логотипом в центре?

    Exomode
    @Exomode
    Архитектор ПО
    Вариантов действительно масса, можно и таким подходом.
    Ответ написан
    Комментировать
  • У DLE 11.3 новая система паролей. Но заменяет в БД их так что пароли не работают, что делать?

    Exomode
    @Exomode
    Архитектор ПО
    Вам нужно убедиться, что данные, приходящие с формы авторизации, в старой кодировке Win-1251, тогда при проверке пароли должны совпадать, т.к. хэшироваться должны те же наборы байт, что раньше приходили на старой версии движка с формы в кодировке Win-1251. Кроме того, при проверке кодировка хэша так же должна совпадать с той, в которой будет результат md5(). Можно воспользоваться методом mb_convert_encoding(). Если надо удалить BOM, можно после конвертации в кодировку сделать примерно так:
    $bom = pack("H*", "EFBBBF");
    $string = preg_replace("/^$bom/", '', $string);

    Надеюсь, мои заметки вам помогут решить проблему.
    Ответ написан
  • Какая существует библиотека для построения графика по точкам из массива с собственным GUI на VC++ 2015?

    Exomode
    @Exomode
    Архитектор ПО
    Одна из альтернатив gnu plot, возможно вам подойдёт:
    koolplot
    Ответ написан
    Комментировать
  • Из-за чего может возникать проблема с кодировкой?

    Exomode
    @Exomode
    Архитектор ПО
    Проверьте чтобы кодировка везде была UTF-8 without BOM. И сделайте проверку после авторизации в Client::createResponse() типа
    if (!isset($arr) || !is_array($arr) || sizeof($arr) == 0) { return false; }

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

    Exomode
    @Exomode
    Архитектор ПО
    cron/crontab
    Запуск PHP скрипта по расписанию cron. Когда не вс...
    Будет выполнять действие асинхронно по интервалу времени.
    Как вы реализуете логику cron-задачи, уже полностью от вас зависит. Либо будет подменять картинку, либо весь стиль целиком, просто у вас должен быть конфиг, который будет переключаться cron'ом, по нему движок сайта определит, какой контент в данный момент времени отдать клиенту.
    Ответ написан
    Комментировать
  • Как сделать смену даты на сайту каждую субботу?

    Exomode
    @Exomode
    Архитектор ПО
    Если сайт интегрирован с внешним сервисом:
    cron/crontab
    Запуск PHP скрипта по расписанию cron. Когда не вс...

    Если на сайте есть админка и каждую неделю редактор делает пост газеты, то правильнее просто привязать к добавлению поста сразу и обновление даты в шапке, тогда и cron не понадобится.
    Ответ написан
  • Я бы хотел написать пост о моей игры в Хабрахабр, но в каком разделе?

    Exomode
    @Exomode
    Архитектор ПО
    01ae4dd8a9004fdfbdaf3bedd0eb5832.PNG
    Примерно такое.

    Из потоков подойдут "Разработка" и "Разное", если ваша статья будет об истории разработки.
    Из хабов - "Разработка игр", ещё возможно "Тестирование игр", так же можете указать хаб платформы, под которую велась разработка или хаб языка, на котором написана технология игры.
    Ответ написан
    Комментировать
  • Что нужно для первого приложения(ios/android)?

    Exomode
    @Exomode
    Архитектор ПО
    1) Xamarin.Forms для разработки UI и бизнес-логики на C# сразу под обе платформы;
    2) OSX для сборки и деплоинга билдов приложения под iOS (любой макбук подойдёт) и желательно айфон;
    3) Навыки в WPF для верстки UI;
    4) Навыки в SQL для работы с SQLite;
    5) Visual Studio для Windows или OSX;
    6) Документация по Xamarin, Android SDK и iOS SDK;
    7) Прямые руки, желание изучать технологию и представление конечного результата.
    Ответ написан
    Комментировать