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

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

    1. PDO error reporting надо установить на PDO::ERRMODE_EXCEPTION иначе ловить будет нечего
    2. ловить надо Exception, а не PDOException
    3. после отката исключение надо перевыбросить
    4. убедиться что движок БД поддерживает транзакции (например InnoDB)
    5. среди запросов нет такого, который модифицирует стркутуру БД

    Ну и убедись, что в БД у тебя не лежат уже обновленные данные. Потому что в этом случае $Changed законно будет нулем.
    Ответ написан
    2 комментария
  • While не перебирает первый элемент массива php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ очевиден - перед while ты где то делаешь лишний fetch
    Ответ написан
    Комментировать
  • Как правильно сделать транзакцию PDO в этом случае?

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

    Единственное замечание, которое можно сделать,
    echo "Ошибка: " . $e->getMessage();
    выглядит очень по-деревенски.

    Чтобы нормальным образом обработать исключение, его надо перевыбросить, то есть написать
    throw $e;

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нет, при добавлении в БД никакого "свода правил" нет.
    Больше того, все твои существующие обработки к добавлению в БД не имеют ни малейшего отношения.
    Базе данных абсолютно все равно, какие данные хранить.

    Единственное правило, которое действительно нужно для БД, ты и так уже применяешь - используешь подготовленные вопросы.

    Если же говорить не о БД, а о фильтрации данных "вообще", то ответить на этот вопрос невозможно. Точно так же как невозможно ответить на вопрос, "Есть ли список болезней, от которых мне надо лечиться?". Все зависит от того, чем ты болеешь. Если тебе важно првоерять ссылки, то проверяй ссылки. Неважно? Не проверяй. Нельзя пропускать теги? Используй strip_tags. Нужно пропускать теги? Не используй strip_tags. И так далее - все зависит от задачи. Универсального правила или "свода правил", этакой волшебой палочки, которой махнул 1 раз и забыл про валидацию денных, нет и быть не может.
    Ответ написан
    Комментировать
  • Почему не работает вставка в PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    > Почему не работает вставка в PDO?

    Этого не знает никто. Кроме твоей БД.
    Поэтому надо спрашивать надо не посторонних людей, а свою базу данных.
    Добавь после коннекта строчку

    $this->link->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );


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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $stmt = $pdo->prepare("SELECT 1 FROM table WHERE field=?");
    $stmt->execute($_POST['field']);
    $found = $stmt->fetchColumn();
    if ($found) {
    ...
    Ответ написан
    Комментировать
  • Как исправить проблему с INSERT INTO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Читаем phpfaq.ru/pdo
    Включаем для PDO вывод ошибок
    Меняем это ужас с переменными прямо в коде запроса на подготовленные выражения
    Ответ написан
    Комментировать
  • Как закрыть PDO соединение mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Немедленно выкинуть на помойку этот ад кромешный, извращающий все принципы программирования. Использовать оригинальный ПДО. Прочитать Error reporting basics.
    Сделать обработку ошибок общую для всего РНР.

    Заодно пропадет и проблема с закрытием соединения.
    Ответ написан
    Комментировать
  • При запросе PDO к базе выдаёт дублированые записи, почему так?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Заканчивалась вторая декада 21 века, а пользователи похапе так и лепили в своем коде тупейшую SQL инъекцию...

    query выкидываем на помойку, вместо этого используем prepare с параметрами, а все переменные отправляем в execute.
    Ответ написан
    Комментировать
  • Какое похожее на условие 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 комментарий
  • Можно ли таким образом использовать try-catch?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Можно, используется. Но в 99% случаев не нужна.
    В данном случае скорее всего тоже. Ожидать исключения в транзакции - плохая практика. Скорее всего, либо никакие уточнения не нужны, либо данные не были провалидированы до начала транзакции.
    Ответ написан
    2 комментария
  • Структурирование исключений. Что вы указываете в качестве 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 комментариев
  • Как сделать вывод 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 "Нет";
    }
    Ответ написан
    Комментировать