Ответы пользователя по тегу PHP
  • Способы обмена данными между PHP сценариями?

    cookies не костыль, собственно для этого они и придуманы (сессия — дальнейшее развитие идеи)

    А у вас противоречие в условиях, по-моему:
    Вариант с GET не подходит, ибо данные явно висят в url противоречит но через обычную ссылку их не передашь. Либо данные висят в урл, либо через обычную ссылку (без дополнительных скриптов на клиентской стороне) их не передать. Третьего не дано.

    Может устроит вариант:
    1. На исходной странице обычная GET ссылка на промежуточную страницу с данными в URL, нажимаем
    2. Сервер принимает данные, пишет их в сессию и делает редирект на целевую страницу без данных в URL
    3. Целевая страница достаёт данные из сессии и тут же сессию очищает.

    Если пользователь не смотрит куда ведёт ссылка (или его браузер не показывает), то данные в URL мелькнут в адресной строке очень не надолго на современном ненагруженном компе и быстром инете.

    Опять же если стоит задача скрыть от пользователя данные полностью, то это не реально, мониторить трафик умеют сейчас все популярные браузеры. Можно усложнить жизнь шифруя данные, но только усложнить. А для защиты от случайной утечке данных по сценарию типа «ломщик увидел секретный url, запомнил и дома его ввёл» моего сценария, имхо, достаточно.
    Ответ написан
    Комментировать
  • Существуют ли framework'и для PHP вроде 1С?

    Большинство (перестраховка) популярных фреймворков имеют тот или иной вид ORM, позволяющий не задаваться (почти) вопросом где и как хранятся данные. Так же как имеют более-менее развитые средства работы с формами или даже генерации CRUD-интерфейсов. Отчёты — шаблонизаторы или сам PHP.

    Чисто субъективно для бизнес-приложений посоветовал бы присмотреться к Symfony2(+Doctrine2+Twig). По-моему там сильнее всего идёт разделение бизнес-логики, представлений и логики приложения (роутинг, хранение и т. п.).
    Ответ написан
    Комментировать
  • Какой фрэймворк учить и по каким мануалам?

    Изучил бы на вашем месте Yii и Symfony 2 (плюс Silex :) ), а дальше выбирал бы под задачи, примерно так: Silex для простейших (типа форму обратной связи на статический сайт прикрутить) или очень нестандартных задач (от фреймворка по сути требуется гибкий роутинг), Yii для «ширпотреба», Symfony 2 для сложной бизнес-логики, которая вероятно будет постоянно меняться.
    Ответ написан
    Комментировать
  • Статика VS Singleton?

    Смотря как использовать. Даже если забыть про конструктуры/деструкторы и прочий «сахар», то у синглтона есть и другое преимущества — его можно передать в качестве параметра функции/метода, то есть уменьшить связанность кода.
    Ответ написан
    Комментировать
  • Нужна помощь web-разработчиков

    Вообще system('bash /etc/startup/start_2.sh') делает что вам нужно, но как писали выше есть нюансы с конфигами веб-серверов. Например если у вас стоит nginx перед apache+mod_php, то поведение предсказать невозьмусь.
    Ответ написан
    Комментировать
  • Лаконичный класс для логирования событий

    Monolog — компактным назвать нельзя, но вот по гибкости куда-чего назначать… Различные обёртки а-ля пайпы и т. п. Например понравилась возможность на error отправлять и мыло, кроме записи в лог.
    Ответ написан
    Комментировать
  • PHP и строки близкие в maxint?

    Чем нужно руководствоваться чтобы такое придумать?

    Тем что PHP изначально шаблонизатор, работает с текстовыми данными (вход скрипта с веб-сервера, записи в БД, файлы — всё строки), но данные зачастую числовые по сути. Вот и «облегчили» жизнь разработчикам, чтоб не нужно было на каждый чих типы приводить.

    Помню случайно наткнулся на эту сомнительную «фичу», сравнивал примерно так: $str1. 'fake' == $str2. 'fake'
    Ответ написан
    3 комментария
  • MVC в PHP??????

    Это тоже MVC :)
    <?php
    // /user.php?<id>
    
    function getUserNameById($id) {
      mysql_connect() or die("Can't connect");
      mysql_select_db('myapp_db') or die("Can't select");
    
      $result = mysql_query("SELECT name FROM users WHERE id = " . mysql_escape_string($id) . " LIMIT 1") or die("Can't query");
      $row = mysql_fetch_row($result) or die("Can't find");
      mysql_close();
      $name = $row[0];
    
      return $name;
    }
    
    public function showUser($id, $name) {
      echo "<html>Name of user with id = " . htmlspecialchars($id) . " is " . htmlspecialchars($name) . "</html>";
    }
    
    $user_id = empty($_GET['id']) ? $_GET['id'] : null;
    $user_name = getUserNameById($user_id);
    showUser($user_id, $user_name);
    

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

    Так писать, конечно же не стоит (по крайней мере без особых причин), но понимать, что это тоже MVC, что MVC это не свойство ООП-фреймворков, и даже не свойство ООП, а свойство архитектуры приложения — нужно. И для того чтобы архитектура обладала этим свойством (использовала паттерн MVC) вовсе не нужно раскидывать компоненты приложения по куче разных объектов и/или файлов, использовать другие паттерны архитектуры и реализации, достаточно чтобы данные, их представление и управление ими были разделены логически.
    Ответ написан
    Комментировать
  • Php работа с регистром русских символов в UTF-8?

    Я хочу добиться красивого кода, без использования multibyte функций и явного преобразования кодировки средствами iconv().
    Фактически это означает, что вы хотите написать свой парсер utf-8 хотя бы для русского подмножества символов? :) Зачем?
    Ответ написан
    1 комментарий
  • Что вы делали для облагораживания разработки на php?

    Организовал так:
    — исходники в репе под Mercurial
    — клон репа на тестовом сервере, докрут указывает на нужный каталог
    — на продакшен деплой производится capistrano
    — если приходится править код в «экстремальных» условиях, то на сервере есть отдельный пользователь тоже со своим клоном репа и установленным capistrano, то есть даже срочная правка по ssh заключается в пулле свежих изменений с основного репа, внесение срочных, коммит в клон, пуш в основной, cap deploy
    Ответ написан
    2 комментария
  • Как php интерпретирует такое <?=$htmltitle?>?

    >Я бы кодера который мне в шаблоне в перемешку с html написал кучу php посадил бы накол.

    Вообще-то PHP сам является шаблонизатором прежде всего. Или за {{var}} вы не убиваете? Только php не нравится? А вообще <?= теперь (в 5.4) будет вообще неотключаемой (до 5.4 можно отключить, почему <?= и <? не рекомендовалось из соображений совместимости, <?php echo $var; ?> работает везде. Теперь везде (>=5.4)будет работать и <?=$var; теперь его можно смело использовать и вы чаще будете его видеть.
    Ответ написан
    Комментировать
  • Куда пропали "User Contributed Notes" с php.net?

    Может быть решили отфильтровать устаревшее в преддверии выхода 5.4?
    Ответ написан
    Комментировать
  • Странности с поведением браузеров в кодировке get-параметров (Windows-1251 / UTF-8)

    В Файерфоксе параметр явно закодирован не в Utf-8. Должно быть ?param=test%20test=%D0%BF%D1%80%D0%B5%D0%B2%D0%B5%D0%B4. Чем кодировали?
    Ответ написан
  • PHP, ООП. Практическое изучение

    Любую задачу (решаемую в принципе) можно реализовать как с ООП, так и без него (в процедурном стиле, например). «Прелести» ООП лучше всего чувствуются на больших проектах, где невозможно держать в голове все (глобальные) переменные и функции и способы их взаимодействия и приходишь к пониманию необходимости использовать более высокие уровни абстракции, чем отдельные значения и классические массивы из них. Начинаешь объединять семантически связанные данные в структуры (ассоциативные массивы в PHP), а функциям с ними работающим давать имена с префиксом (обычно) в виде названия (чисто семантическое) этих структур, чтобы хоть немного упорядочить глобальное пространство имён, получая функции вида user_login(array $user, $login, $password), user_logout(array $user) и user_is_logged(array $user). До простейшего ООП осталось сделать один шаг — перенести и функции (указатели на них в С, callback/имена в PHP) в эти структуры, но синтаксис вида call_user_func($user['user_login'], $user, $login, $password) мягко говоря неудобен и избыточен и тут в PHP4 вводят вместо него синтаксис $user->login($login, $password) и без него ты больше не можешь жить :)

    Если же до семантических концепций ООП не дойти на своей шкуре, то разницы между user_login(array $user, $login, $password) и $user->login($login, $password) почти нет, но даже на таком простом примере видно, что запись банально короче и глобальное пространство имён меньше используется, что особенно заметно при использовании IDE с автодополнением.

    Но это философское отступление было о некоторых прелестях ООП. Прямой ответ на вопрос «какую задачу?» — любую интересную хотя бы чуть-чуть. Желательно с развитой предметной областью, в которой ощущается интуитивно наличие нескольких абстракций разного уровня. Если для процедурного приложения вы создаёте несколько таблиц в БД или используете ассоциативные массивы для группировки семантически близких значений — то это, скорее всего, такая задача. Для большего wow-эффекта или просветления можно попробовать написать две версии одного приложения типа блога, одну в процедурном стиле, другую в ООП. Причём в первой желательно не использовать «промежуточные» решения типа ассоциативных массивов даже для mysql_fetch_assoc/array(), только бескомпромиссное mysql_fetch_row(). Если же без ассоциативных массивов вы уже разработки не представляете, то вы уже почти достигли ОО-просветления :)
    Ответ написан
    Комментировать
  • Вопрос по View (PHP MVC)?

    Вообще говоря, да, для каждого действия нужен свой вид/шаблон, причём вид и шаблон считать синонимами можно только с натяжкой. Или даже несколько видов, среди которых контроллер выбирает нужный в данный момент.

    Использования наследования и включений шаблонов это следование другим практикам и паттернам непосредственно к MVC отношения не имеющим. Как, кстати, не имеет отношения к MVC и «запускается приложение из index.php, метод route разбирает запрос пользователя и отдает управление одному из методов соответствующего контроллера».

    При выборе между наследованием/декорирования и включение посоветовал бы делать упор на первое. Даже без использования шаблонизаторов типа Smarty или Twig оно осуществляется довольно легко с помощью функций ob_*, особенно если достаточно двухуровневого. Метод render может выглядеть примерно так:
    ob_start();
    require $template;
    $content = ob_get_clean();
    require 'layout.php';
    

    layout.php так
    <html>
    <body>
    <div id="header">Шапка</div>
    <div id="content">
      <?= $content ?>
    </div>
    </body>
    </html>
    

    А blog_index так
    <?php foreach($posts as $post): ?>
      <div class="post">
        <h1><?= $post->title ?></h1>
        <?= $post->content ?>
      </div>
    <?php endforeach ?>
    
    Ответ написан
    1 комментарий
  • Утверждения PHP (PHP assertions)?

    Раньше использовал assert('is_*($param)') для контроля типа параметров функций, но как-то от этой практики отказался, т. к. ни разу не сработали.
    Ответ написан
    Комментировать
  • Статический анализ PHP-кода?

    Плохо гуглили. Я вот тоже habrahabr.ru/blogs/code_review/135234/ прочитал и сразу в гугл — php code analyzer — ссылка в ответе выше — первая :)
    Ответ написан
    3 комментария
  • Прошу конструктивной критики на мой код на PHP

    По заданию:
    У класса ApacheLogAnalyzer слишком много ответственностей и жёстких связей:
    — читает данные из лога (пускай через ApacheLogReader, но всё равно);
    — анализирует их;
    — пишет их в БД (пускай через MysqlLogDataWriter, но всё равно)

    При этом нет никакой явной необходимости инстанцировать ApacheLogReader и MysqlLogDataWriter в ApacheLogAnalyzer. Так же не вижу необходимости инстанцировать mysqli в MysqlLogDataWriter, да и вообще лучше PDO, как указали выше.

    Можно сделать без сильного рефакторинга что-то вроде
    $reader = new ApacheLogReader('access.log'); 
    $db = new PDO('mysql:dbname=fl;host=localhost', 'fl', 'fl'); // @todo Обработка ошибок
    $writer = new PDOLogDataWriter($db); 
    $analyzer = new LogAnalyzer($reader, $writer);
    ...
    

    Так мы получим более гибкую и легче тестируемую архитектуру практически без накладных расходов и больших изменений. А учитывая специфику (методы ридера и райтера вызываются только в одном месте анализатора), можно сделать
    $reader = new ApacheLogReader('access.log'); 
    $log_elems = $reader->getLogElems();
    $analyzer = new LogAnalyzer($log_elems);
    $data = $analyzer->getAnalyzedData();
    $db = new PDO('mysql:dbname=fl;host=localhost', 'fl', 'fl'); // @todo Обработка ошибок
    $writer = new PDOLogDataWriter($db); 
    $writer->write($data);
    

    вообще избавившись от этих зависимостей в анализаторе и сделав его ещё легче тестируемым, но тоже без глобальных изменений

    Можно пойти ещё дальше, реализовать кучу интерфейсов и паттернов, и сделать анализатор вообще не зависящий ни от источника данных и их формата, ни от места их записи и формата, ни, даже, от метода анализа, но это уже будет, наверное, «ООП головного мозга» и преждевременное абстрагирование :)
    Ответ написан
  • Является ли $ оператором в php?

    Хотя по функциям он близок к оператору разыменования указателя, считать его оператором нельзя. Просто элемент синтаксиса имени переменной.
    Ответ написан
    Комментировать
  • Как упростить разработку на php новичку?

    Прежде всего начните использовать VCS (системы контроля версий), например Mercurial. Git тоже пойдёт. :) Чтобы когда сервер упадет судорожно не вспоминать что и где исправляли в последний раз, а просто откатиться почти моментально на последнюю рабочую версию, а потом спокойно разбираться.

    Организуйте минимум двухступенчатую систему разработки — окружение разработчика (локально или на отдельном сервере/поддомене) и продакшен окружение, куда скрипты заливаются после хоть какого-то тестирования — правка файлов на рабочем сервере (или заливка их туда без тестирования хотя бы на синтаксис основного потока) очень плохая практика.

    Откажитесь от использования ftp, да и других методов ручного деплоя, используйте ssh/scp/rsync и скрипты деплоя (самописные или, например, Capistrano). Как вариант, используйте средства VCS — с рабочего каталога коммитите изменения в репозиторий, на сервере мержите их оттуда с веб-каталогом, главное не забыть закрыть доступ из веба к служебным файлам VCS. Можно использовать хуки для второго процесса, но лучше все же контролировать его.

    Используйте хотя бы примитивные миграции БД, не изменяете структуру БД «ручками» в phpmyadmin, а запускайте sql скрипты. Потом сможете хотя бы восстановить последовательность действий приведших к краху. И бэкапы БД даже перед незначительными изменениями схемы. То же к настройкам сервера (их тоже лучше хранить в VCS).

    Современные IDE почти всё это позволяют делать через GUI, но сначала, имхо, лучше разобраться как оно работает в консоли.

    Всё вышеизложенное написано на основании собственного горького опыта.
    Ответ написан
    2 комментария