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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В африке есть такая птица - страус.
    В случае опасности она втыкает голову в песок.
    Поскольку при этом она перестает видеть хищника, и думает что хищник тоже её теряет из виду.

    Все эти попытки и на ёлку влезть и на пони покататься - получить одним запросом и кусок данных, и полное количество - это как раз такое втыкание головы в песок. В наивной надежде что бд там у себя внутри как-то волшебным образом откуда-то прочитает полное количество и отдаст его без напряга. Не отдаст. Там внутри будет все равно два запроса. И хорошо если без временной таблицы.

    Для тех, кому ехать, а не шашечки. единственный реальный и осмысленный вариант
    SELECT COUNT(*) FROM ## задача с блекджеком и JOIN'ами
    SELECT * FROM /* задача с блекджеком и JOIN'ами */ LIMIT 150


    а "ресурсоёмкие" запросы надо оптимизировать. чтобы они перестали быть ресурсоёмкими.
    Ответ написан
  • В mysql для быстрого поиска по дате лучше использовать timestamp как int или как date (datetime)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для скорости абсолютно без разницы, а для хранения даты и времени надо использовать предназначенные для этого типы данных
    Ответ написан
    6 комментариев
  • Выгрузка картинки из базы mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Этот вопрос надо отлить в граните и поместить в палате мер и весов, в виде большой квадратной доски.
    И всех любителей хранить картинки в базе "это же так удобно!!!" заставлять биться об нее головой, пока вся эта дурь из головы не вылетит.
    Ответ написан
    7 комментариев
  • Почему php не может подключиться к БД?

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

    <?php
    // видеть все ошибки!
    ini_set('display_errors',1);
    error_reporting(E_ALL);
     // подключаем настройки
    require_once 'connect.php';
    
    // включаем режим информирования об ошибках
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    // подключаемся к серверу
    $link = mysqli_connect($host, $user, $password, $database);
    // не забываем установить кодировку, чтобы не было ошибок с кракозябрами
    $mysqli->set_charset('utf8mb4');
       
    // выполняем операции с базой данных
    $query ="SELECT * FROM foo";
    $result = mysqli_query($link, $query);
    // дальше делаем что нужно
    
    // и кстати, в большинстве случаев закрывать подключение не надо


    ЗЫ. На боевом сервере ошибки на экран выводить конечно не стоит, а их надо писать в лог (собственно, именно поэтому все эти die - это ужас). И на боевом сервере display_errors надо отключать, а log_errors наоборот - подключать.
    Если совсем не можешь найти, где у сервера висит лог ошибок, можешь задать свой собственный, с помощью функции ini_set('error_log','/путь/к/файлу');. Но только размещать его надо разумеется в папке недоступной пользователям сайта


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

    Если разобраться, то код or die("Ошибка1 " . mysqli_error($link)); очень смешной (это не к тебе претензия, никто не ожидает от тебя понимания таких тонкостей, которые не то что новички, а половина здешних "кураторов" не понимают).
    Что тут происходит?
    слово or die (которое на самом деле вообще нельзя никогда писать) пишут тогда, когда ожидают что в переменной $link будет значение false. Но если в $link будет false, то тогда её бессмысленно подставлять в mysqli_error. Именно поэтому для получения ошибки соединения в мускули есть отдельная специальная функция.

    Но как я говорил выше, применять её не следует, как и or die.
    Ответ написан
    2 комментария
  • Почему не записывает значение в БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    ё моё, ну нормальный почти у тебя код был
    оставь все как было только запрос поменяй
    $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);
    
    $query = 'INSERT INTO `configs` (`CName`, `Username`, `Time`) VALUES (?,?,?)';
    $stmt->$pdo->prepare($query);
    $stmt->execute([$CName,$Username, $Time]);
    $id = $pdo->lastInsertId();
    Ответ написан
  • Как правильно создать индексы mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я так понимаю что главная задача - убрать перемножение таблиц.
    По идее должно быть достаточно добавить индекс на product_id.
    тогда во второй строке в rows должна появиться единичка

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

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

    Поэтому сначала учимся правильно соединяться.
    Весь этот детский лепет "не могу соединиться с БД" выкидываем и пишем нормальный код, который сам, без всяких проверок, сообщит нам об ошибках.
    В случае mysqli это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");

    Здесь первая строчка отвечает как раз за информирование об ошибках

    Кроме того надо не забыть про ошибки РНР
    Во-первых, всегда в коде должно быть error_reporting(E_ALL);
    Плюс на домашнем компе ini_set('display_errors',1);, а на боевом - ini_set('display_errors',0);ini_set('log_errors',1);, и смотреть, соответственно, в логах.

    После этого переписываем запрос. Причем так, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();

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

    И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже о том что при любых других вариантах твой сайт поломает любой пятиклассник

    Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

    Подключение
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    $pdo = new \PDO($dsn, $user, $pass, $options);

    Здесь за информирование об ошибках отвечает параметр PDO::ERRMODE_EXCEPTION, а остальные просто для удобства/корректности.

    Выполнение запроса
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);
    Ответ написан
    2 комментария
  • Как добавить только не пустые параметры в бд?

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

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

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

    В общем случае нам надо список полей, которые мы можем добавить в БД. Чтобы не колупаться с отдельными переменными. А дальше все просто - цикл, который проверяет на пустоту и формирует сам запрос плюс массив с данными для него.
    $fields = ['phrase','secret','custom1', ...];
    $conditions = [];
    $params = [];
    foreach($fields as $key) {
        if (strlen($val = trim(filter_input(INPUT_POST,$key)))) {
            $conditions[] = "`$key` =?";
            $params[] = $val;
        }
    }
    if ($params) {
        $sql = "INSERT INTO table SET ".implode(",",$conditions);
        $pdo->prepare($sql)->execute($params);
    }
    Ответ написан
    Комментировать
  • Почему не выводятся данные из БД на сайте?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ошибка Couldn't fetch mysqli обычно означает, что соединение с бд уже было закрыто
    Ответ написан
  • Как реализовать постоянное подключение к бд?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никакое "постоянное" соединение с БД не нужно.
    Надо просто не запускать игры на хостинге за три копейки.

    "Хостинг", на котором нет таких нелепых ограничений, называется VPS
    Ответ написан
    9 комментариев
  • Почему вместо кириллицы знаки вопросов?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Давно пора запилить аналог вот этого ответа.
    А то же ведь раз в три дня один и тот же вопрос - кракозябры, вопросики, ромбики.
    И везде одна и та же ересь про "meta charset" в ответах.

    Именно в варианте чеклист, чтобы каждый проверял по конкретным пунктам, в которых четко написано, что делать, вместо невнятного мычания "ну у меня там утээф и еще здесь и вот тута"

    В Mysql
    • Кодировка, которую надо выставлять, называется utf8mb4
    • Что там стоит на "всей БД" абсолютно без разницы. Кодировка должна быть указана для таблиц (в отдельных случаях - для поля) при создании. Проверить можно командой SHOW CREATE TABLE table_name

    В PHP
    • Должна быть быть выставлена кодировка соединения с БД
      • в PDO через DSN $dbh = new PDO('mysql:host=...;charset=utf8mb4');
      • в mysqli $mysqli->set_charset('utf8mb4');


    В браузере
    Для того, чтобы браузер корректно отображал кодировку, её надо указать HTTP заголовках.
    • Либо default_charset = "utf-8" в php.ini.
    • Либо руками в коде header('Content-Type: text/html; charset=utf-8');

    Проверять в консоли разработчика: вкладка Сеть, кликаем на запрос, смотрим заголовки
    Ответ написан
    Комментировать
  • Почему не работает execute()?

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

    И убрать этот дурацкий if с дурацким done.
    Ответ написан
  • Как обновлять данные каждую секунду в базе данных пока пользователь находится на странице?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Забыть про эту нелепую фантазию и заняться чем нибудь полезным.
    Ответ написан
    Комментировать
  • Почему выводит пустой массив из объекта в PHP, MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    тебе этот код выводит array(0) { } потому что в таблице testformyself, которая располагается в БД, с которой соединяется этот РНР скрипт, нет записей.

    Проблема в том, что у тебя отключены сообщения об ошибках РНР. Чего делать ни в коем случае нельзя.
    Надо во-первых, включить режим выдачи ВСЕХ ошибок (E_ALL), а во-вторых - включить отображение ошибок на экране, что удобно для режима разработки.
    Ответ написан
  • Как вывести подобный json массив из mysql с помощью php?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Оставь всё как есть, ничего руками не трогай.
    Ответ написан
    2 комментария
  • Как отнять или добавить рандомное число в столбец mysql в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    если отнимать не больше чем есть, то
    update t set a = a - FLOOR( 1 + RAND( ) * a );
    Ответ написан
  • Что я не так делаю с транзакциями PHP MYSQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В общем в качестве ответа на этот малопонятный вопрос можно выдать только общие рекомендации

    Во-первых, транзакции в БД не имеют вообще никакого отношения к транзакциям в бухгалтерии.
    И к увеличениям балансов.
    Транзакция в БД несет очень простую функцию: гарантировать что все запросы внутри транзакции завершились успешно. то есть чтобы не было неконсистентных данных - в одну строку добавились данные, а во вторую нет. Поэтому транзакция в случае ошибки откатывает все изщменения, которые ты успел сделать.

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

    Но при этом тебе и блокировки тоже не нужны, поскольку заниматься такой ерундой, как "прочитать, добавить и записать" в принципе не нужно, поскольку можно совершить атомарную операцию - СРАЗУ в запросе и прибавить нужную сумму, без придварительного чтения.

    Но самое главное - тебе сначала надо решить, каким образом вообще ведется бухгалтерия - добавлением строк, или обновлением строк.
    Ответ написан
  • Реализация объединение кучи баз mysql в одну, под управлением одной админки?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В общем, к "объединение кучи баз mysql в одну, под управлением одной админки" твои проблемы не имеют никакого отношения.

    Базы данных все примерно одинаковые, одним не хватает таблиц, другим столбцов. Это приходится добавлять(но это пол беды).

    В современном мире для этого служат миграции.

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

    В современном мире это целая отрасль, которая в первую очередь базируется на системе контроля версий. Если в твоём агентстве она не используется, то надо бежать оттуда.
    Потому что вредрить её у тебя вряд ли получится, а работать с распределённой кодовой базой без CVS - это даже не каменный век, а какие-то амебы в первичном бульоне.

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