Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Куда копать(что читать), дабы написать свою СУБД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Список требований выдаёт голубого мечтателя Манилова с головой.

    На первых порах требования должны быть такие:
    • хранение в файлах - свой формат, наверное

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

    А вообще, настоятельно рекомендую начать с key-value хранилища.
    Ответ написан
    4 комментария
  • Практичное использование orm. Где? Модель? Контроллер?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Основная проблема в том, что у популярных РНР фреймворков нет модели вообще.
    А моделью называется тот самый ORM.

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

    В случае с Ларавелью мы получаем
    • Модели лежит в папке Controllers, при этом используя
      • ORM из папки Models для манипуляции с данными
    • Визуальное отображение лежит в папке Views
    • Секретарша лежит в routes.php.


    Отсюда становится видно, что проблема с квери-билдерами - мелкая и надуманная. И для её решения достаточно применить здравый смысл - если вызов однострочный и читаемый, то дергаем прямо в контроллере. Если посложнее - делаем отдельный метод в "модели".
    Ответ написан
    Комментировать
  • Безболезненная миграция php c 4 на 5?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо просто запуститься на 5-ке и потом тупо пройти по логам, исправляя фатальные ошибки и давя вывод некритичных.
    По моему опыту, основная проблема в передаче аргументов по ссылке. Тут надо просто пройтись по коду и переписать амперсанд с места вызова в определение функции.
    Ответ написан
    1 комментарий
  • Объясните пожалуйста, что за ошибка в функции?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это означает, что ошибка была в запросе.
    По умолчанию mysqli не сигнализирует об ошибках в mysqli_query(). Чтобы заставить её делать это, надо перед коннектом написать волшебное слово:
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Это самый простой, но менее удобный способ, поскольку в сообщении об ошибке нам желательно сразу увидеть и запрос с ошибкой. Поэтому лушче проверять результат запроса, и порождать ошибку РНР с ошибкой mysql и запросом.

    Ошибка в запросе может быть вызвана чем угодно. В частности - мусором, переданным в запрос. Именно поэтому данные для запроса должны форматироваться только перед непосредственным выполнением запроса, а не где-то ещё!

    Поэтому вместо того, чтобы продолжать писать на mysqli ТОТ ЖЕ САМЫЙ УРОДЛИВЫЙ ГОВНОКОДО, что и на mysql, надо использовать более интеллектуальный подход, который будет обеспечивать как форматирование, так и обработку ошибок:
    function get_products($db, $ids, $start_pos, $perpage){
        if($ids){
            $query = "SELECT * FROM sdvd_products WHERE parent IN($a) LIMIT ?i, ?i";
        } else {
            $query = "SELECT * FROM sdvd_products LIMIT ?i, ?i";
        }
        return $db->getAll($query, $ids, $start_pos, $perpage);
    }
    Ответ написан
    Комментировать
  • Структура БД диалогов: как построить?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я бы хранил всю переписку во-первых, в одной ячейке, а во-вторых, тупо дублировал бы её. Это, конечно, расход места, но зато просто.
    Ответ написан
  • Почему не работают правила в .htaccess (как составить RewriteRule )?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    И снова пользователи похапе не в силах отличить файл локальной настройки веб-сервера от проблемы настройки конкретного модуля.

    Отсюда мы видим вопрос, противоречащий своему названию: по заголовку мы справедливо решим, что не работают вообще никакие директивы из-за AllowOverride, а в теле окажется вопрос на составление правил для mod-rewrite.
    Ответ написан
  • Как запретить доступ к папке которая выше?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если я правильно понял задачу, то "уязвимую программу" кладем куда-нибудь в виртуалку, которую, не жалко, со своим веб-сервером, и транслируем запросы к ней курлом.

    Но ответ очень приблизительный, поскольку кого от кого защищать надо, из вопроса совершенно неясно. Чувствуется, что и автор, и отвечатели с трудом отличают посетителя веб-сайта от учетной записи на сервере, под которой запускается веб-сервер.
    Ответ написан
  • SELECT * vs SELECT COUNT(*) vs ... - что быстрее?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как всегда - дурацкий вопрос, да еще и по-дурацки сформулированный, порождает кучу дурацких ответов.

    ЕСЛИ не читать тело вопроса, а отвечать на вопрос из заголовка (а это ключевой момент для Q&A сайта, поскольку тупые поисковики приводят именно по заголовкам. И администрация должна следить за релевантностью оных и вычищать вопросы, которые автор не в состоянии сформулировать), то ответ однозначный - за выборку ЗАПИСЕЙ только для того, чтобы ПОСЧИТАТЬ их, дают пожизненный эцих с гвоздями. Считать должна база!

    ЕСЛИ отвечать на вопрос вне контекста вставки, а только глядя на запросы, то ответ - ОДИНАКОВО. В обоих случаях никакого подсчета нет а есть только выборка по ключу.

    ЕСЛИ вникать в контекст задачи чуть глубже, то появляются варианты ускорить МНОЖЕСТВЕННУЮ проверку, такие как prepared statements (тот редкий случай, когда их фича с множественным исполнением может выстрелить).

    ЕСЛИ вникать в задачу окончательно, то правильным будет ответ @zeromodule. Причем вставку надо либо делать множественную, по тысяче записей, либо заворачивать в транзакцию - поскольку ОБНОВЛЕНИЕ ИНДЕКСА при таком количестве вставок начнет тормозить работу куда сильнее, чем нищасные селекты, столь пугающие аффтара. И опять же использовпать prepared statements.
    Ответ написан
    Комментировать
  • PDOStatement::bindParam - почему не получается биндить через foreach?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Открываю стрррррашный секрет:

    $stmt = $this->db->prepareQuery( 'insert ignore into `xref_tags` ( `tag_id`, `post_id` ) values( ?, ? )' );
    $stmt->execute(array( $tagId, $postId ));
    Ответ написан
    Комментировать
  • Как реализовать механизм очистки кэша?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Насколько я вижу, этот кэш на 99% кэшрует то что не нужно кэшировать.

    Рекомендую сначала научиться работать с БД, и отладить работу с ней, чтобы в 99% случаев кэш не требовался вовсе.
    После этого отпрофилировать приложение, понять узкие места, и оптимизировать их.
    И только после этого, если даже разумная оптимизация не помогает - начинать что-то кэшировать.

    Кэшируя не всё скопом, а только отдельные конкретные участки, куда легче решить все вопросы с инвалидацией и сроком жизни.

    При этом ни к PDO, ни к php-fpm вопрос отношения не имеет.
    Ответ написан
  • Где найти скрипт mysql->xml?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $xml = `mysql --xml --execute="SELECT 1 num FROM dual;"`;
    Ответ написан
    Комментировать
  • Как передать переменную в другой файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    форму с кнопкой отправить делать не хочу,

    Хотелки и капризульки оставляем дома. После этого вооружаемся знаниями и технологиями.

    Подсказываю:
    Смотреть в сторону стандартной формы, с перезагрузкой. Чтобы получить хотя бы отдаленное представление о том, что ты делаешь и с какой технологией работаешь.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Где и как лучше сохранять сам файл?

    В базе данных.
    Ответ написан
    5 комментариев
  • Как правильно разработать легкомасштабируемую платёжную систему?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Найти финансирование, от $10M
    2.Нанять команду профессионалов.

    Да, а школу сначала все-таки надо будет закончить.
    Ответ написан
    Комментировать
  • Доверять или не доверять?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Фильтровать какие-либо данные вообще очень редко требуется.
    Чаще всего надо форматировать их. В зависимости от того, куда данные отправляются.

    Вопрос же "доверия" решается просто - никаким источникам доверять нельзя.
    Ответ написан
    5 комментариев
  • Не пойму, в чем проблема при авторизация с сессией на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нагуглил лишь то, что session_start(); должен быть в начале кода, но и это не помогает.

    Помогает.

    Вспомнил. Скорее всего, это BOM гадит.
    Надо сохранять файл в кодировке UTF-8 without BOM, а лучше вообще сменить редактор на что-нибудь пристойное, с подсветкой кода хотя бы.
    Ответ написан
  • Как через action подгрузить php в определенном диве?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак.
    "Подгрузить РНР в диве" невозможно. В диве можно подгрузить только HTML.
    Ответ написан
  • Как правильно реализовать ООП класс базы данных с PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я уже отвечал как-то на подобный вопрос. И не один раз. И не два.
    Поскольку мозги всех пользователей пхп ходят по одним и тем же рельсам, не сворачивая. Впрочем, не всех. 85% всю жизнь продолжают писать mysl_query, которую выучили из видеоурока, и не видят в этом проблем. И только у самых талантливых 15-и процентов в какой-то момент возникает мысль ВСЁ АВТОМАТИЗИРОВАТЬ. Это, на самом деле, хороший знак. Такое желание как раз и отличает потенциального программиста от клепальщика гуано-кода.

    Но всё портит недостаток знаний в SQL. Искренне полагая SQL не более чем key-value хранилищем, они всерьез уверены в том, что функция select() с двумя аргументами - это все что им надо.

    Настоятельно рекомендую прочесть аргументацию по ссылке выше.

    После этого понять, что существует ТРИ класса классов для работы с БД:

    1. DB-хелпер. Класс, берущий на себя всю грязную работу по исполнению запросов. В случае с ПДО не сильно-то и нужен. Позволяет исполнять любые запросы. НИКАКИХ функций типа select(), ограничивающих функциональность, в нем быть не должно ни в коем случае.
    2. Query builder. Функция типа select() может быть только в квери билдере, который маскирует SQL в функции РНР. Заведомо ущербен по сравнению с первым, но зато позволяет использовать запросы более сложные, чем ORM.
    3. ORM. То, что начинающему пользователю на самом деле нужно, но он об этом просто не догадывается. Как раз та самая волшебная палочка, которая делает примитивное доставание данных из базы по первичному ключу столь маняще единообразным.

    Cамое главное, что надо понять:
    Все вышеперечисленное - это РАЗНЫЕ типы классов, не имеющие между собой ничего общего.
    И не пытаться под видом первого городить нежизнеспособное второе, имея в виду третье. Надо очень четко понимать, что сначала делаем первое, а потом, на его основе - либо второе, либо третье. Но не все вместе.

    А можно не пытаться изобретать велосипед, а использовать готовое. Например - популярный фреймворк. Тогда желаемая функция будет выглядеть вот так:

    public function viewUser($id)
    {
        return User::model()->findByPk($id);
    }

    Это в самом предпочтительном случае - при использовании ORM.
    На квери билдере это будет что-то вроде
    public function viewUser($id)
    {
        return DB::select('*')->from('users')->where("id", '=', $id);
    }


    При этом можно использовать и чистый SQL. Запрос прямо в классе юзера - это не так уж и страшно. Тем более, что есть такие запросы, которые по другому просто не выполнишь. Другое дело, что всю работу по исполнению запроса должен брать на себя хелпер. Пример можно посмотреть по ссылке выше - там хоть и SQL , но того ужаса, который здесь, нету:
    public function viewUser($id)
    {
        $sql = 'SELECT * FROM users WHERE id=?';
        return DB::prepare($sql)->execute([$id])->fetch();
    }
    Дальнейшую работы над классом можно производить только после того как ты определишься, какой именно класс ты хочешь написать.
    Ответ написан