Задать вопрос
Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу PHP
  • Можно ли передавать массив в этом запросе MySQL?

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

    В любом случае, первое, что надо усвоить про составление запросов: ни одна переменная не должна попадать в запрос напрямую!

    То есть, первый вариант делает весь этот самопальный винегрет (который, тем не менее, делает работу с БД безопасной) - бесполезным.

    Поэтому, стоит использовать второй вариант, который, хоть и не оптимальный, но зато безопасный. А чтобы переменная не "затиралась" (а что ей еще остаётся делать, если её постоянно перезаписывают?), надо сделать её массивом:
    $listings = [];
    foreach ($array as $key => $value)
    {
      $listings[] = $iaAuto->get(
            array('model_id' => $value), 
            $pagination['start'], 
            $pagination['limit'], 
            $_SESSION[iaAuto::SESSION_SORTING_KEY]
        );
    }

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Это увеличит нагрузку на БД.
    2. Само по себе решение продиктовано только дикостью и чудовищным невежеством. Через годика два, если наберешься опыта, то сам с ужасом будешь смотреть на этот свой вопрос.

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

    Если взять ларавель, то в модели постов надо будет добавить метод
    public function recentComments()
    {
        return $this->hasMany('Comment')
            ->orderBy('created_at', 'desc')
            ->limit(3);
    }

    и ВСЯ лента будет строиться одним оператором, что-то вроде
    return Post::orderby('created_at', 'desc')
        ->with([
                'photos',
                'recentComments',
            ]);
        ->limit(5);
    Ответ написан
  • Как сделать постраничный вывод php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Записать файлы в массив.
    2. Отсортировать его.
    3. выводить через цикл for с начальным и конечным значением, задаваемым переменными.

    Для п.1 и для контроля расширений можно использовать glob()

    <?php
    $out   = array();
    $files = glob("$directory/*.{jpg,png,gif}", GLOB_BRACE);
    sort($files);
    for ($i=$start; $i <= $end; $i++)
    {
        $out[] = array(
            'title' = htmlspecialchars(basename($files[$i]));
            'file'  = $files[$i];
        );
    }

    В шаблон передаем массив $out и там его выводим.
    Как получать стартовое и конечное значение и как выводить ссылки на страницы можно посмотреть здесь: phpfaq.ru/paginator#new
    Ответ написан
    Комментировать
  • Хочу научиться сайтостроению. Где почерпнуть знания ?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если отвечать на тело вопроса, а не на один только заголовок, то из текста вопроса видно, что сначала надо научиться различать, где у тебя HTML5, а где mysql. то есть, самые основы клиент-серверной архитектуры сайта. Как раз хороший текст, который объясняет разницу между серверной и клиентской частью: phpfaq.ru/na_tanke

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Дла начала надо понять, что никакой живой пользователь никогда не будет читать 20 000 записей на одной странице.

    после этого можно продолжать оптимизацию
    Ответ написан
    Комментировать
  • Почему PDO не создает новое подключение, пока не завершится предыдущее?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Дело не в ПДО.

    Как быть, господа?

    Учиться правильно выявлять причинно-следственные связи, а потом уже задавать вопрос.

    Скорее всего, второй скрипт попросту не может начать работу, и это связано с сессиями. Если скрипт работает ТАК долго, то сессию в нем надо завершить, как только она стала не нужна. Но если это онлайн скрипт, то надо делать так, чтобы он отрабаотывал мгновенно, и таких вопросов вообще не возникало.
    Ответ написан
    7 комментариев
  • Выбор фреймворка Symfony2/Laravel/etc?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Открою маленький секрет.
    Начав учить Ларавель, ты обнаружшь, что огромный кусок этоого фреймворка составляют... компоненты Симфони!

    А про "более лучше сложных проектов" я не понял, если честно. АВито - тоже доска объявлений. Ты действительно считаешь, что это простой скриптик на голом похапе?
    Если отвечать прямо, то я считаю что Лара более прогрессивна, более молода, более агрессивна.

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

    Это очень дурацкий комментарий на самом деле.
    Не обижайся, но только совсем дети думают, что изучив какую-то один "самый лучший" инструмент, они станут специалистами. Изучать надо технологию на примере инструмента. Начинать можно с любого. Главное - не останавливаться после этого, и продолжать учиться.
    Ответ написан
    4 комментария
  • Безболезненная миграция 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
    Чебуратор тега РНР
    Я бы хранил всю переписку во-первых, в одной ячейке, а во-вторых, тупо дублировал бы её. Это, конечно, расход места, но зато просто.
    Ответ написан
  • Как запретить доступ к папке которая выше?

    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.Нанять команду профессионалов.

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