Задать вопрос
  • Как правильно использовать функцию unserialize?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Учитесь формулировать вопросы. Думайте над ними. Когда вы сможете правильно сформулировать вопрос, к вам придёт понимание, как искать нужную вам информацию без попыток добиться от людей написания кода за вас.
    Вопрос у вас называется "Как правильно использовать функцию unserialize?", а дальше вы хотите узнать как получить данные из БД. Это называется "каша в голове". Нужно от неё избавляться и всё станет хорошо, и разбираться будет проще.
    Ответ написан
    4 комментария
  • Можно ли работать программистом после 9 классов?

    @kirill-93
    Никто не смотрит на образование, кроме гос. учреждений. В некоторых вакансиях есть вопрос о высшем, но несмотря на это, принимают без него, а если укажешь, что оно есть - поверят наслово.
    Ответ написан
    6 комментариев
  • MVC, правильно ли таким образом инклюдить модель и view в контроллер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Дайте ссылку на "канонический" образец MVC


    MVC образца 1979-ого года (канонический) подразумевает то, что контроллер ничегошеньки не знает о view. Он ловит события с инпутов и конвертит асинхронные действия пользователей в вызовы методов модели. Имеется в виду модель нашей логики, модель приложения, не обязательно один класс но целая иерархия которая сама может включать сколько угодно слоев и иметь сколь угодно большую сложность. Контроллер детали реализации модели вообще не парит, инкапсуляцию для этого придумали.

    Так вот, View же напрямую подключается к модели и через обсервер подписывается на обновления состояния модели, и в случае оного актуализирует себя под текущее состояние.

    Ну это если мы говорим про олдскульный MVC который в чистом виде никто не применяет уже лет 15-20. Ну и на бэкэнде в этом нет особо смысла так как модель в рамках одного запроса-ответа поменяться дважды у нас не должна. Просто пробрасываем все необходимое текущее состояние во view и все хорошо.

    В целом у нас всеравно есть зависимость view от модели, что не ок. Потому чуваки придумали Model View Adapter (можно считать это вариацией MVP но есть нюансы).

    Суть такая. В качестве адаптера сделаем контроллер, который будет получать данные формата UI (HTTP запрос в нашем случае) и будет генерировать данные для UI (HTTP ответ опять же). То есть задача контроллера сводится всего-лишь к тому что бы получить запрос, дернуть метод модели (один в идеале) и сформировать ответ.

    Итог - полная независимость представления от модели и модели от представления. Конвертацией форматов орудует адаптер (в нашем случае это GRASP контроллер). Причем мы можем выстраивать целую цепочку адаптеров (концепция мидлвэров на этом строится), которую потом можно свести к одному главному фронт-контроллеру. Ну и подходит это не только для HTTP но и для всяких там MQ/CLI и других вариантов интерфейсов которые могут пригодиться в будущем (а могут и не пригодиться).

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

    Ну и про буферизацию вывода не забываем.

    p.s. хватит писать велосипеды, вы всеравно из этого усвоите мало чего. Возьмите какой-нибудь микрофреймворк, что бы можно было и в нутрах покопаться, и бойлерплейт пописать, и на основе уже готового подумать почему там так сделано.
    Ответ написан
    Комментировать
  • MVC, правильно ли таким образом инклюдить модель и view в контроллер?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    По хорошему у вас require_once должен быть 1 раз указан в проекте, причем он должен загружать автозагрузчик composer.

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

    Посмотрите Symfony, Silex
    Ответ написан
    Комментировать
  • Как записывать рефералов в БД по счетчику?

    petermzg
    @petermzg
    Самый лучший программист
    А зачем записываться за пригласившим?
    Добавьте в таблицу пользователей поле указывающее на пригласившего.
    Ответ написан
    9 комментариев
  • Как сделать отправку формы через ajax без удаления post?

    зачем ты делаешь обработку формы аяксом, если потом пишешь
    window.location.replace("http://localhost/BDsteam.php");

    ?

    Предполагаю, что на print_r ты смотришь уже после этого самого реплейса, при котором запрос проходит методом GET. Не удивительно, что $_POST массив пуст.

    Если я неправ, расскажи подробней
    Ответ написан
    5 комментариев
  • Cron каждый час в определенное время?

    Spetros
    @Spetros
    IT-шник
    Первый вроде верно.
    Во втором диапазон иначе нужно указывать
    21-23,0-9
    Ответ написан
    1 комментарий
  • Как заданы стороны света, по умолчанию (север, юг...) в игре?

    @JuniorNoobie
    Сижу в поддержке, пишу мелкие проекты
    Насколько помню это география класс третий - пятый "ориентирование по картам" или как-то так... Принятые во всем мире значения по-умолчанию: север вверху, юг - внизу, запад - слева, восток - справа, если не указано обратное :-)
    Ответ написан
    2 комментария
  • Как сверстать такое меню (адаптив)?

    svistiboshka
    @svistiboshka
    живые веб интерфейсы
    Не забудь взять плагин https://github.com/kamens/jQuery-menu-aim
    ну и главное меню может начинаться с
    #sideMenu {
    position: fixed;
    width: 190px;
    height: 100%;
    ......

    Если нужно вообще на всю высоту то просто pos:abs; h:100% в body
    если же на высоту viewport то js -> window.height -> inline style
    Ответ написан
  • Где взять цену российской нефти на мировом рынке в формате xml/json?

    @achuraev Автор вопроса
    Ответ написан
    Комментировать
  • Как такие темплэйты админки помогают разработчикам?

    @IceJOKER
    Web/Android developer
    А как используют обычные шаблоны? Тоже самое, только шаблон специфичный для админки, удобно и красиво
    Ответ написан
    Комментировать
  • Как определить провайдера при авторизации через соц сети?

    allard
    @allard
    Серийный программист
    Попробуйте вот так:
    http://oauth.vk.com/authorize?client_id=3333333&redirect_uri=http%3A%2F%2Fmysite%2Findex.php%3Fdo%3Dauth_social%26provider%3Dvk%26response_type%3Dcode

    Вы пытаетесь передать url в urle.
    Для аргументов url в php используйте php.net/manual/ru/function.urlencode.php
    Ответ написан
    2 комментария
  • Верстать без фреймвороков это значит быть не професионалом?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Быть профессионалом - значит знать и правильно применять необходимые инструменты для наиболее эффективного решения задачи. А также НЕ применять, если в этом нет необходимости.
    Ответ написан
    4 комментария
  • Есть ли решение для пагинации древовидных комментариев?

    saDam
    @saDam
    Microservices, .NET Core, EF Core, SQL, RabbitMQ,
    Во первых ну нужны две таблицы это бред, все что вам нужно это поле ParentId, это поле внешнего ключа на Id комментария выше стоящего уровнем.
    У вас в базе получается примерно такие строки:
    Id: 1 ParentId: null,
    Id:2 ParentId: 1,
    Id:3 ParentId: 1,
    Id:4 ParentId: null,
    Id:5 ParentId: 4

    Что видно из данной структуры:
    1. Что все сообщения 1 -го уровня имеют ParentId == null.
    2. В каждом сообщении нужно ввести поле CreateDate, в которое будет писаться время создания сообщения(НЕ ПУТАТЬ С ВРЕМЕНЕМ РЕДАТИРОВАНИЯ, если такое возможно). Это поле вам пригодится чтобы сортировать самые свежие сообщение (ORDER BY DESC и TOP 3 вам в помощь).
    3. При первой прогрузке страницы вам нужен запрос в бд ТОП 10 где ParentId == null, и для каждой такой взять TOP 3 предварительно отсортированных ORDER BY DESC CreateDate.

    Что делать с кнопкой подгрузки комментариев:
    Вам нужен бекэнд метод, который будет принимать ParentId и номер страницы, если вы подгружаете комментарии первого уровня то ParentId будет null, если второго уровня, то у вас будет приходить Id базового комментария. Ну и второй момент это номер страницы, тут ничего сложного.

    Что нужно не забыть в бекэнде такого метода:
    Пропуск уже отображенных комментариев при первой прогрузке, если идет речь о комментариях первого уровня(ParentId == null), то вам нужен Skip(10), если второго уровня то Skip(3).

    На что стоит обратить внимание:
    Не забывайте что у вас все время добавляются комментарии, если вы на момент прогрузки брали 3 самых свежих коммента, то нужно учитывать, что к моменту нажатия прогрузки еще 10 новых комментариев, уже могли накомментировать новых три и тогда вы возможно опять прогрузите эти же три сообщения в какой то момент. Как проблему решать? Тут зависит от того как у вас должно все работать, вы можете в метод передавать дополнительную Id последнее сообщения и брать TOP(10) где дата < комментария найденного по Id. Либо если вам нужно прогружать и новые, то тут уже посерьезней нужно что то думать, либо кнопкой подгрузки новых сообщения, либо проверить при прогрузке есть ли новые итп... Тут нужно ваше решение.
    Ответ написан
    1 комментарий
  • Первое приложение на javascript или как начать?

    Denormalization
    @Denormalization
    Тут недавно интересовались аналогом select2 без jQuery зависимости. Сделайте.
    И вам практика, и народу польза.
    Ответ написан
    4 комментария
  • Почему PHP не проходит условие, возвращающее 1 (TRUE)?

    Denormalization
    @Denormalization
    Кто этот бред писал?
    Что вот это:
    if (@$given[$i] && ($given = $given[$i]) || $j++ && !($i = 0))

    Должно делать?

    PS
    Ок, проблема понятна. Преркатите писать такой кривой код, тогда и подобных проблем не будет.

    Внимательно смотрим сюда:
    <?php
    
    $j = 0;
    
    if ($j++) {
        echo 1;
    } else {
        echo "Else:", $j;
    }


    И читаем про php.net/manual/ru/language.operators.increment.php
    Ответ написан
    6 комментариев
  • Можно ли получить скриншот google карты по координатам?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Не знаю как у Гугля, но можно у Спутника
    api.sputnik.ru/maps/static_api
    А вот есть визуализатор osmz.ru/bbox/sputnik.html
    ?width=340&height=224&z=16&clng=40.35327
    Ответ написан
    Комментировать
  • Rак правильно организовать списание баланса?

    Melkij
    @Melkij
    PostgreSQL DBA
    InnoDB все запросы выполняет только в транзакции. Если открытой транзакции не было, то этот запрос неявно оборачивается в транзакцию.
    Вот только сами по себе транзакции не помогут, надо ещё правильно ими пользоваться. Тут я бы хотел дополнительно обратить внимание Андрей:
    Попробуйте в двух терминалах написать:
    сначала begin; в обоих
    потом select из таблички. Значения одинаковые, правда?
    потом update этой же таблички, сделайте set fieldname = разные значения в терминалах. Второй терминал запрос принял, но не вернул управление, верно?
    потом commit; в первом терминале. update из второго терминала сразу же ответил OK.
    Теперь сделайте commit во втором терминале и посмотрите, что произошло с данными. Это то, на что вы рассчитывали? Или всё-таки не совсем?

    N пользователей запрашивают услугу одновременно, корректно ли произойдет списание средств?

    Нет, некорректно, если только вы не в одной транзакции и не читаете баланс специально с select .. for update.
    Потому что для выполнения действия $this->balance -= $sum; у вас уже должен быть известен баланс, но это ещё не операция записи.
    В итоге у вас было 1000 рублей.
    Пришёл один клиент, прочитал баланс, хочет списать 200 рублей. Обновил циферку в PHP, никто ему не мешает.
    Пришёл второй клиент, прочитал баланс, хочет списать 100 рублей. Обновил циферку в PHP, никто ему тоже не мешает.
    И на шаге save оба отправили запросы на update: один клиент считает, что на балансе осталось 800 рублей, второй - что 900.
    Сколько запишется на баланс? 800 или 900, как повезёт. Правильно ли это? Сколько должно было быть? 700 ведь.
    Потому что клиенты не мешали друг другу обновлять циферку в PHP.

    Как же заставить клиентов не делать глупости?
    В простом случае:
    update tablename set balance = balance - :amount where balance >= :amount and user_id=:uid
    И на приложении проверять affected_rows. Если строка изменена - у пользователя достаточно денег, платёж прошёл. Если изменённых строк нет - вероятно, у пользователя нет столько денег. СУБД разберётся с очерёдностью исполнения и в результате на балансе будет правильная сумма, сколько бы параллельных запросов ни пришло. И, что не менее важно - приложение ответит на все запросы корректно, кому денег хватило, а кому - уже нет.

    В более сложных случаях - можно самому попросить СУБД взять блокировку на строку, о чём чуть ранее я уже заикался:
    begin;
    select balance from tablename where user_id=:uid for update; -- все параллельные транзакции будут выстраиваться в очередь здесь
    /* произвольные запросы (в mysql кроме вызова хранимок, DDL - они делают неявный коммит). Среди этих запросов - обновляете баланс */
    commit; -- только здесь эта транзакция освобождает блокировку select .. for update и с этой строкой начинает работать следующий запрос

    Как вообще работать с деньгами и делать это правильно - Кирилл даёт правильное направление. Изучите, как это делает бухгалтерия, за многие десятилетия работы они придумали, как обходить много странных граблей.
    Ответ написан
    2 комментария