Ответы пользователя по тегу PHP
  • Php Phalcon, как отправить данные в формате json?

    copist
    @copist
    Empower people to give
    0. Убедитесь в /etc/hosts, что домен learning относится к хосту 127.0.0.1
    1. Проверьте вручную через консольную команду curl на том же самом сервере, что http://learning/test/accept возвращает какой-либо ответ
    2. Проверяйте логи веб-сервера
    access.log - был ли вообще запрос между двумя скриптами
    error.log - были ли ошибки
    3. В код sendAction() замените код, чтобы увидеть ошибку
    if( ! $result = curl_exec($curl)) // чтобы проверить на наличие ошибки CURL или HTTP
    {
        trigger_error(curl_error($curl));
    }
    curl_close($curl);
    echo $result; // чтобы видеть результат запроса

    4. В коде acceptAction() добавьте код
    $receive_data = json_decode($json,true);
    if (json_last_error()) // чтобы проверить наличие ошибки декодирования JSON
    {
        trigger_error(json_last_error_msg());
    }


    -------------

    А вообще логика вашего скрипта какая?
    Я вижу, что
    1. Первый скрипт выбирает пользователей из базы (без лимита, это страшно на продакшене)
    2. Этот список пользователей посылается запросом из public function sendAction() на http://learning/test/accept в формате JSON
    3. Этот JSON декодируется и передаётся в $this->view->users
    4. ... зачем?

    -----------

    Уточнённое решение

    На одном сервере получить JSON и показать через шаблон
    class TestController
    {
        public function showAction()
        {
            $json = file_get_contents("http://learning/test/users"); // получить данные со второго сервера
            $users = json_decode($json, true);
            $this->view->users = $users; // передать в представление
        }
    }


    На втором сервере выбрать данные из базы и выдать в формате JSON
    class TestController
    {
        public function usersAction()
        {
            $users = Users::find(); // получить из базы
    
            // подготовиться к выдаче ответа в формате JSON
            $this->view->disable();
            $response = new \Phalcon\Http\Response();
            $response->setStatusCode(200);
            $response->setJsonContent($users);
            $response->setContentType('application/json', 'UTF-8');
            return $response;
        }
    }


    По идее первый должен показать то, что хранится в базе в таблице user на втором сервере
    Ответ написан
  • Как проверить баланс сим-карты МТС на PHP?

    copist
    @copist
    Empower people to give
    У них есть Личный кабинет и мобильное приложение. Там доступен баланс.

    А. Решение через "Личный кабинет"
    1. имитировать логин в личный кабинет с помощью curl с сохранением кук и прочей мишуры
    2. имитировать запрос в личный кабинет на страницу баланса с помощью curl
    скорее всего эта страница содержит баланс
    https://login.mts.ru/profile/header?ref=https%3A//ihelper.sib.mts.ru/selfcare/welcome.aspx&scheme=https&style=2015v2&updat&updat&updat

    3. парсить HTMl баланс через XML или регулярку
    https://monosnap.com/file/DLyZ0XcQfjQykKLxS4fVkJWP...

    Б. Решение через мобильное приложение
    1. Снифить трафик между андроидом и сервером через прокси
    2. Имитировать такие же пакеты
    3. В итоге получить пакет, в котором есть баланс
    Ответ написан
    1 комментарий
  • Как вывести строку из txt файла по порядку на php?

    copist
    @copist
    Empower people to give
    $filepath = 'path/to/file.txt'; // файл со строками
    $filenumpath = 'path/to/file.line'; // дополнительный файл с номером последней строки
    
    $file = file($filepath);
    $linenum = is_file($filenumpath) ? 1+(int)trim(file_get_contents($filenumpath)) : 0; // прочитать номер из файла; если файла нет, то номер = 0
    echo $file[$linenum%count($file)]; // вывести строку
    file_put_contents($filenumpath, $linenum); // записать номер в файл
    Ответ написан
    7 комментариев
  • Как иконку в произвольное поле поста?

    copist
    @copist
    Empower people to give
    Какое назначение этого "произвольного поля"? Где отображаться должно?

    Если просто в тексте поста, то можно так (GIF): https://ps.w.org/icons-enricher/assets/screenshot-...
    Плагин https://wordpress.org/plugins/icons-enricher/
    Ответ написан
    1 комментарий
  • Почему ajax форма не отправляет на почту?

    copist
    @copist
    Empower people to give
    Смотрите access.log сервера - был ли запрос к PHP
    Сделайте отладку на сервере в PHP - например, через error_log() и смотрите в error.log сервера - нет ли ошибок в PHP

    Всегда дублируйте отправку почты записью в лог или даже делайте выгрузку копии отправляемого письма в отдельные файлы на случай, если почта почему то не отправляется.
    Ответ написан
    Комментировать
  • Как в PHP принять объект с файлом?

    copist
    @copist
    Empower people to give
    Отправлять файл черех AJAX - не простая задача. Есть несколько способов. Самый простой - если используются современные браузеры - использовать объект FormData. Этот JS класс умеет преобразовывать поля разного типа, включая file.

    <form id="form" action="send.php" method="post" enctype="multipart/form-data">
    <input type="file" name="UploadForm[attachment][]" multiple="">
    <button type="submit" class="btn btn-primary input-lg">Submit</button>
    </form>


    $.ajax({
        url: "send.php",
        data: new FormData($('#form').get(0)),
        cache: false,
        contentType: false,
        processData: false,
        type: 'POST',
        error: function(jqXHR, textStatus, errorThrown) { /** @var jqXHR jqXHR */
            console.log('error', textStatus, errorThrown);
        },
        success: function(data, textStatus, jqXHR) { /** @var jqXHR jqXHR */
            console.log('success', data);
        }
    });


    Рабочий пример: форма с аттачментами отправляется через AJAX (кнопка в подвале страницы, извиняюсь)

    Варианты без FormData описаны в статье https://blog.arvixe.com/how-to-send-multipart-data...
    Я раньше пользовался фреймами, а потом перешёл на библиотеку www.dropzonejs.com - она сама подбирает вариант в зависимости от возможностей браузера.
    Ответ написан
    1 комментарий
  • Как вытащить из массива URL картинки?

    copist
    @copist
    Empower people to give
    Используйте var_export($arResult)

    echo $arResult['DETAIL_PICTURE']['SRC'];
    echo $arResult['PREVIEW_PICTURE']['SRC'];
    Ответ написан
    1 комментарий
  • Авто создание поддомена с сайтом?

    copist
    @copist
    Empower people to give
    Когда я впервые познакомился с сервером, который создаёт поддомены третьего уровня, а также умеет "парковать" домены второго уровня, я прежде всего представил себе, что там автоматически создаются директории для пользовательских скриптов, конфиг для апача и какой-то рутовый демон делает sudo service apache reload

    Но на деле оказалось не так.
    1. В DNS стоит правило (см https://toster.ru/q/7456) - все поддомены ***.myservice.ru отправляются на один IP
    * IN A 192.168.1.1
    Замени 192.168.1.1 на IP твоего сервера

    2. В апаче/nginx не стоит привязка виртуального хоста к имени домена (myservice.ru или иной), все запросы отправляются на обработку на один скрипт (PHP?)

    nginx
    {
        listen 80;
        # server_name не указывать
    }


    3. В коде приложения (PHP) вычисляется домен в запросе HTTP и исходя из этого строится ответ
    У пользователя в таблице user прописано имя домена, то есть пользователь Вася - это домен vasya.myservice.ru

    $domainName = $_SERVER['HTTP_HOST']; // vasya.myservice.ru
    $userDomain = $db->findUserByDomain($domainName);
    echo 'Владелец этой страницы: ', $userDomain->fullName; // Владелец этой страницы: Вася
    // ...


    Это если речь про веб-интерфейс. А если у тебя реально разные приложения (бинарники?) ставятся из архива, то тебе нужно запускать разные команды из PHP, например

    1. Создать директорию, сгенерировать конфиги htaccess или host для Apache
    2. Распаковать архив /или слинковать какую-то общую часть через symlink
    3. Заставить Apache сделать reload конфигов

    Для этих команд тебе пригодится php.net/manual/en/function.system.php php.net/manual/en/function.exec.php или php.net/manual/en/function.shell-exec.php

    Последний пункт самый небезопасный, потому нужно пользователю апач дать права на выполнение команды от рута. Лучше делать это по крону или от имени специального сервиса-демона, а не из PHP.
    Ответ написан
    7 комментариев
  • Сode first или database first?

    copist
    @copist
    Empower people to give
    Как специалист по проектированию систем "с нуля" я всегда начинаю с проектирования базы данных, а перед ней идёт анализ предметной области. Модель данных желательно спроектировать не только на MVP, но и на два-три шага вперёд, посмотрев на roadmap проекта.

    Видео: анализ предметной области и построение реляционной...

    Достраивать на ходу тоже конечно приходится, но так чтобы писать код без БД - это самому себе палки в колёса совать, как мне кажется.
    Ответ написан
  • Как спарсить JSON?

    copist
    @copist
    Empower people to give
    $json = file_get_contents('php://input'); // получить JSON из HTTP запроса
    $array = json_decode($json, true); // декодировать в массив
    var_export($array); // и пользуйся на здоровье


    copi.st/Qb8Q on StackOverflow about php://input
    Ответ написан
    Комментировать
  • С какой версии начинать изучение PHP?

    copist
    @copist
    Empower people to give
    Знать про функции (особенно deprecated) версии 5.3+ будет хорошо, а начать лучше с 5.6 - это последняя стабильная в ветке 5.x
    Книгу порекомендую «PHP. Объекты, шаблоны и методики программирования» Мэт Зандстра, четвёртое издание, 2015 год - там PHP 5.6 - книга прям по канонам шаблонов проектирования
    По версии 5.4 можно взять «PHP. Рецепты программирования» Дэвид Скляр, Адам Трахтенберг, третье издание, 2015 год - там отличные примеры кода, которые часто пригодятся на практике.

    Ещё я бы порекомендовал посмотреть на код в ООП стиле для версии 5.0 - он довольно часто фрагментарно (по привычке наверное) используется в 5.3+. Это для общей эрудиции, чтобы не запутаться в синтаксисе приложений, которые могут попасть в руки. Например, передача по ссылке объектов как параметров функций, присвоение объектов по ссылке - это уже не используется, объекты и так передаются и присваиваются по ссылке.

    В руки может попасться код любой версии PHP в процедурном стиле. Весьма своеобразный код. С глобалами, константами и прочей "не ООП" трухой. Процедурный стиль всё ещё используется, особенно для одноразовых консольных скриптов.

    Нужно знать, как мигрировать код с deprecated библиотеками, которые предыдущим программистам лень было заменять на новые (например, mysql_ или ereg_ ).
    Ответ написан
    3 комментария
  • Знайте ли вы онлайн-сервисы по изучению PHP наподобие HTMLAcademy.ru или codecademy.com?

    copist
    @copist
    Empower people to give
    https://vc.ru/p/online-courses Где учиться программисту: 19 онлайн-курсов
    https://habrahabr.ru/post/156241/ 27+ ресурсов для онлайн-обучения
    Там много чего есть по разным языкам, включая PHP
    Ответ написан
    Комментировать
  • Исходники каких PHP-проектов лучше поизучать для примера отличного PHP-кода?

    copist
    @copist
    Empower people to give
    Проголосую за Yii (первый или второй) и Zend Framework 2. Александр Макаров только не надо про срезание углов :) Laravel нигде не срезал, все паттерны реализовал, очень гибкий. За это его обхожу стороной, огородами. Для начала надо что-то попроще.

    В Yii/Zend всё можно раскопать (на тостере пример про компоненты, и роутинг). Не очень много кода, в большинстве случаев не сложные реализации классических паттернов проектирования, довольно простая навигация по классам и разбор стека ошибок.

    Дополнение к ответу:
    Хотелось бы увидеть примеры отличного кода в работе реальных проектов. Изучение исходников Yii2 и Laravel многое дали, но не все.

    Не заметил сразу.

    А что не дали эти фреймворки?
    Я не слишком шокирую, если скажу, что в реальных проектах код не очень отличный? Высокопроизводительные нагруженные веб-проекты стараются обходить стороной сложные шаблоны проектирования, потому что всякие там поздние связывания, декораторы, рефлексии и прочая ерунда жрёт ресурсы, которых постоянно не хватает. Вместо красивого класса-декоратора просто вызывают метод класса, вместо DI напрямую вызывают классы. Классные проекты отличаются классностью для пользователя, делают полезные штуки, все такие веб-два-нольные, материал-дизайные, юзер-френдные. А внутри там ......... ааааа! Каждый раз, когда в классный проект решают внести ещё одну классную штуку, то один, то другой программист говорит: "там надо переписывать, лучше заново". Чем старше проект, тем чаще звучат слова "говнокод", "костыли" и "рефакторинг".

    В общем, если Yii и Symphony и шаблоны проектирования уже пройденный этап, то нужны другие книги :)
    Ответ написан
    1 комментарий
  • Почему перестал работать php?

    copist
    @copist
    Empower people to give
    Переустановился Apache и PHP. Надо активировать модули апача для PHP.
    Ответ написан
  • Как на нативном js получить ответ с сервера в виде массива или объекта?

    copist
    @copist
    Empower people to give
    Вот тут не делай конкатенацию console.log(ourServ+' our)');
    правильнее выводить два значения через запятую console.log(ourServ, 'our)');
    а лучше пользуйся пошаговой отладкой

    Вот: всё у тебя нормально вроде бы
    76f2305b29fa4e51bbd306698df8592f.png

    Ответ сервера надо перестроить, чтобы отображать более сложные данные. Может быть так:

    foreach ($data as $key) {
        $response[] = [
            'city' => $key['city'],
            'region' => $key['region'],
            'state' => $key['state'],
        ];
    }


    или так
    foreach ($data as $key) {
        $city = $key['city'];
        $stateRegion =  $key['region'] . (''!==$key['region'] && ''!==$key['state'] ? ' ' : '') . $key['state'];
        $response[] = $city . ''!==$stateRegion ? ' ( ' . $stateRegion . ' )' : '';
    }
    Ответ написан
    2 комментария
  • Что я делаю не так?

    copist
    @copist
    Empower people to give
    Notice: Undefined property: index::$TestUrl in /home/lucifer/php/Core/modules/router.php on line 29
    
    Notice: Undefined property: index::$Test in /home/lucifer/php/Core/modules/router.php on line 29

    Ошибки в файле router.php. На 29ой строке.

    Предположительно в
    $this->router->post($id, $url, $func->$f[1]);

    Из контекста неясно, что именно в переменных $id, $url, $func, $f
    Ответ написан
    Комментировать
  • Какую CMS лучше выбрать для разработки каталога репетиторов?

    copist
    @copist
    Empower people to give
    Какую CMS лучше взять чтобы ускорить и удешевить разработку ?
    Не вижу смысла писать с нуля, потому что должны быть готовые решения


    Поищи Education Open Source CRM
    Навскидку https://www.openeducat.org/ или https://moodle.org/
    Последняя мультиязычная.

    Ещё по запросу Open Source Social Networks
    https://elgg.org/
    https://www.humhub.org/
    https://www.getanahita.com/

    А вообще подобное можно сделать и на базе Wordpress (https://wordpress.org/plugins/tags/community, например buddypress.org ) или Joomla ( extensions.joomla.org/tags/communities, например extensions.joomla.org/extensions/extension/clients... ) а потом допиливать до нужной функциональности.
    Ответ написан
    Комментировать
  • Какой правильный путь при написании роутинга?

    copist
    @copist
    Empower people to give
    Не хотел бы углублять в конкретную реализацию. Объяснение на уровне абстракций.

    C моей точки зрения роутер должен выполнять функцию определения по методу HTTP и строке URI, какая функция должна быть вызвана.

    Результатом работы роутера может быть название класса и метода, как в Yii 1. Или может быть даже анонимная функция, как в Laravel, Phalcon, Django, RoR или ExpressJS. Это может быть, наверное, даже ассоциативный массив типа [ "response headers", "response body" ] или имя статического файла.

    Как сказал Сергей Протько, гибкость роутера в том, что роутер ничего не должен знать о логической структуре приложения, но такое я могу сказать только о базовом универсальном роутинге, который работает по карте сопоставлений URI и программных методов. Он действительно мало что знает, потому что парсит регулярки, ищет максимально похожее выражение, возвращает какие-то абстракции.

    С моей точки зрения, гибкий роутинг - это такой, который может быть легко заменён на любую альтернативную реализацию. Совместимость обеспечивается использованием объектно-ориентированного подхода с применением интерфейсов или через duck-typing.
    Например, роутером может считаться класс, который реализует RoutingInterface (это согласно ООП) или содержит метод route(arguments) (это duck-typing).

    Такой подход позволяет реализовать, например, сопоставление пути вида myblog/my-article с контролером
    "blog/view" через поиск по базе данных, а не по регулярке.

    И вот у Сергей Протько был роутинг с картой сопоставлений, а я заменил на роутинг с использованием базы данных. Логичный вопрос: делать карту сопоставления для всех роутов (что если правил будет больше 100?), либо всё это заносить в базу данных? (всё-всё-всё, каждый путь к профилю всех 100 000 пользователей - они же одинаковые /profile/111222). Ну не гибко же!

    Ещё более гибкий роутинг позволяет реализовать каскад роутеров. Если один роутер не смог распознать, кто будет отвечать за этот URI, управление передаётся другому.

    Таким образом можно сначала "натравить" на поиск по базе данных, затем по картам соответствий с регулярками.

    Или разбить приложение на модули и реализовать роутинг в каждом модуле приложения, а затем соединять их каскадами. Например, пусть за роутинг профиля пользователя отвечает модуль "User", а за записи блога - модуль Blog. Тогда URI вида /profile/111222 возьмёт на себя User, а /profile-as-an-article мог бы бы перехватить блог, и уже если никто не смог, то 404 Page Not found.

    Идея гибкого роутинга ясна? Нужны примеры с конкретной реализацией?
    Ответ написан
    3 комментария
  • Отобразить текст по таймеру, чтобы клиенту не было видно в коде?

    copist
    @copist
    Empower people to give
    Фраза "Hello World" - это пример, что-то типа секретной информации.
    Думаю, автор имеет в виду, что ни JS, ни в HTML, ни в CSS нет этой фразы и её нельзя собрать из частей типа "Hello" + "World".

    В этом случае решение - AJAX с проверкой меток времени на сервере.

    В куки сохраняется код серверной сессии, а на сервере в сессию сохраняется когда секретная фраза будет доступна.

    У пользователя в HTML странице встраивается счётчик на JS, который некоторое время делает AJAX запрос на сервер.

    На сервере проверяется метка времени в сессии и текущий счётчик времени - "Достиг ли счётчик времени нужной отметки?" Если да - возвращается секретная строка. Если нет - возвращается ошибка.

    Возвращение ошибки нужно для того случая, если пользователь решил хакнуть систему и запросить URL раньше назначенного строка.

    Именно таким образом работают всякие там файло-качалки типа depositfiles: пока таймер не дотикает, пользователь не получит ссылку на файл, даже если полностью изучит JS код и отправит нужный запрос напрямую, не дожидаясь окончания таймера.

    Пример реализации:

    1. файл index.php
    <?php
    session_start();
    $_SESSION['secret_phrase'] = 'Hello, World'; // секретная фраза
    $_SESSION['time_to_show_secret'] = time() + 10; // через сколько времени фраза может быть доступна
    ?>
    <!DOCTYPE html>
    <html lang="ru">
    <head>
      <meta charset="utf-8" />
    </head>
    <body>
      <div id="ajax"></div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
      setTimeout(function(){
        $('#ajax').load('/secret.php'); // запросить данные через /secret.php и вставить внутрь <div id="ajax"></div>
      }, 10 * 1000); // через 10 секунд
    });
    </script>
    </body>
    </html>


    2. файл secret.php
    <?php
    session_start();
    if (isset($_SESSION['secret_phrase']) // если в сессии есть секретная фраза
            && isset($_SESSION['time_to_show_secret']) // и есть метка времени, когда фраза будет доступна
            && time() > $_SESSION['time_to_show_secret']) // и текущее время больше этой метки
        echo $_SESSION['secret_phrase']; // выдать секретную фразу
    else
        echo 'Секретная фраза пока не доступна'; // выдать ошибку


    Этот пример в архиве: https://www.dropbox.com/sh/54xk7ahezuandag/AABqbRa...
    Ответ написан
    Комментировать