Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу MySQL
  • Как перевести запросы 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());

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

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

    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']);

    В детали вдаваться не буду, но когда ты поймешь почему писать надо именно так, а у тебя сейчас в обоих вариантах написан ад, то сможешь считать что окончил начальную школу в программировании.
    Ответ написан
  • Ошибка 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
    Чебуратор тега РНР
    1. Открыть исходный текст страницы в браузере и увидеть там свое объявление в целости и сохранности
    2. Применять для вывода значений функцию htmlspecialchars
    Ответ написан
    Комментировать
  • 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.
    Ответ написан
    Комментировать
  • 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'];
    Ответ написан
    Комментировать
  • Добавить универсальности к запросам БД из PHP?

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

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

    - куча времени, убитого на поиски, адаптацию, и допиливание означенного автопостроителя
    - эмоции вида "как эта №%;%:?У#$^№ вообще работает??!" когда через пол-года придется добавить какое-либо новое поле
    - апофеоз, когда потребуется добавить условие, не поддерживаемое автопострителем, какое-нибудь IF EXISTS

    Поверьте, затраты на написание запроса вручную (неважно, через убогое mysql_query или Доктрину) - ничто по сравнению с возможностью **прочитать и понять**, для чего, вообще, данный код нужен, и как он это делает.

    Поэтому излишняя автоматизация бывает очень вредна. И гоняться за ней не стоит.
    Ответ написан
    1 комментарий
  • Как правильно сформировать запрос mysql в pdo?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    PDO к вопросу не имеет ни малейшего отношения.

    Вопрос только в том, как определить, нужен ли нам запрос UPDATE или INSERT. причем вопросы высосан из пальца. Начинающие пользователи пхп очень часто предаются мечтаниям вместо того чтобы писать код. И из таких мечтаний получаются вопросы типа
    В методе save мы можем получить все id из базы и сравнить их с id новой новости

    Если бы автор занимался написанием кода, а не мечтаниями, то сразу бы увидел, что никакого id у новой записи в принципе нет, и быть не может. Что и является признаком, по которому мы определяем, какой запрос выполнить. И таким образом задача "получить все id из базы и сравнить их с id новости" исчезает сама собой, а в месте с ней и страхи про ужасную нагрузку на БД.

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

    - синтаксис запроса для обновление выглядит как UPDATE news SET title=:title, text=:text WHERE id=:id'
    - даже если нам нужно было бы првоерять существование ид в базе, для этого не нужно выбирать ид всех новостей. Достаточно запросить одну запись с интересующим нас ид.
    Ответ написан
    Комментировать
  • Fatal error: Call to a member function fetch_assoc() on a non-object in как исправить?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Этот неловкий момент, когда SO.RU делает Тостера, как стоящего: mysql_fetch_array() expects parameter 1 to be reso...

    Если коротко, то перед соединением с БД надо написать волшебную строчку
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сколько ответов, и ни одного правильного

    PDOStatement::getColumnMeta
    Ответ написан
  • Как получить данные трёхмерным массивом?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Интересная задачка.
    Клнечно, она была бы еще интереснее, если бы ты сразу написал нужный запрос, но и так хорошо.

    В общем, можно попробовать похимичить с константами PDO::FETCH_*. То есть запросить избыточные данные, с дублированием элементов меню, и упорядочить константами. На праздники поиграюсьпоиграюсь

    Хотя трехмерный получить наверное не получится. Ключами юудет имя меню а значениями - массив с сабменю
    Ответ написан
    Комментировать
  • Правильно ли это хранить целые огромные html коды в базе?

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

    А вообще, если это, скажем, статья с разметкой - почему нет?
    Ответ написан
    1 комментарий
  • Подготовленные запросы или подготовленные процедуры?

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

    Да и старик Оккам не одобряет.
    Ответ написан
    1 комментарий
  • Почему запись в БД вставляется более одного раза?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    throw new DBException("Wrong table or parameters");

    Это такая шутка остроумная?
    Ответ написан
  • Подойдёт ли авторизация средствами MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. К авторизации этот вопрос не имеет отношения.
    поскольку буквальный ответ на вопрос из заголовка будет, разумеется - НЕТ. Одними средствами БД авторизовать никого нельзя.

    2. Вопрос, на самом деле - где хэшировать пароль. В скрипте или БД.
    В итоге вопрос получается дурацкий, поскольку очевидно, что в БД придется городить код из гуана и палок, без малейшей на то причины.

    Еще одно соображение - безопасность. Пароль в принципе нежелательно отправлять в БД в открытом виде, чтобы он потом не засветился в каких-либо логах.

    3. Весь этот детский лепет с sha1 в цикле заменить на php.net/manual/en/function.password-verify.php
    Ответ написан
    Комментировать
  • Лента новостей на php (проблема с запросом), как реализовать 2 запроса в один?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Самое первое, что надо сказать:
    Не нужно давать временным переменным супер-информативные имена.
    • $sqlForSubscriberByLogged - это просто $sql. Эта переменная никогда никому не будет нужна, кроме функции, исполняющей запросы. А ей всё равно, как названа переменная.
    • Переменной $queryForSubscriberByLogged в принципе быть не должно, это паразитная, ничего не делающая переменная.
    • $fetch_arrayForSubscriberByLogged - это какой-то адов монстр. Нас не должно интересовать, каким способом получена информация, через fetch_array или fetch_row. Нас должно только интересовать её содержимое. Вот его и надо описать в имени переменной. Но тоже без эксцессов.


    В итоге должно получиться
    $sql = "SELECT id_request_reciver FROM subscribers WHERE id_request_sender = ..."; 
    $SubscriberByLogged = $database->query($sql)->fetch_array();
    Ответ написан
    Комментировать