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

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

    Но тут важно понимать, для чего ты это делаешь.
    Если просто "шоб було" - продолжай использовать mysqli.
    Если хочешь сократить размер кода в 3-10 раз - тогда имеет смысл. Но тогда надо сначала разобраться с тем, что такое PDO и какие преимущества оно дает программисту.

    Например, вместо такого кода
    $name = $mysqli->real_escape_sring($_GET['name']);
    $price = $mysqli->real_escape_sring($_GET['price']);
    $color = $mysqli->real_escape_sring($_GET['color']);
    
    $sql = "SELECT * FROM goods WHERE name = '$name' and color = '$color' and price > '$price'";
    $res = $mysqli->query($sql);
    $result = [];
    while ($row = mysqli_fetch_assoc($res)) {
        $result[] = $row;
    }
    echo json_encode($result);

    В ПДО можно написать
    $stmt = $pdo->prepare("SELECT * FROM goods WHERE name = ? and color = ? and price > ?");
    $stmt->execute([$_GET['name'],$_GET['price'],$_GET['color']]);
    echo json_encode($stmt->fetchAll());

    Что гораздо удобнее.

    Учитывая, что ПДО умеет возвращать данные в десятках различных форматов, вариантов сокращения кодов может быть такое же количество
    Ответ написан
    Комментировать
  • Как отследить на каких доменах используется моя CMS?

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

    1. Чтобы отсечь нелицензионное использование - никак не отследить. Нулленая версия твоего горе-движка появится в интернете через день после релиза, у которой будет оторваны все проверялки, какие ты только сможешь придумать.
    2. Продавать надо не программу а сервис. Размещай свою платформу на своем же сервере и бере помесячную плату за использование. Никаких других вариантов отслеживать использование нет ,и быть не может
    Ответ написан
    7 комментариев
  • Как подсчитать количество заказов?

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

    Как это должно выглядеть на самом деле:

    public function countOrders($user_id)
    {
          $stmt = $this->pdo->prepare("SELECT count(1) FROM orders WHERE user_id =?");
          $stmt->execute([$user_id]);
          return $stmt->fetchColumn(); 
    }
    // и использование
    echo $obj->countOrders($_SESSION['user_session']);

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Странно, в тексте упоминается объект $pdo, а в коде статический вызов, у которого никаких проблем с видимостью в принципе быть не может.

    Но есть отвечать буквально, то

    1. Если код процедурный, то global для $pdo или статический вызов через DB:: - это нормально. Если код объектный, то передавать $pdo как параметр в конструктор, присваивать локальной переменной класса и потом уже использовать только ее.
    2. В данную конструкцию никакая инъекция не пролезет

    Писать, кстати, можно короче, чтобы не канителиться.

    $data = array(
      'email' => $_POST['email'],
      'id' => $_POST['id']
    );
    $res = DB::prepare("UPDATE `users` SET `email` = :email WHERE `id` = :id")->execute($data);
    Ответ написан
    1 комментарий
  • Ошибка php или мой косяк?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я думаю, тут мы имеем случай кривого чпу.
    Ну и кривой отладки, разумеется: сначала в одном месте записываем что-то в датабазу, а потом через два километра проверяем.
    Для проверки запускать этот код через консоль, а не через браузер.
    Ответ написан
  • Как в PHP через PDO добавить спец. символ?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Кодировка к кавычкам не имеет никакого отношения.

    Чтобы всегда добавлять любые символы в БД без ошибок, надо использовать подготовленные выражения.
    Кодировку, впрочем, тоже надо задавать не с помощью шаманских плясок с бубном, а правильно.
    В итоге код должен выглядеть примерно так
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $charset = 'utf8';
    
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $pdo = new PDO($dsn, $user, $pass, $opt);
    
    $ujasnaya_kavychka = '"""""';
    // подготавливаем запрос, заменяя все переменные знаками вопроса
    $stmt = $pdo->prepare("INSERT INTO table (pole_s_kavychkoy) VALUES (?)");
    // исполняем его, передавая все переменные отдельно
    $stmt->execute([$ujasnaya_kavychka]);

    При таком способе выполнения запросов ни одной ошибки, вызванной передаваемыми в запрос данными никогда в принципе не произойдет.

    Еще одна проблема может быть связана не с запросом, а с выводом. многие нубы выводят свои данные с кавычками в атрибут тега HТML,
    <input type="text" value="<?=row['pole_s_kavychkoy']">

    получают на выходе что-то вроде
    <input type="text" value="артель "рога и копыта">
    и страшно пугаются - оказывается, коварная база данных украла у них весь текст после кавычки.
    Чтобы отобрать этот текст обратно ,весь вывод надо производить через htmlspecialchars()

    Поскольку вопросы был отредактирован, то отредактирую и ответ:
    Если речь идет не про кавычку, а про развесистую эмодзи, то в стандартной ut8 они не поддерживаются, и надо использовать utf8mb4 - как в таблицах, так и при соединении.
    Ответ написан
    1 комментарий
  • Как посчитать количество и вывести сумму(класс корзины + куки)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если коротко, то автор этой "корзины" идиот.
    Так корзины никто не делает.
    Беги с этого сайта куда глаза глядят. Это "девионити" еще хуже видеокурсов попова.

    В корзине должны лежать только уникальные товары, а количество пишется в отдельное поле.
    if (isset($this->products[$id])) {
        $this->products[$id] = 1;
    } else 
        $this->products[$id]++;
    }

    примерно так.
    но чтобы сделать по-человечески, надо будет будет выкинуть весь идиотский код который тебе впаривают на этом сайте.
    Ответ написан
  • 'Allowed memory size of 134217728 bytes exhausted' Почему это происходит с PDO, при выборке всего 27k записей?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Единственная независящая от программиста причина, по которой PDO будет жрать память, это буферизованные по умолчанию запросы. поэтому если перед выполнением запроса написать
    $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, FALSE);

    То ошибка исчезнет.
    Остальные рекомендации настолько очевидны, что я постеснялся их писать сначала.

    1. При выборке большого объема данных fetchAll() использовать не рекомендуется.
    2. Если все же хотим использовать, то надо убрать двойное заполнение массива
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    Все остальные претензии по памяти предъявлять РНР и собственному коду.
    Ответ написан
    8 комментариев
  • Какую функциональность обычно используют в PHPStorm?

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Открыть исходный текст страницы в браузере и увидеть там свое объявление в целости и сохранности
    2. Применять для вывода значений функцию htmlspecialchars
    Ответ написан
    Комментировать
  • Последнее значение ID через PDO?

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

    Запрашивать Последнее значение ID в принцие неправильно, и приведет к очень неприятным последствиям.
    Запрашивать можно последнюю запись целиком, чтобы показать ее юзеру. Это делается с помощью оператора ORDER BY. Но запрос "последнего ид" говорит о том что логика программы неправильная. И начнутся проблему после того, как такой запрос вернет не самый последний ид
    Ответ написан
    3 комментария
  • Чему научиться за год до эмиграции?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Читай книжки.

    Для языка не нужно никаких ни курсов, ни скайпов. Простым чтением за год можно поднять себе грамматику и словарный запас до болеe чем достойного уровня. Учитывая, что разговорный навык уже небольшой есть.
    Правда, для миллениалов этот совет не подходит, конечно.
    Ответ написан
    5 комментариев
  • Почему не срабатывает запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $num = '1';
    $fields = 'title';
    
    $stm = $pdo->prepare('SELECT * FROM products WHERE id=?');
    $stm->execute([$num]);
    $data = $stm->fetch();
    
    var_dump($data[$fields]);
    Ответ написан
    Комментировать
  • С чего начать при изучении symfony с нуля?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Однозначно начать вот с этого текста: Symfony2 против чистого PHP (перевод отсюда), который буквально описывает твою ситуацию.

    Изучать лучше сразу 3, но за неимением богатого выбора материалов, придется обходиться тем что есть.
    Например есть серия постов на хабре, https://habrahabr.ru/post/301760/
    Ответ написан
    Комментировать
  • MySQLi: зачем нужна проверка соединения connect_errno?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все правильно, никакая проверка здесь не нужна.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ на этот вопрос очень простой.

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

    по поводу реализации

    1. Как уже сказали выше, какой-то странный метод getInstance(). Если каждый раз вызывать с парасетрами, то какой вообще смысл в синглтоне? Сделай хотя бы два метода, один коннект, а второй гетинстанс.
    2. Не очень понятно почему две статические переменные, и какая за что отвечает. почему бы не оставить одну?
    3. Если уж делать синглтон, то лучше избавляться от лишней писанины, и обращаться напрямую к методам для работы с БД: `DB::insertId()` будет поудобнее, чем `DB::getInstance()->insertId()`
    4. Учитывая неудобство метода PDO::execute(), будет полезным подправить классиков и добавить метод, который будет выполнять запрос с параметрами и вернет стейтмент. Пример можно посмотреть здесь: https://phpdelusions.net/pdo/pdo_wrapper
    Ответ написан
    Комментировать
  • PHP mysqli_fetch_all() всегда возвращает типы данных в соответствии с типами данных столбцов?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всегда, если использовался prepared statement.
    Ответ написан
    Комментировать
  • Чем паттерн Repository отличается от DataMapper?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это два абсолютно разных паттерна.

    DataMapper - это то, что традиционно неправильно называют моделью. Тупо мостик между БД и объектом: считать данные из БД и записать в объект, сохранить объект в БД. Фактически CRUD. Способ автоматизировать рутинные операции. Моделью являться не может в силу изначальной ограниченности.
    Другими словами, это универсальный код, подходящий для работы с любыми объектами. Инструмент для работы с БД. Все его методы одинаковы для любых объектов.

    Репозиторий - это то, что на самом деле является моделью - набор методов, реализующих бизнес-логику приложения. Метод в репозитории может включать в себя десяток разных запросов к БД для получения набора данных, необходимого в приложении, плюс их обработку.
    В отличие от DM, репозиторий содержит также уникальные методы, которые отражают конкртеные нужды конкретного модуля приложения.
    Ответ написан
    1 комментарий
  • Real_escape_string($var) выдает ошибку почему???

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что функцию sanitizeString надо выкинуть на помойку, чарсет задавать сразу после коннекта, а для запросов использовать подготовленные выражения
    Ответ написан
    Комментировать
  • Мультиязычный сайт php + mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всего-то надо использовать правильную константу ПДО
    $lang = $pdo->query("SELECT `key`, `english` FROM language")->fetchAll(PDO::FETCH_KEY_PAIR);
    echo $lang['solved'];
    Ответ написан
    Комментировать