Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Таблица отношений пользователей. Как правильно?

    socengel
    @socengel
    7 лет native php в продакшене, онлайн 20000+,
    Правильная таблица отношений:
    Отмечу на всякий случай никаких id(самих записей) не должно быть! все выборки по ключам приведенным ниже
    user_id|friend_id|relation_id|date(timestamp)
    222|444|1|ts
    444|222|2(не просто дружит а например встречается, женат, и т.п. для каждого случая свой уникальный id)|ts

    первичный ключ составной (user_id,relation_id)
    дополнительный ключ (friend_id, relation_id)

    если кидают заявку создается 1 запись user_id>friend_id>0

    проверка на поступившие заявки friend_id(current_user_id) | relation_id = 0

    подтверждение: (должна быть транзакция!) то есть если отвалится один из запросов нужно вернуть все как было.
    на MyISAM ручками(средствами PHP проверяем). На innodb делаем транзакцию средствами БД.
    вписываем строчку с подтверждением курент_юзер > фриенд_ид > relid - 1 и обновляем основную заявку до единицы. Повторюсь если одна из команд не пройдет надо все откатить.

    если отказ то удаляем основную заявку из базы.

    по поводу дополнительных отношений:
    кинуть заявку можно только пользователю у которого взаимно стоит 1 и проверка собственно на заявки
    friend_id(current_user_id) | relation_id >(больше) 1.
    Остальной алгоритм тот же. одновременно у 1 пользователя может быть только одна запись с отношением больше 1 (желательно, это как индикатор именно личного отношения, для группировки друзей лучше все же завести отдельное поле)
    Описание с реальной базы данных на 30 миллионов пользователей.
    Ответ написан
    Комментировать
  • Узнать ip адрес soap клиента?

    @krypt3r
    $_SERVER['REMOTE_ADDR']
    Ответ написан
    Комментировать
  • Как вывести картинку из базы?

    benbor
    @benbor
    Помог ответ - не забудь лайкнуть
    1. Кладете еще одну картинку в корень сайта
    2. Открываете инспектор элементов, вкладочку сеть
    3. Загружаете site.my/picture.jpg
    4. Загружаете site.my/my_script.php который должен вернуть вам картинку
    5. Смотрите, сравниваете, чего не хватает, что лишнее. Браузеру фиалетово, что вы там на сервере делаете, он смотрит только Response, вернете в PHP точно такой Response как и без PHP и будет вам счастье
    PS FanatPHP плюсую
    Ответ написан
    1 комментарий
  • Как перенести крупное PHP приложение на Python?

    kotomyava
    @kotomyava
    Системный администратор
    Если у вас возникает такой вопрос, вероятно, необходимо забросить эту идею, и приводить в порядок проект, не переписывая его на python...

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

    Структура базы не меняется => кардинально не поменяются и запросы, а значит, и время их обработки не изменится. А это, обычно, куда более узкое место.
    Ответ написан
    5 комментариев
  • Как бороться с дублированием идентификаторов в многопользовательском приложении без использования на уровне таблицы?

    nazarpc
    @nazarpc
    Open Source enthusiast
    Зачем запрашивать максимальный id? Сделайте поле AUTOINCREMENT, и оно будет без конфликтов инкрементиться само.
    Ответ написан
    Комментировать
  • Как сделать простенькую MVC модель в php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Итак, займемся переводом для начала

    на главной создаю объект:

    В точке входа/во фронт контроллере. Объект этот завется маршрутизатор или раутер. Имеет отношение к MVC - нет.

    вот что в файле hello.class.php:

    Такое именование файлов и классов было модным во времена php4. Отройте для себя PSR0 (и еще отдельно про PSR-4 можете почитать).

    Т.е. при обращении по url: site.localhost/hello я вижу hello!!!! на экране.

    Поздравляю вас с первым контроллером... хоть и убогим слегка. Читаем про контроллеры в контексте GRASP

    ну в htaccess я прописал нужную конструкцию

    Верни мне мой 2007-ой, когда все было круто и все хвастались своими ЧПУ на модреврайтах. Подумайте в сторону единой точки входа и перенаправления всех запросов, для которых не нашлось файлов на эту точку входа. Но это так... просто... совет. Это упростит жизнь при миграции скажем на nginx или черокки какой.

    Вот я и поплыл в этих терминах.

    Заходим на википедию и выплываем.

    Model-view-controller - схема использования нескольких шаблонов проектирования, с помощью которых модель данных приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные.


    Советую почитать полную статью и пройтись по ссылкам. Особенно по части модели данных. Это должно прояснить для вас такой момент что модель это модель данных. То есть у вас есть данные, например блог-пост, есть его модель (просто класс Post который имеет поля id, title, body и т.д.). Проще говоря модель это представления данных в приложении. А view - это слой который занимается тем что переводит данные из формата модели в формат запрашиваемый пользователем. Причем вам не запрещается работать из контроллера с базой. Ну то есть как, есть такие вещи как сервисный слой и тонкие контроллеры, но мы же пока только учимся да?). В любом случае модель не должна знать ничего о том где и как она хранится.

    Теперь по поводу view. Давайте вспомним что такое запрос в контексте WEB-приложений. Это старый добрый HTTP запрос. У запроса есть заголовок - Accept который говорит что хочет получить пользователь (пользователи могут быть не живыми и хотеть что-то другое, например JSON). Через него браузер говорит что хочет получить. Например он говорит "хочу text/html" и мы должны выполнить следующие стэпы:
    - вызвать контроллер
    - контроллер достает из закрамов модельки которые хочет пользователь и отдает их во view.
    - view переводит данные из формата приложения в формат который хочет увидеть пользователь.

    В очень грубой форме view может быть таким:
    PostView {
        
        private $post;    
    
        public function __construct(Post $post) {
            $this->post = $post;
        }
    
        public function renderTitle() {
             return sprintf("<h1>%s</h1>", $this->post->getTitle());
        }
        // и еще пара методов    
        public function render() {
             $this->renderTitle();
             $this->renderBody();
        }
    }


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

    Практическое задание:
    Если все что делает контроллер это отдает отрендренный шаблон без какой либо переменной в нем.... Это MVC? Где тут модель?
    Ответ написан
    3 комментария
  • RBAC в Yii, есть у кого визуальный редактор прав?

    Если я не ошибаюсь, то вот есть расширение -> www.yiiframework.com/extension/rights
    Оно под версию 1.1.
    Ответ написан
    1 комментарий
  • Практичное использование orm. Где? Модель? Контроллер?

    AmdY
    @AmdY
    PHP и прочие вебштучки
    В по настоящему сложных проектах лучше не использовать построитель запросов в контроллере, все нужно делать в моделях. При этом даже модель принято разделять на чистую модель и репозиторий который таскает данные.
    То таких проектов мало, обычно достаточно вашего второго способа, только нужно отвязываться от имени класса заменив его на static. Есть ещё scope, туда всякие условия засовывать.
    Ну и для многих проектов хватит лапши с квери билдером прямо в контроллере, такие веши потом можно зарефакторить по мере необходимости, благо современные IDE это делают на раз-два.

    ИМХО, заморачиваться не стоит, делайте как удобнее сейчас, а затем через рефакторинг придёте к нужной для проекта форме.
    Ответ написан
    4 комментария
  • SELECT * vs SELECT COUNT(*) vs ... - что быстрее?

    zeromodule
    @zeromodule
    PHP
    А для чего проверить-то?
    Если вы не хотите вставлять дубликаты записей, то повесьте уник и вставляйте с помощью INSERT IGNORE - это будет явно быстрее всяких там дополнительных селектов :)
    Ответ написан
    Комментировать
  • Какая архитектура mysql необходима для создания простой социальной сети?

    viktorvsk
    @viktorvsk
    Взять и создать. Главное, правильно. И побезопаснее. Ну, с лайками можно не очень безопасно. А вот с друзьям - очень безопасно! И, главное, со всеми правильно это сделать!
    Ответ написан
    Комментировать
  • Где научиться работать с composer?

    @andreyqin
    То есть вы предлагаете поискать за вас? Полно статей как на русском, так и на английском, в чем проблема?
    Ответ написан
    3 комментария
  • Не работает подключение файлов в PHP. Как настроить?

    @maxyc_webber
    Web-программист
    у меня машина не заводится. я думаю потому что руль кривой.

    подробнее опишите что значит не заводится?
    Ответ написан
    7 комментариев
  • Что нужно знать, чтобы стать хакером?

    BelBES
    @BelBES
    Самая главная книга для будущего Хакера - это Уголовный Кодекс, имхо.
    Ответ написан
    7 комментариев
  • Как правильно писать php вставки в tpl файлах?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Код выше вполне нормальный. Последние две строчки можно объединить, на работе скрипта это не скажется. Но тут есть один момент. Шаблон - это обычно html-текст, и php-инструкции в нём чужеродные (с точки зрения html), и даже расширения таких файлов обычно делают не .php, а .phtml - чтобы подчеркнуть, что это не php-скрипт с кодом. Поэтому в таких случаях используют специальный формат записи php-инструкций, причём обычно пытаются одну команду расположить в одну строчку, и не смешивать php и html в одной строчке. С этой точки зрения лучше не объединять эти две строчки в одну инструкцию php.
    Я обычно не пишу скобки, как в коде выше, я использую второй вариант открытия и закрытия блоков, без фигурных скобок:
    <div id="container">
    <?php if ($count>0): ?>
        <?php foreach($items as $item): ?>
            <div class="item"><?=$item?></div>
        <?php endforeach ?>
    <?php endif ?>
    </div>

    Но лучше поиграйтесь с этим вариантом и переходите на внешний шаблонизатор, например Twig. (вот есть урок по его встраиванию в сайт без фреймворка)
    Ответ написан
    1 комментарий
  • Обнаружил sql- уязвимый код. Какие возможности? Как воспользоваться?

    mlnkv
    @mlnkv
    JavaScript Developer
    Как воспользоваться? Сообщить разработчикам.
    1322909705_karma1.jpg
    Ответ написан
    Комментировать
  • Какую выбрать CMS на PHP?

    @kaasius
    Вы описали CMS по имени "любая"
    Ответ написан
    1 комментарий
  • Как на сайте запретить сканирование в 2ip.ru?

    @Anbit
    web разработка
    отключить интернет :)
    Ответ написан
    Комментировать
  • Безопасно ли открывать схему проверки входных данных сайта?

    Melkij
    @Melkij
    PostgreSQL DBA
    Какая связь между регуляркой и XSS?
    На стороне пользователя - валидация логики. На стороне сервера - повторная валидация логики и соответствующее экранирование/преобразование для сохранности и безвредности этих данных. Если в БД сохранение - prepared statements, вывод в HTML - htmlspecialchars, вывод в JSON - json_encode, вывод ещё куда - соответствующие преобразования для этого конкретного формата.
    Ответ написан
    1 комментарий
  • Какие есть фреймворки для PHP для работы с XML?

    kompi
    @kompi
    nullstack devoops
    Вы бы лучше написали, чем вас не устраивает целый букет стандартных инструментов для работы с xml.
    Ответ написан
    Комментировать