Ответы пользователя по тегу PHP
  • Как при обработке формы, взять нужное значения поля "name"?

    Exomode
    @Exomode
    Архитектор ПО
    Если я правильно понял вашу задачу, то это можно сделать на стороне клиента:
    $(document).on("click", "#form [type='submit']", function () {
      var value = $("#form select option[selected]").text(); // Здесь будет ваш текст вида "Значение1".
      // Дальше делаете с ним что вам нужно и отправляете данные себе на сервер.
    });
    Ответ написан
    Комментировать
  • Почему возникает ошибка Call to a member function find() on null?

    Exomode
    @Exomode
    Архитектор ПО
    Вы пытаетесь в своем коде работать с объектом, у которого ссылка null. Либо измените логику кода, либо хотя поставьте проверку используемых объектов в коде на null.
    Ответ написан
  • Страница недоступна проблема с php, поможешь?

    Exomode
    @Exomode
    Архитектор ПО
    Перейдите сюда и вставьте ваш код, который у вас в <?php ... ?>, сразу поймете в чем дело.
    Ответ написан
    Комментировать
  • Проблема с отображением в twig?

    Exomode
    @Exomode
    Архитектор ПО
    1) Пишете функцию замены переменных для расширения Twig:
    $prepareString = new Twig_SimpleFunction('prepareString', function ($str) {
      return str_replace("%param1%", "Тест", $str);
    });


    2) Добавляете её в расширения:
    $twig->addFunction($prepareString);

    3) В шаблоне вызываете функцию где нужно:
    <span>{{ prepareString("Ваша строка с '%param1%'") }}</span>


    В $prepareString можете писать всю необходимую вам логику замены переменных. На регулярках, на переборе словаря, через str_replace как в моем примере или любым другим способом. Данные для подмены предварительно формируете из БД или любым другим способом.
    Ответ написан
  • Как заменить выражение в строке с помощью регулярного выражения?

    Exomode
    @Exomode
    Архитектор ПО
    $pattern = "/=icon:((#|\.\w+)|):((\w+)\.(\w+))/";
    
        $callback = function ($m) {
            return trim($m);
        };
        
        echo preg_replace_callback($pattern, $callback, '=icon:#logotype_mini:logotype_mini.svg');

    В первом аргументе ваш паттерн, во втором обработчик каждого найденного вхождения, в третьем ваш исходный string.
    Ответ написан
    Комментировать
  • Как передать массив данных json php в html через Jquery правильно?

    Exomode
    @Exomode
    Архитектор ПО
    Пример серверсайда:
    function response($data = []) {
        header("Content-Type: application/json; charset=utf-8");
    
        $flags = JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_PRETTY_PRINT;
    
        $fails = implode('|', array_filter([
            '\\\\',
            $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
            $flags & JSON_HEX_AMP ? 'u0026' : '',
            $flags & JSON_HEX_APOS ? 'u0027' : '',
            $flags & JSON_HEX_QUOT ? 'u0022' : '',
        ]));
    
        $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
    
        $callback = function ($m) {
            return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
        };
        
        echo preg_replace_callback($pattern, $callback, json_encode($data, $flags));
        exit;
    }
    
    response([ "a" => "b", ]);


    Пример клиентсайда:
    $.post('/some_page.php?', post).done(function (response) {
      // обработчик json, в переменной response сразу распарсенный объект благодаря заголовку Content-Type: application/json
                }).fail(function(xhr, status, error) {
                    console.error(error); // обработчик ошибки ответа сервера
                });

    По аналогии с методами $.get и .$ajax.
    Ответ написан
    Комментировать
  • Как с полученной строки от ajax получить на выходе массив php?

    Exomode
    @Exomode
    Архитектор ПО
    $response = file_get_contents("/api.php"); // Получаем ответ с сервера в формате JSON.
    $response = json_decode($response, true); // Конвертируем ответ в словарь php.
    var_dump($response);
    Ответ написан
    Комментировать
  • Почему не работает авторизация php +pdo?

    Exomode
    @Exomode
    Архитектор ПО
    Потому что нельзя просто так взять и выдернуть кусок кода из того места где оно УЖЕ работает и вставить его туда, где НУЖНО чтобы оно работало, нарушая при этом весь контекст выполнения. Либо подключайте класс работы с PDO в ваш скрипт и работайте через него, либо вытаскивайте тогда из класса и остальное чего не хватает по контексту (коннект, например), а больше не нужные $this замените ссылкой на объект PDO
    Ответ написан
    Комментировать
  • Как преобразовать цифру в статус в Laravel?

    Exomode
    @Exomode
    Архитектор ПО
    а наоборот не пробовали?
    [ 'Новый' => 0, 'Экономика' => 1, 'Менеджмент' => 2, 'Не прошел' => 3 ]
    Ответ написан
  • Как гарантированно полностью скачивать файл из удаленного источника?

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

    Exomode
    @Exomode
    Архитектор ПО
    Во-первых, юзайте global:
    $errors = array();
    function test(){
        global $errors;
        return $errors[] = 'empty_test';
    }
    test();
    print_r($errors);

    Во-вторых, лучше делать так:
    $errors = array();
    
    function test() {
        global $errors;
        $test = 'empty_test';
        $errors[] = $test;
    
        return $test;
    }
    
    test();
    print_r($errors);

    Или как выше сказали, через передачу аргумента по ссылке.
    Ответ написан
    Комментировать
  • Из-за чего может возникать ошибка?

    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
    Архитектор ПО
    \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
    Архитектор ПО
    Как вариант, сформировать массив почтовых адресов и циклом повторить вызов метода отправки письма, меняя при этом адресата. Универсальный способ, который подойдёт даже для 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
    Архитектор ПО
    cron/crontab
    Запуск PHP скрипта по расписанию cron. Когда не вс...
    Будет выполнять действие асинхронно по интервалу времени.
    Как вы реализуете логику cron-задачи, уже полностью от вас зависит. Либо будет подменять картинку, либо весь стиль целиком, просто у вас должен быть конфиг, который будет переключаться cron'ом, по нему движок сайта определит, какой контент в данный момент времени отдать клиенту.
    Ответ написан
    Комментировать
  • Как сделать смену даты на сайту каждую субботу?

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

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