Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Какое похожее на условие WHERE 1, которое можно использовать в подготовленном запросе PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как правильно отметили выше, тебе не нужна "ручка для 8 класса": WHERE 1 в PDO работает точно так же.

    Другое дело, что все можно сделать гораздо проще, и без where 1, и без кучи условий (представь свой код, если в запросе будет участвовать не два поля, а три). На самом деле условий нужно не больше, чем полей в запросе:
    if (!empty($foo1)) {
        $where = "foo1= :foo1";
        $placeholders[':foo1'] = $foo1;
    }
    if (!empty($foo2)) {
        $where = 'foo2 = :foo2';
        $placeholders[':foo2'] = $foo2;
    }
    $sql = "SELECT type FROM tablepart";
    if ($where)
    {
        $sql .= " WHERE ".implode(" AND ", $where);
    }
    $stmt = $pdo->prepare($sql);
    $stmt->execute($placeholders);
    $data = $stmt->fetchAll();
    Ответ написан
    1 комментарий
  • Куда лучше помещать одинаковую логику для разных контроллеров/моделей?

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

    Делать жирный хелпер и захламлять его не связанными друг с другом функциями - это действительно нехорошо. Но никто же и не принуждает иметь единственный хелпер на все приложение.

    куда вы предпочитаете выносить "тяжелую" логику в приложении? Чтобы не делать жирных контроллеров

    В хелперы. Они именно для этого и предназначены

    > не захламлять модели?

    Модель - самое неудачное слово, которое существует в мире веб-разработки.
    Хелпер является полноправной частью модели. А то что ты называешь моделью - слой работы с БД - это либо DBAL, либо ORM, дата маппер.
    Чтобы не захламлять маппер, тебе нужен репозиторий. Тот же хелпер, но работающий с БД, коллекция специфичных SQL запросов.
    Ответ написан
    Комментировать
  • Можно ли таким образом использовать try-catch?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Можно, используется. Но в 99% случаев не нужна.
    В данном случае скорее всего тоже. Ожидать исключения в транзакции - плохая практика. Скорее всего, либо никакие уточнения не нужны, либо данные не были провалидированы до начала транзакции.
    Ответ написан
    2 комментария
  • Лучший хостинг для Symfony 3 с серверами в России?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос в стиле "Лучшие дороги, чтобы ездить на Мазда 3"???

    Симфони - это программа, написанная на РНР.
    Любой хостинг, предоставляющий РНР, подходит для Симфони.
    Никаких специальных требований Симфони к хостингу не предъявляет.
    Ответ написан
  • Как запускать dev-окружение Symfony под Apache по умолчанию?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Править .htaccess
    2. Никакого "неявного" запуска не бывает - запускается совершенно конкретный файл из п.1
    3. DirectoryIndex не имеет принципиального значения, куда важнее поменять RewriteRule.
    Ответ написан
    Комментировать
  • Структурирование исключений. Что вы указываете в качестве exeption code?

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не надо ни в чем убеждаться.

    Эти бессмысленные телодвижения, которые так любят пользователи похапе - тяжелое наследие царского режима и видеокурсов "Начни грести бабло за 3 урока".

    Ни одна нормальная программа не занимается такой ерундой, как проверка каждого несчастного запроса на ошибки, и не начинает причитать "ой, у нас такой-то запрос сломался" если ошибка произошла.

    Не надо ни в чем убеждаться. Не надо смотреть ни на какие ошибки запросов.
    Надо ПРОСТО сказать пользователю, что все хорошо, без всяких условий. Ошибки, если будут, обрабатываются совсем в другом месте.
    Ответ написан
    Комментировать
  • PDO Почему не откатываются транзакции?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Скорее всего движок БД не поддерживает транзакции. Надо поменять у таблиц engine с myisam на innodb

    Напомню, что необходмо ловить \Exception, а не PDOException. Нам без разницы, какая именно ошибка прервала выполнение транзакции, откатываться надо в любом случае.

    Плюс никогда нельзя забывать о логировании ошибок. То есть, вместо return false;, которое совсем ни о чем, лучше перевыбросить исключение, чтобы оно могло быть обработкно стандартным образом. В общем, читайте правильные мануалы, там все есть :)
    Ответ написан
    3 комментария
  • Как одним запросом в базу получить все записи с разными критериями?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если $users приходит из БД, то получать пользователей тем же запросом, используя JOIN.

    Ecли же приходит со стороны, делать как в ответе Arris , но только не пихать айдишники прямо в SQL, а использовать параметризованный запрос, https://phpdelusions.net/pdo#in
    Ответ написан
  • Как вывести одинаковые столбцы в PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Помимо стандартных способов (задать всем колонкам алиасы или использовать fetch_num), в ПДО есть забавный режим, PDO::FETCH_NAMED, который все поля с одинаковыми названиями запихивает во вложенный массив.

    Не знаю, насколько это удобно, но буквально на вопрос отвечает :D

    И да, вот этот вот ужас с джейсон енкоде ой нет декоде надо стереть, пока никто не видел.

    Плюс вообще убрать фетч из функции, а вместо этого возвращать стейтмент:
    public function query($q, $params = [])
    {
            $statement = $this->pdo->prepare($q);
            $statement -> execute($params);
            return $statement;
    }

    И тогда ты сможешь использовать показанный выше режим
    // обычные данные
    $data = $db->query($sql, $params)->fetchAll();
    // данные с дублями
    $data = $db->query($sql, $params)->fetchAll(PDO::FETCH_NAMED);

    А так же все 100500 остальных режимов, поддерживаемых ПДО
    Ответ написан
    Комментировать
  • Чего не хватает моим функциям?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну, то что это адова жесть, уже все сказали.
    Но я логики понять не могу. В чем профит?
    Сравниваем код на этом адском поделии
    $allData=$Kernel->getRecords($GLOBAL->Table,array(
      "where"=>"`Type`='Some' AND`Status`='Y'",
      "order"=>"`Position`",
      "sort"=>"Id"
    ));

    И код на чистом PDO/SQL
    $allData = $pdo
        ->query("SELECT * FROM $GLOBAL->Table WHERE `Type`='Some' AND `Status`='Y' ORDER BY `Position`")
        ->fetchAll();

    В ЧЕМ ПРОФИТ?
    Какой смысл разбивать SQL на массив и писать по отдельности, когда можно просто сразу написать нормальный SQL?

    Ну и про безопасность тут уже все сказали. Я не знаю, за какой "безопасности" тут речь, но вот тут
    $Kernel->query($GLOBAL->Table,array(
      "type"=>"insert",
      "set"=>"`Variable1`='{$data1}',`Variable2`={$data2}"
    ));

    инъекция на инъекции и инъекцией погоняет.

    Интересно, что, функция твоего начальника не так плоха. Он только не умеет пользоваться PDO и не знает что эту функцию можно сделать в 100 раз проще, без кучи ненужных параметров. Но в целом она довольно осмысленная и безопасная. И в ней нет global. В отличие от твоего собственного кода.

    Вот твой второй запрос с использованием его функции:

    $Database->Query("INSERT INTO $GLOBAL->Table SET `Variable1`=?',`Variable2`=?", [$data1, $data2]);


    это четкий, ясный и безопасный код.
    Внимание, снова вопрос: НАФИГА?
    ЗАЧЕМ ты нагородил вот это вот всё, если оно в 100 раз хуже чем было?
    Ответ написан
    6 комментариев
  • Чистый код: блоки try/catch. Стоит ли так делать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    > если у нас в try {} несколько понятных вызовов методов,

    причем таких как в примере, далеющих только логирование, и поэтому повторающихся сотни и тысячи раз, то try catch в таеом случае писать не нужно вообще. А добавить либо глобальный трай для всего приложение, либо написать отдельный хендлер/обработчки исключений, если язык позволяет.

    То есть ответ на вопрос очевиден:

    - если у нас в кетче только логинование, то трай не пишем вовсе
    - если в кетче замороченная логика, то трай разумеется имеет смысл вынести в отдельный метод
    Ответ написан
    Комментировать
  • Как сделать вывод Startup-ошибок PHP на английском?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Запускать РНР под нормальной ОС.
    Ответ написан
    Комментировать
  • Как правильно экранировать ковычки в input?

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

    Либо используешь escape string вместе с prepared statements, либо magic_quotes. И то и другое выкинуть на помойку.
    Ответ написан
  • Как проверить на существование строки php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Мда, код конечно эталонный. Хоть сейчас на стенку и в рамочку, "как писать код не приходя в сознание".
    Впрочем, отвечатели, по традиции, не лучше.

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

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

    Ну и в-третьих совсем уж, прямо скажем, бессмысленные телодвижения - return, после которого автор надеется выполнить какой-либо код, и поиск в ассоциативном массиве значения с индексом 0.

    Короче, если выбросить весь мусор, то у нас задачка в четыре действия.

    1. Подготовить запрос
    2. Исполнить запрос
    3. Получить результат
    4. проверить результат

    $stmt = $pdo->prepare("SELECT 1 FROM reg WHERE login=?");
    $stmt->execute([$login]);
    $found = $stmt->fetchColumn();
    if($found){
        echo "Существует";
    }else{
        echo "Нет";
    }
    Ответ написан
    Комментировать
  • Как починить PDO DBLIB: dbresults() returned FAIL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    while ($stmt->nextRowset() && $stmt->columnCount());

    Calling stored procedures in PDO
    Ответ написан
  • Как сделать условие в pdo?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Пдо здесь не при чем. Он не выводит номера страниц. И соответственно никакие условия "в pdo" здесь не нужны.
    Чтобы вывести 3 точки, надо написать программу на пхп. Все что тебе нужно - это математика на уровне 4 класса средней школы.
    Ответ написан
    Комментировать
  • Как правильной исполнить запрос при помощи PDO в котором много IN(1,2,3)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $arr = array(1,2,3);
    $in  = str_repeat('?,', count($arr) - 1) . '?';
    $sql = "SELECT * FROM table WHERE column IN ($in)";
    $stm = $db->prepare($sql);
    $stm->execute($arr);
    $data = $stm->fetchAll();

    Если есть другие плейсхолдеры, то использовать array_merge в execute()
    Ответ написан
    Комментировать
  • Где можно найти примеры тестовых заданий по php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На будущее - php.feedme.ru :)
    Ответ написан
    Комментировать
  • Создание отдельной таблицы для каждого пользователя. Правильно ли?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Практика - критерий истины.

    Сделай такую таблицу, а потом попробуй вывести все комментарии под статьей или ленту последних постов на сайте.
    Ответ написан
    Комментировать