Задать вопрос
  • Как лучше спроектировать базу данных?

    @Vitsliputsli
    delongeroman,
    в таблице заказчик будет id заказчика и через цикл перебором он будет искать этот же id в другой таблице и подставлять значения при совпадении, либо сделать связь через внешний ключ

    Через внешний ключ. Целостность БД должна контролировать СУБД, т.е. все по классической работе.
    Отказ от внешних ключей и перенесение контроля целостности в app возможен только тогда, когда вы понимаете что делаете и зачем. Раз задаете здесь вопрос, то это точно не ваш вариант.
  • Как правильно юзать уже заполненное статичное свойство?

    @Vitsliputsli
    App это разновидность Error?

    именно так, он также используется для реализации интерфейса Throwable

    У вас App базовый класс в точке входа, он устанавливает коннект к БД, причем здесь Error?! Вопрос не в том, как вы его используете, а зачем вы так его используете. Принцип single responsibility запрещает подобное надругательство, как смешение всего в одном.
    Зачем передавать объект Error в конструктор? Ошибки генерируются путем выбрасывания Exception и соответствующий объект Throwable будет сгенерирован в месте выбрасывания. Что это за божественный класс Error, что вы хотите везде его всунуть?

    любой голый фреймворк генерит у меня страницу примерно 0.1 сек, у меня авторизованный скрипт с примерно около десятка запросов генерит страницу за 0.005, да мне и не нужен фв на 50 мегабайт, у меня скрипт весь с графикой около 5-ти мег

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

    @Vitsliputsli
    Иван Иванов, как уже написали:
    class App extends Error - На человеческий переводится как мой App сплошной Error.

    Если App наследует класс Error, значит App это разновидность Error. Ваше приложение разновидность ошибки? Причем здесь конструктор и что за класс AppException? Наследование подразумевает родство классов, а не просто объединение произвольных кусков кода. Только так, иначе код превратится в бессвязную мешанину.

    установил бы какой-либо из популярных фреймворков
    тяжёлые, про фалкон читал, но не вникал сильно

    Тяжелые, потому что так говорят? Или у вас highload решение и вы боретесь за доли секунды?
  • Как исправить ошибку 403 при подключении к WebSocket?

    @Vitsliputsli
    И к тому же, ws - это нешифрованное соединение, для шифрованного используется протокол wss.
  • Как определить что сервер именно локальный?

    @Vitsliputsli
    PHP_OS (string) - Операционная система, под которую собирался PHP.

    Когда собирается и компилируется код, это делается под определенную ОС, т.к. исполняемый код будет разный на разных системах.

    Вот у меня OSPanel стоит, мне подойдёт, если я эту константу заюзаю?

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

    @Vitsliputsli
    Иван Иванов, есть же нормальный ответ, сделайте переменную окружения и в ней храните тип окружения. Неполучается использовать переменные окружения, сделайте переменную в конфигурации проекта.
    Вариант DIRECTORY_SEPARATOR даже комментировать не буду.
    REMOTE_ADDR === '127.0.0.1' тоже самое, нельзя использовать для определения чего-то, переменные это не определяющие, иначе все будет печально.
  • Где расположить шаблоны модуля что ли?

    @Vitsliputsli
    Иван Иванов, mvc - это разделение логики на контроллеры, представления и модели, а не хранение файликов в определенных каталогах.
    Т.е. если у вас проект выглядит так:
    project/IndexController
    project/IndexView
    project/IndexModel
    project2/IndexController
    project2/IndexView
    project2/IndexModel
    это нисколько не нарушает MVC (при условии что это не просто названия файлов, а там действительно есть деление на модели, контроллеры и представления). Не удобно будет работать, когда кодовая база будет расти - да, но не нарушает mvc.
  • Где расположить шаблоны модуля что ли?

    @Vitsliputsli
    Иван Иванов, как написал FanatPHP это не такой строгий или принципиальный вопрос. Просто когда проект большой необходимо его дробить на более мелкие куски, чтобы не потерять контроль. Если модуль слабо связан с остальным кодом, то логично его положить отдельно от всего остального, чтобы не обращать на него внимания, когда не работаешь с ним. Поддиректорий в controllers может много и просто для логической группировки, поэтому я и предложил положить совсем отдельно. По-большому счету с опытом придет понимание, как удобнее, главное чтобы это было удобно не только для вас, но и для любого другого.
  • Как создать таблицу с двумя колонками обязательно разного значения?

    @Vitsliputsli
    Либо триггер в более ранних версиях. Либо не на стороне СУБД.
  • В чем разница между dependency injection и методом, который возвращает тип класса?

    @Vitsliputsli
    Roman Kitaev, именно так. Но согласитесь, это совсем не то, что происходит в том же самом js. Т.е. есть языки без типизации (крайний случай слабой типизации, ее отсутствие), например ассемблер, где, например, есть байт, который не имеет никакого отношения ни к char, ни к int, это просто байт. Есть слаботипизированные языки, например Си, где мы можем создать char, положить туда '1', а потом обратиться к нему как к int и получить 49 (индекс символа '1' в ASCII). Собственно об этом вы и написали. Но совсем иное в языках с динамической типизацией, там нет такого вольного обращения с типами, int всегда int, string всегда string. Да, когда вы в js напишите '1' + 5, то получите '15', но не потому что типизация слабая, а потому что int 5 будет переведен в string по правилам языка и будет выполнена конкатенация строк. Я не вижу здесь никакой слабой типизации, все типы четко выражены, и вы не сможете так вольно обращаться с данными как в Си. Я так понимаю, что из-за безграмотного перевода сильную типизацию называют строгой и зачем-то примешивают сюда строгое сравнение, как например в php, сравнение без приведения типов. Но типизация и сравнение с преобразованием типов или без, это совсем разные вещи.
  • В чем разница между dependency injection и методом, который возвращает тип класса?

    @Vitsliputsli
    Roman Kitaev, т.е. по такой логике, слаботипизированный Си, при "1" + 5 получит результат похожий как в JS?
  • Как оптимизировать запрос для большого объёма данных?

    @Vitsliputsli
    А что вы хотите делать циклом?
    Вообще для оптимизации нужно как минимум видеть план.
    Но если наугад - то очень сомневаюсь, что все подзапросы возвращать по 10 строк, а значит используйте join.
  • Как сделать вывод из базы данных используя PDO?

    @Vitsliputsli
    "почему-то не выходит", как и "ничего не работает" - очень не информативно.
    При описании ошибки пишут: что делали, что получили, что ожидали получить.

    Как минимум, посмотрите что у вас в $data с помощью var_dump, и должно стать понятно в чем проблема.
  • Как LEFT JOIN-ом присобачить только одну сроку, причем не любую, а наибольшую по данному полю?

    @Vitsliputsli
    В общем случае:
    select 
                    user_id, max(phone) phone_max
                from phones 
                group by user_id

    замените на:
    select
            ph.*,
            ph_max.phone_max
        from phones ph
        join (
            select 
                    user_id, max(phone) phone_max
                from phones 
                group by user_id
        ) ph_max on ph.user_id=ph_max.user_id and ph.phone=ph_max.phone_max

    Если СУБД позволяет можно использовать аналитические функции.
  • Как исправить логическую ошибку в использовании флагов?

    @Vitsliputsli
    в переменной стринг либо строка, либо false.

    if ($string===false)
    {
        // Какие-то действия, если false
    } else {
        // Какие-то действия, если все остальное
    }

    это в простом случае, если вдруг придет true, он обработается как строка. Если такое недопустимо, добавьте эксепшенов для отлова некорректных данных.
    И хотя динамическая типизация позволяет, лучше не использовать разные типы в одной переменной.
  • Как LEFT JOIN-ом присобачить только одну сроку, причем не любую, а наибольшую по данному полю?

    @Vitsliputsli
    Использовать подзапрос таким образом не очень хорошая идея, т.к. для каждого пользователя будет осуществляться новое обращение ко 2 таблице.
  • PostgreSQL создания одного индекса для нескольких колонок одного типа?

    @Vitsliputsli
    P747, составной индекс сделать можно 2 способами:
    1) Column1+Column2;
    2) Column2+Column1;
    В 1 варианте, если будете искать по Column1 оптимизатор выберит этот индекс и будет его использовать частично, только по полю Column1. Но если нужно искать только по Column2 этот индекс уже не подойдет.
    2 вариант то же самое, только для поля Column2.
    Цель составного индекса Column1+Column2, это поиск по Column1, а в найденном поиск по Column2.
  • Одновременная покупка товара?

    @Vitsliputsli
    twobomb, наверное вы правы, и это печально.
  • Одновременная покупка товара?

    @Vitsliputsli
    twobomb, не гребите всех под одну гребенку. На мало-мальски нагруженной системе - это вполне реальная ситуация. На системе нагруженной - такая ситуация проявляется постоянно. Но даже в случае слабо нагруженной системы, денежные операции должны быть защищены от подобных ошибок.
  • Одновременная покупка товара?

    @Vitsliputsli
    RxR, покупка товара как синхронная операция - это единственное решение. Другое дело с запросами. Либо блокировка и ожидание, либо, как писал Иван Шумов добавление идентификатора состояния, и отказ, если состояние изменилось, либо очереди. У каждого решения есть свои минусы и плюсы. Выбирать нужно исходя из того, что вам крайне важно, а чем можно поступиться.