Ответы пользователя по тегу PHP
  • Ошибка Notice: Undefined variable: как исправить?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Такие notices выдаются при обращении к необъявленным переменным. Например, $count_questions определяется только в том случае, если $_GET['test'] не пустая и удалось найти сам тест. Чтобы этого не было, нужно где-то в начале определять начальное значение, например, $count_questions = 0 перед проверкой if (!isset($_GET['test'])). То же самое и с остальными переменными: либо всё время проверять на isset, либо задавать начальные значения.
    Ответ написан
    4 комментария
  • Как сделать так, чтобы скрипт импорта не тупил?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Регулярные выражения вам в помощь. Код примерно такой (добавлять в конец приведённого фрагмента):
    if (strpos($r['sku'],'/')===false && preg_match('|_(\d+cm)$|',$r['sku'],$match) {
      $r['sizes'][]=$match[1];
    }

    Если я правильно понял, что размеры нужно собрать в $r['sizes'], а не в $size, и размеры могут быть только в cm, а не в каких-то других единицах.
    Ответ написан
    3 комментария
  • Как можно ускорить код php?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Насколько я понимаю, это алгоритм распознавания лица. Можно использовать готовый из PHP OpenCV (https://github.com/php-opencv/php-opencv). Ну или если в вашем варианте есть какие-то отличия, то реализовать этот же код заново, используя функции PHP OpenCV. Там большая часть вычислений реализована на C, поэтому выполняться будет существенно быстрее. (Правда, для этого нужен VDS, где можно самому ставить PHP extensions, а не обычный хостинг.)
    Ещё вариант — переписать код на C самостоятельно, без OpenCV, так, чтобы он висел в виде демона, а взаимодействие с ним происходило через Unix-сокет.
    Также, как правильно отметили в комментариях, некоторое ускорение может дать переход с 5 на 7 версию PHP.
    Ответ написан
    Комментировать
  • Как исправить ошибку при запуске PHP скрипта?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Это вообще-то не ошибка, а предупреждение, связанное с тем, что массив $argv определен только при запуске из командной строки, а вы скрипт через Web-сервер запускаете. Тем не менее, код, по идее, отрабатывает нормально.
    Чтобы избавиться, нужно добавить дополнительную проверку:
    if (!empty($argv) && array_key_exists('1', $argv) && mb_strlen($argv[1]) > 2) {

    И еще не могу не заметить: делать include файла, имя которого пришло извне (из GET-запроса) без каких-либо проверок — в общем случае очень серьезная дыра в безопасности.
    Ответ написан
  • Как правильно генерировать конечную цену и строить динамические скидки?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Во-первых, я сделал бы интерфейс iPriceCalc, и набор классов, реализующих этот интерфейс, и все расчеты вынес бы в них. (Соответственно, в классе должен быть один метод, в который передается информация о товаре и, на всякий случай, залогиненном пользователе.) Плюс на всякий случай предусмотрел бы для каждого товара предусмотреть возможность указывать в базе, какой именно класс для расчета цены должен использоваться.
    Редактор динамических скидок сделал бы так: таблица, в каждой ее строке несколько selectов. В первом из них выбираем, что именно проверяем (текущее число, текущий день недели, текущее время, цена продукта, категория и т.п.). Во втором — операция проверки (меньше, больше, равно, не равно). В третьем - значение с которым сравниваем.
    В конце таблицы — размер скидки и ее тип (абсолютная в рублях или относительная в процентах).
    Все это сохраняем в массив (с помощью сериализации в PHP или JSON) и передаем классу, осуществляющему расчет цены. Он проходит этот массив последовательно, берет каждую строку, подставляет вместо первого selectа реальное значение, смотрит, какую операцию нужно применить и сравнивает. Если все условия в наборе выполнились, скидка применяется и класс возвращает исправленную цену.
    То есть получаем примерно такой:
    class ConditionPriceCalculator implements iPriceCalc {
    function calc($product,$user) {
    $data = get_file_contents('файл с условиями');
    $conditions = unserialize($data);
    $result = true;
    foreach ($conditions as $condition) {
       // в поле comp_value лежит условное значение из первого selectа, для которого нужно посчитать реальное значение
       if ($condition['comp_value']=='day') $value1==date('d');
       elseif ($condition['comp_value']=='weekday') $value1=date('N');
      // ... и так далее
      $value=$condition['value']; // тут хранится, с чем сравнивать
      if ($condition['op']=='eq') $cur_res = $value1==$value2;
      if ($condition['op']=='ne') $cur_res = $value1!=$value2;
      //  и т.д.
      if (!$cur_res) $result = false; // если условие не выполнилось, общий результат сбрасываем в false, еще можно добавить break;
    }
    if ($result) {
      // если все условия из набора выполнились, рассчитываем новую цену:
    }
    }
    }

    В принципе, можно предусмотреть, чтобы таких наборов условий было несколько и применялся первый сработавший.
    Единственное ограничение — это то, что нельзя в одном наборе условий объединять их по "ИЛИ", а не по "И".
    Ответ написан
    1 комментарий
  • В чем причина ошибки modx?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Вы меняете кодировку в MySQL, а тут речь идет о кодировке в самом PHP. Если конкретно, где-то (скорее всего, в php.ini в опции internal_encoding, или в .htaccess в директивах php_value , или в настройках самого MODX, из которых через ini_set выставляется та же опция) прописана кодировка в виде utf8 вместо utf-8, что PHP воспринимает как некорректное значение.
    Кроме того, это не ошибка, а предупреждение.
    Ответ написан
    Комментировать
  • Как получить url картинки в preg_match_all?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Проблема в том, что и первое и второе выражение сохраняют список в одну и ту же переменную $matches, из-за этого картинки и теряются. Сделайте разные переменные ($matches_h2 и $matches_img, например), тогда все станет нормально.
    Ответ написан
    2 комментария
  • Как сохранить файл из инпута на сервер?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Через AJAX такое не получится. Придется делать однопиксельный iframe и ставить его в качестве target для формы.
    Или воспользоваться готовым plugin, например, jQuery File Uploader.
    Ответ написан
    Комментировать
  • Архитектура системы личных сообщений?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Ключевой вопрос: коллективные чаты в такой системе возможны?
    Если да, то тогда нужны следующие таблицы:
    thread (сессия/тема)
    thread_user (список пользователей, статус каждого, число сообщений, в том числе и непрочитанных, дата, когда пользователь читал сообщения в этой сессии в последний раз и т.п.)
    thread_post — собственно сами сообщения (чтобы оно хранилось в одном экземпляре, а не по одному на каждого пользователя)
    thread_links — связка сообщений из thread_post и пользователей (чтобы можно было удалять сообщения, не затрагивая других пользователей).
    В остальном — согласен с nirvimel, нужно использовать SQL-решение и писать на том, что хорошо известно.
    Ответ написан
    1 комментарий
  • Как узнать источник трафика?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Вообще-то даже с HTTPS получить HTTP_REFERER вполне можно (если речь идет не о перехвате чужого траффика, а о своем собственном сайте). Другой вопрос, что Яндекс некоторое время назад стал шифровать текст запросов и делать его доступным только через Метрику (но последнее с https не связано). Но сам факт того, что пользователь пришел из Яндекса, это опредлить не помешает.
    Ответ написан
    Комментировать
  • Почему все-таки PHP на моем VPS выполняется гораздо медленнее (результаты 2 тестов)?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Batlab совершенно верно ответил выше, что на VDS ресурсы процессора распределяются через виртуализацию, и они ограничены тарифным планом, но зато гарантированы каждому клиенту.
    На хостинге распределение идет иначе — все ресурсы сервера могут использоваться всеми клиентами. Поэтому если тестировать хостинг в тот момент, когда он слабо загружен (скажем, ночью с субботы на воскресенье), то результаты на нем будут лучше. Но в те моменты, когда на хостинге растет нагрузка от других клиентов, эффект будет обратный: сайт будет работать медленнее, чем на VDS (хотя еще многое зависит от самого хостера).
    Еще для корректного сравнения нужно брать и там и там одну и ту же версию PHP (на такие синтетические тесты, как у вас, она влияет очень сильно). А на тест с файлом будет сильно влиять дисковый кеш.
    Ответ написан
    2 комментария
  • Как сделать так, чтобы загружался архив?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Вопрос: а размер архива какой? Первое что приходит в голову — он превышает размеры, указанные в директивах PHP max_upload_size и max_post_size.
    Дальше, вместо sizeof($_FILES) лучше использовать !empty($_FILES['archive'])
    А также сделать в конце print_r($_FILES), и посмотреть ее вывод, чтобы понять, в чем вообще проблема.
    P.S. Полагаться на переданный пользователем type — не самая лучшая идея с точки зрения безопасности. (Впрочем, в данном конкретном случае это не критично.)
    Ответ написан
    2 комментария
  • Как обернуть картинку ссылкой php взяв ссылку из ее атрибута data-url?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Если требуется обработать на стороне сервера, то это можно сделать с помощью регулярного выражения:
    $html=preg_replace('|<img src="([^"]+)"\s+alt=""\s+data-url="([^"]+)">|is','<a href="$2" class="to"><img src="$1" alt=""></a>',$html);
    Ответ написан
    Комментировать
  • Как перезапросить форму отправки?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Очень просто: обрабатываем форму, после обработки ничего не выводим, а делаем редирект со статусом 303 на ту же страницу, с которой пришли. После этого эта страница запрашивается методом GET, а если сделать «Обновить», то форма заново не отправляется (и запрос не появляется).
    Т.е. код примерно такой:
    header($_SERVER['SERVER_PROTOCOL'].' 303 See other');
    header('Location: '.($_SERVER['HTTPS'] ? 'https://' : 'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    Ответ написан
  • Можно ли заинклюдить файл без функции include?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Очень просто:
    // загружаем файл в $data и расшифровываем
    eval($data);
    test();

    Но с eval нужно быть очень аккуратным в плане безопасности, к тому же на многих хостингах eval он запрещен в настройках.
    Ответ написан
  • Как сделать надежное приложение для доступа к аккаунту Google?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Скорее всего, нужно добавить поддержку SSL/TLS, причем самых новых версий и запретить использование устаревших протоколов.
    Ответ написан
  • Как решить "No Privileges" при создании базы данных в phpMyAdmin?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    В Ubuntu mysql по умолчанию ставится с plugin, который привязывает root-пользователя из MySQL к системному root-пользователю. Поэтому нужно из терминала сделать sudo mysql, а потом создать еще одного пользователя с ALL PRIVILEGES.
    Ответ написан
    2 комментария
  • Почему не работает скрипт отправки письма с сайта?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Сайт на VDS или на обычном хостинге? Если на VDS, то настроен ли на нем MTA (программа обмена почтой типа sendmail, postfix и т.п.)? И корректно ли прописан путь к утилите sendmail в настройках PHP? Удается ли отправить письмо через sendmail из командной строки?
    Еще нужно проверить, что указано в SPF и DMARC домена, возможно, там стоит не принимать почту от недоверенных хостов. (Поэтому адрес отправителя лучше сделать в своем домене, а не на ya.ru).
    Еще в качестве простого решения для VDS могу посоветовать утилиту msmtp, она позволяет отправлять почту через сторонний сервис без MTA-агента.
    Ответ написан
    Комментировать
  • Как лучше организовать построение карт с более 1000 точек?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Использовать БД, которая поддерживает spatial-типы данных (например, PostgresSQL), сделать по ним индексы и подгружать AJAXом только те точки, которые находятся в текущей области видимости.
    Ответ написан
  • Как заблочить исполнение скрипта, если он уже запущен?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Сделать так: проверять наличие файла с определенным именем где-ниубдь в /tmp или /var/run, если он есть, то тут же делать выход из скрипта, если нет, то создавать такой файл, после чего выполнять необходимую работу и удалять файл перед завершением скрипта, если оно проходит корректно.
    Ответ написан
    9 комментариев