Ответы пользователя по тегу PHP
  • Как сделать вывод значений из баз регионов и городов в древовидной последовательности?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Не надо никаких джойнов в данном случае.

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

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    echo '<b>'.$user.'@'.$host.':'.($pwd=='/home/'.$user?'~':$pwd).'#</b> ';
    Ответ написан
  • Как исправить строку в переменной foreach и поделить ее на число?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    В принципе смарти позволяет выполнять многие фунации пхп напрямую (зависит от версии), например можно попробовать такой код {floor(floor($module_data.PRODUCTS_PRICE*100)/10000)}
    Ответ написан
    Комментировать
  • Как по-нормальному вытащить smarty переменную в php код?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Дело в том, что смарти - это шаблонизатор, т.е. он отвечает за представление (рендеринг) данных перед отдачей в браузер и его работа обычно начинается тогда, когда работа контроллера уже завершена. Именно по этой причине прямых путей передачи чего-либо из смарти обратно в код не предусмотрена, т.к. оно не нужно обычно.

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

    В общем я категорически не рекомендую пытаться что-то передавать из смарти обратно в код, только если это не отрендеренный шаблон, например, письма, который рендерится до завершения работы контроллера. Во всех остальных случаях односторонний поток данных обязателен.
    Ответ написан
    Комментировать
  • O'reilly smarty шаблон, почему не грузит шаблон в браузере?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Так смарти не может найти шаблон по указанному пути C:/Program Files/EasyPHP-DevServer-14.1VC9/data/localweb/temp/index.tpl, т.е. надо файлик index.tpl закинуть в папку C:/Program Files/EasyPHP-DevServer-14.1VC9/data/localweb/temp/

    Файл в приложении к делу прямого отношения не имеет, проблема не в нём.
    Ответ написан
    Комментировать
  • Почему sleep() ведет себя странно?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Перед sleep закрывай сессию и не будет такой шняги.

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

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

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Я много, долго и упорно делал на jQuery+Vanilla JS сложные динамические формы, которые строил генератор по мета-данным.

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

    К тому же прямые манипуляции на DOM для меня стали еще большим злом.

    В общем от jQuery как основного движка на фронтенде я отказался категорически, сейчас плотно изучаю React+Redux и ище с ними, предварительно проведя исследования по основным мейнстримовым фреймворкам и библиотекам для фронтенда.

    Мне зело симпатишна идея рулить состоянием, а чтобы интерфейс при этом выстраивался автоматически.

    Ну и на бэкенде до кучи решил мигрировать на Node.JS, ибо это позволяет отказаться от веб сервера как обязательного элемента-посредника между фронтендом и бэкендом, к тому же это позволяет хранить активное состояние нативно, что доставляет неимоверно.

    В совокупности с ES-2015 это всё становится приятнее и интереснее.

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

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    За любым фреймворком лежит опыт и мировоззрение его разработчиков. У любого фреймворка есть глубинная философия, его смысл, для чего он создан, какие проблемы решает, в каком контексте. Не смотря на то, что, казалось бы, разные фреймворки решают набор примерно одних и тех же проблем, делают они это очень по разному.

    Несомненно найдется немало людей, способных использовать какой-либо инструмент, не вникая в матчасть и процессы, просто запомнив последовательность "правильных" действий. И это даже будет работать, хотя бы какое-то время.

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

    В реальной жизни, как правило, всегда жмут сроки, дедлайн напирает как лавина, а вопросы, даже будучи решенными, множат новые в прогрессии, и ладно бы в арифметической.

    И вот тут, чтобы действительно справляться, необходимо ПОНИМАТЬ, как это работает, почему так а не иначе, и как с помощью этого решать поставленные задачи. Если чего-то не хватает, или оно работает не так как надо, а это весьма частые явления, то ПОНИМАНИЕ процессов дает свободу РЕШАТЬ эти тупиковые, казалось бы, вопросы.

    Начать что-то лепить на фреймворке, и овладеть им в достаточной степени - это две очень разных вещи. Я категорически отказываюсь верить, что хоть за два месяца, хоть за шесть, можно сколько-то серьезно овладеть инструментом. И дело тут даже не в самом PHP, или там шаблонах проектирования, алгоритмах. Мозг просто не способен в столь сжатые сроки вместить такой огромный контекст, структурировать его и начать в нем свободно ориентироваться. На это нужны годы...

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

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

    Возвращаясь к фреймворкам - освоение фреймворка следует, на мой взгляд, начинать с ознакомления с контекстом, в котором функционирует фреймворк, и с глубинной философией, заложенной в его архитектуру. Только поняв зачем и как, можно надеяться уверенно применять инструмнет в своих целях.

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

    В результате я плюнул на тщетные попытки, и просто, из проекта в проект, собрал свой мини фреймворк, который решает задачи в том контексте, который выработался за годы у меня, решает понятным и прозрачным для меня способом, под полным, 100% контролем с моей стороны.

    Сейчас же я взял паузу, и намерен полностью мигрировать с PHP на JavaScript. При всей моей любви и уважении к PHP, в нем определенные вещи даются слишком большими усилиями, так-что игра не стоит свечей.
    Ответ написан
    1 комментарий
  • В чем суть роутера на php?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Встречал "сайты", где весь код упакован в километровую простыню с кучей if/case, внутри которых и обрабатывались те или иные запросы. В целом это плохо по многим причинам, одна из которых - в интерпретатор при каждом запросе вгружается очень много кода, который надо распарсить и пр., и 99% которого не используется принципиально.

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

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

    Для своего движка я сделал предельно простой роутер, который на входе ждет название модуля и его экшена, которому необходимо передать обработку запроса, причем модуль, по сути - это просто папка внутри папки modules, а экшен - это некая папка внутри папки модуля, т.е. modules/[module]/[action]/[action].php, соответственно модуль/экшен добавляется в проект через создание пары папок и файла. Все остальные параметры ЧПУ передаются в экшен в переменной GET.

    Таким образом все что делает роутер - генерирует путь, и проверяет, есть ли там соответствующий файл PHP, и если есть - подгружает его и передает ему управление.

    Если роутер не получил название экшена и.или модуля, то подставляется default, если по указанному пути файл не обнаружен, то выдается 404. Предельно просто и прозрачно, и всегда наверняка знаешь где и что лежит и как называется и почему.

    Подобный подход практикуется в JavaScript фреймворке Ember.JS, под подходом я подразумеваю весьма жесткие соглашения относительно структуры и именования папок, и файлов проектов.

    Шаблоны в моих проектах точно так же находятся в строго определенных местах и подключаются экшенами автоматически, если тип их выдачи HTML, иначе генерится JSON, или что-то еще, имеется несколько конвертеров на выходе, подключается тот, который запросил экшен.
    Ответ написан
    Комментировать
  • Я хочу хорошую библиотеку на PHP для MySQL. Я зажрался, или такое есть и активно используется?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Я много лет пользуюсь DBSimple Дмитрия Котерова dklab.ru/lib/DbSimple/manual.html
    Очень доволен.
    Ответ написан
    Комментировать
  • Чем вы пользуетесь, sprintf или оператором(точкой) для внедрения параметров в строку в PHP?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Я пользую DBSimple для этих целей, очень удобно.
    Ответ написан
    Комментировать
  • Как заставить цикл отработать 1 раз, не зависимо от запросов пользователей?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Начнем с того, что Вы постоянно опрашиваете один и тот же урл, стало быть этот код не имеет прямого отношения к запросу конкретного пользователя. Тем более раз Вы хотите отдавать одни и те же данные в течении часа всем пользователям, то Вам нужно сделать следующее:
    1) Опрашивать урл по крону, и его выдачу складывать в кеш
    2) По запросу пользователям отдавать данные из кеша

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

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

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Одна проблема, не факт что у юзера ссылка окажется рабочей, т.к. сайт может проверять наличие авторизации при доступе по ссылке на скачивание, а авторизовывался отнюдь не юзер...
    Ответ написан
    Комментировать
  • Почему не собираются данные c API?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    попробуйте вот так

    foreach ($mapping->data as $key->$item) {

    Кстати в представленном JSON нет поля name... может быть надо использовать $key или $item->destination?
    Ответ написан
  • Стоит ли хранить результаты капчи в Cookie?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Вот не вижу в данном случае принципиальной разницы между кукой и сессией. Все равно идентификатор сессии в куке хранится скорее всего...
    Ответ написан
  • По какой логике реализуется переход с мобильной версии на полную и наоборот?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    И, все таки, писк трендов - один универсальный сайт с адаптивной версткой, что для ПК, что для мобильных. Копаем в сторону BootStrap или Zurb Foundation.
    Ответ написан
    Комментировать
  • Как разбить php скрипт на части?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Если уж делать ЧПУ, то по типу /up/rez1/rez2, и да, этим занимается роутер, ну и немного .htaccess магии с RewriteRule...
    Ответ написан
    Комментировать
  • Перенос переменной из одного файла в другой?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    А зачем в коде такие конские отступы?

    М.б. сессии как-то попробовать использовать для эмуляции сохранения состояния?
    Ответ написан
    Комментировать
  • Динамичный сайт без PHP?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    SPA ныне рулит. За выяснением значения аббревиатуры направляю в гугл... :)
    Ответ написан
    Комментировать
  • Какой самый быстрый способ проверить БД на вхождения множества строк?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Текстовый файл 2 мб это не так много. Я бы спарсил текстовый файл в отдельную временную таблицу (даже можно in-memory), а потом от нее делал OUTER JOIN на основную, и в тех строках, которые есть в файле, но нет в основной таблице получил бы NULL, по которому и отбирал бы то, что надо дозалить в основную таблицу.

    Это более-мене адекватный и производительный способ на мой взгляд.

    Разумеется должны быть индексы на соответствующие поля в обеих таблицах, и вот тут, все зависит от нескольких моментов. Во первых, если строки всегда идентичные, но длиннее 32 байт, то есть смысл добавить дополнительные поля в таблицы, загонять туда MD5 хеши строк и индексировать по хешам.

    Если же в строках что-то плавает, например регистр символов, то перед вычислением хэша строки надо приводить к единому виду. Причем в таблицах помимо хэшей хранить можно и оригинальные строки, тут вопрос только о вариантах сравнения.
    Ответ написан
    5 комментариев