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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ написан
    Комментировать
  • Что мне использовать: mysql или mysqli?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    НИ ТО НИ ДРУГОЕ

    Впечатления: это ад, посаны!

    Истину глаголешь.
    Потому что mysqli не предназначена для использования в коде напрямую. А только через более высокоуровневый враппер. Сама по себе это низкоуровневая либа, которая обеспечивает доступ ко всем самым мелким настройкам драйвера. Именно поэтому она так многословна и неудобна. И именно поэтому надо на её основе обязательно лепить враппер.

    С другой стороны, старая mysql - ТОЖЕ низкоуровневая либа, и тоже НЕ ДОЛЖНА использоваться в коде напрямую, а только как основа для враппера. К тому же она официально устарела.

    В общем, у тебя два варианта:
    • Либо использовать PDO, который является более высокоуровневой либой-недовраппером. Как пользоваться, написано здесь: Как работать с PDO?
    • Либо, если хочешь все-таки базироваться на mysqli - использовать готовый враппер SafeMySQL, с которым все ужасы уйдут в прошлое, а код сократится в 10 раз
    А САМЫЙ лучший вариант - это перестать гонять запросы из кода напрямую, а вместо этого освоить уже какой-нибудь фреймворк и использовать для работы с базой ORM
    Ответ написан
    2 комментария
  • Почему не выполняется запрос mysqli?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Проблема в пихании в код разных умных слов без понимания их смысла.
    Если убрать из кода слово MYSQLI_USE_RESULT, то волшебным образом ошибка исчезнет.
    Впрочем, я должен признать, что сермяжная правда в двух других ответах есть. Если последовать моему же совету, и использовать prepare/execute вместо query (поскольку эта парочка используе USE_RESULT без вариантов), то как раз и придется либо выбирать все данные, которые вернул запрос, либо освобождать ресурс через free(), либо перед выборкой дергать store_result().
    Но - повторюсь - в текущем коде этот параметр не имеет смысла и в то же время является причиной всех бед.

    Но проблемы этого кода на этом только начнутся.

    Во-первых, НИКОГДА больше пиши так: die(mysqli_error($mysqli)); а то станешь козленочком и тебя заберут в армию.
    Вместо die надо писать trigger_error()

    Во-вторых, НИКОГДА не подставляй переменные напрямую в строку запроса. Передавать данные надо только через плейсхолдеры. Если родной механизм слешком сложный, то можешь воспользоваться библиотекой phpfaq.ru/safemysql и код получится таким.
    $exists = $db->getOne("SELECT 1 FROM users WHERE social_id=?s",$social_id);
    if($exists){
    	//тут устанавливаются куки
    }else{
    	$db->query("INSERT INTO users (social_id) VALUES (?s)", $social_id); 
    }

    (выводить бессмысленные okay или oops не нужно)
    Ответ написан
    7 комментариев
  • Почему не выполняется запрос mysqli?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Дубль. Афтар не осилил отредактировать старый вопрос, и задал новый, более актуальный.
    Ответ написан
  • Как реализовать передачу файлов со сканера в PHP через FTP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    "реализация FTP сервера на PHP" - это бессмыслица. Что-то вроде "Ищу реализацию дорожной разметки на светофорах".
    FTP сервер не надо реализовывать. Ни на РНР, ни на чем-то ещё. Он уже есть, в составе любого веб-сервера.
    То есть проблема отправки на сервер со сканера не стоит. Надо только настроить учетную запись на сервере и ввести данные в сканер.

    Всякие окошки с превьюшками - это ерунда, интерфейс. Можно сделать так, можно иначе. Это не принципиальный вопрос. Юзер может хоть сам окошко обновлять руками.

    Самое сложное в описываемой воображаемой задаче - это кнопка "Сканировать". поскольку никаких видимых каналов связи сайт -> сканер, в описании не наблюдается. Если изменить задачу на "показать отсканированные файлы", то все упрощается:
    - человек идет к сканеру и сканирует то что ему надо.
    - после этого идет к сайту, и нажимает "показать файлы"
    - после этого любой готовый скрипт фотогалереи показывает ему его файлы в каких угодно видах.
    Ответ написан
    Комментировать
  • Формуляр. Не работает проверка capcha. Проверка валидности?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вам сюда.
    Ответ написан
    Комментировать
  • Допустимы ли во VIEW условия?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вью - это логика отображения. Условный переход - это, несомненно, логическая конструкция. То есть, утверждение сводится к "допустимо ли использовать логику для логики?" ответ - TRUE.

    Больше того, избавиться от условных переходов в шаблоне в принципе не получится. Любая попытка сведется всего лишь к переименовыванию условного перехода в анонимную конструкцию, которая будет выполнять те же функции, но при этом запутает читателя.

    А вот сократить количество логики, как ваыше написали - можно. К примеру, подготовить все нужные данные заранее - либо в контроллере, либо в хелпере, а в шаблоне заниматься только выводом этих данных. Втом числе данных для пагинации. То есть, условных переходов не станет меньше, но они перейдут в тот слой, где более уместны.
    Ответ написан
    2 комментария
  • По каким причинам может не устанавливаться Cookie?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я просто оставлю это здесь:
    Ничего не работает! Что делать???

    Причины надо узнавать не у прохожих на улице, а у своей собственной системы. Только она может ответить точно, а не гадать на кофейной гуще.

    Апдейт.
    Из комментариев к другому вопросу становится ясно, что автору надо сначала понять, что cookie - это HTTP заголовок, и чем отличаются HTTP заголовки от переменных в программе.
    Ответ написан
    Комментировать
  • Процедурный стиль или ООП PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Процедурный однозначно.
    Если такой вопрос в принципе возникает - это значит, что ООП автор не понимает от слова "совсем". И в итоге, при попытке написать собственные классы, получит адский треш. Поэтому только процедурный. Там тоже будет треш, но не адовый.

    Более сложный вариант - посмотреть на календарь, узнать, что сейчас уже вторая декада XXI века, и перестать уже наконец использовать РНР так, как его использовали в прошлом тысячелетии, ковыряя каждую мелкую задачу самостоятельно на чистом РНР. После этого взять учебник по современному фреймворку, такому как Ларавель или Йии, прочитать его, и начать делать сайт с помощью готовых классов, которые уже написали для тебя, и которые берут на себя 80% черновой работы, и при этом делают её на 100500% лучше, чем твой собственный самопальный код (потому что учитывает миллион нюансов и правил, о которых ты вообще даже не подозреваешь). В итоге, по факту, сайт получится с использованием ООП, но не в том смысле, который имел в виду автор (писать все самому с нуля).
    Ответ написан
    2 комментария
  • Можно ли передавать массив в этом запросе 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]
        );
    }

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если тег mysqli стоит не от балды, а это АПИ действительно используется, то в перед коннектом написать
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Плюс включить вывод ошибок или смотреть ошибки в логе.

    Если использвется старое апи mysql_query, и нет обработки ошибок - то включить вывод ошибок и по косвенным ошибкам смотреть, где проблема.

    Как включить вывод ошибок и как отлаживать программы вообще, написано здесь: phpfaq.ru/debug (в качестве бонуса там объясняется, почему бессмысленно задавать вопросы вида "почему у меня не работает?").
    Ответ написан
    Комментировать
  • Как достать посты с комментариями Laravel 4?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я был неправ, приношу свои извинения.
    Это принципиальное ограничение для eager loading, и текущее поведение - это единственное, что он может дать. То есть, смысла использовать hasMany тут нету.

    То есть, комментарии надо получать отдельными запросами, по числу постов, что возвращает нас к предыдущей задаче про денормализацию. Хотя я бы не торопился её делать, поскольку 20 запросов по индексу базу не нагрузят.
    Ответ написан
  • Хранение 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 записей на одной странице.

    после этого можно продолжать оптимизацию
    Ответ написан
    Комментировать
  • Как укоротить sql запрос ?

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

    Единственная проблема, которую я здесь вижу - это множественные суб-селекты exists, которые при большой выборке могут стать проблемой. Но если выборка небольшая, то и проблемы нет.

    Если прям хочется разобраться, то для начала выполни в консоли две команды
    \W
    EXPLAIN EXTENDED дальше твой запрос

    и посмотри таблицу. Если цифры в колонке rows копеечные, то и не парься. Заодно можешь посмотреть, во что оптимизатор превратил твой запрос - возможно, он уже научился эту красоту сам транслировать в джойны.
    Ответ написан
    2 комментария
  • Почему PDO не создает новое подключение, пока не завершится предыдущее?

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

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

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

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

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

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

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

    Это очень дурацкий комментарий на самом деле.
    Не обижайся, но только совсем дети думают, что изучив какую-то один "самый лучший" инструмент, они станут специалистами. Изучать надо технологию на примере инструмента. Начинать можно с любого. Главное - не останавливаться после этого, и продолжать учиться.
    Ответ написан
    4 комментария
  • Почему не работает in ?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что нет столбца с ключом 'where_1, where_2, where_8'

    Кстати, на будущее запомни, что БД, с которой ты работаешь, называется Mysql, а не mysqli
    Ответ написан
    Комментировать