Ответы пользователя по тегу MySQL
  • Как в php получить Последнее значение из таблицы mysql определенной даты даты?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Выносить имя таблицы и колонки в переменные не нужно. Их надо написать прямо в запросе.
    А дату надо подставлять в запрос через подготовленные выражения.

    Если в БД хранится только дата, то чтобы получить все строки за определённую дату, код будет такой.
    $sql = "SELECT * FROM название таблицы WHERE  DATE = ?";
    $result = $conn->execute_query($sql, [$dateNew]);
    $usersArray = $result->fetch_all(MYSQLI_ASSOC);

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

    SELECT * FROM название таблицы WHERE  DATE BETWEEN ? AND ?

    и в него подставлять значения "$dateNew 00:00:00" и "$dateNew 23:23:59"

    Чтобы получить одну запись, надо добавить в запрос оператор LIMIT 1, а fetch_all(MYSQLI_ASSOC) поменять на fetch_assoc()
    Чтобы получить "последнюю" запись, надо добавить в запрос сортировку по тому полю, по которому считается последовательность добавления. И сделать сортировку в обратном порядке
    Ответ написан
    1 комментарий
  • Почему не всегда правильно происходит вставка данных в MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если я правильно понял, ваш вопрос состоит в том, что при вводе в форму значений name1 name2 name3 вы иногда получаете в БД запись с name1, name2, name2 name1.
    Мы не знаем, почему так происходит.
    Кроме этого, мы не знаем, с чего вы взяли, что в форму вводили именно name1 name2 name3.

    Самым очевидным объяснением (исходя из доступной нам информации) является то, что в форму тупо ввели именно эти значения: в первое поле формы name1, во второе - name2, а в третье - name2 и name1. Это простое и логически непротиворечивое объяснение. Если оно вам не подходит, то вы должны добавить в свой вопрос дополнительную информацию, которая делает это объяснение невозможным. Например привести логи, которые показывают, что в форму было введено совсем не это. Или по крайней мере добавить в вопрос полный код формы и скрипта-обработчика, а не какой-то огрызок.

    Кроме этого, как вам правильно заметили в комментариях, надо учиться работать с БД правильно. И никогда не подставлять переменные прямо в запрос, а передавать их через символы подстановки. Таким образом вы сразу отсеете большое количество вероятных проблем. Читайте как правильно использовать mysqli
    Ответ написан
    Комментировать
  • Как организовать умное кеширование MYSQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как всегда, в заголовке одно, а в тексте вопроса совсем другое. И никакое кэширование автору делать на самом деле неохота - это же переделывать всё придется.

    При этом чего именно нужно автору, из вопроса непонятно. То ли проблема с потреблением памяти, то ли скорость запросов, то ли вообще никаких проблем нет, а просто поговорить на с кем.

    Ускорение запросов решается за счет создания индексов. Не "есть индексация", а конкретные осмысленные индексы для каждого используемого запроса. Если конкретный запрос тормозит, ему надо сделать explain, и на основе полученного результата подумать и реализовать индексы.
    При этом нормально индексы работают только если все они помещаются в памяти. А это значит, что по поводу "7 гигов занято" надо не плакать а радоваться.
    Существование "таблиц" для новых и старых сообщений в рамках одной таблицы - это партиционирование, например по дате. Но опять же, сначала надо определиться задачей, которую мы решаем.
    Ответ написан
    7 комментариев
  • Почему игнорируется блок кода при подключении к бд?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос очень важный. Он показывает, насколько изменились подходы к программированию за четверть века.
    Вот этот детский лепет -
    spoiler
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {
    echo "Connected successfully";
    }
    - происходит прямиком из прошлого века. Именно так писали на РНР3, в 1998 году.

    С тех пор прошло уже 25 лет, а пехопа всё так и пишет РНР немного подрос, и проверять ошибки при работе с БД вручную стало не нужно. А чтобы увидеть ошибку, надо всего лишь включить вывод ошибок РНР. На домашнем сервере достаточно просто написать в начале скрипта

    ini_set('display_errors', 1);

    (и не забыть поставить 0, когда код поедет на боевой).

    Соответственно, блок кода "игнорируется" просто потому, что ошибка является фатальной, и выполнение скрипта останавливается, ещё до всех этих if ($conn.
    Ответ написан
    Комментировать
  • Как корректно искать по регулярным выражениям в SQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Документацию полезно иногда читать.
    В ней шрифтом по фону написано, что
    To use a literal instance of a special character in a regular expression, precede it by two backslash (\) characters. The MySQL parser interprets one of the backslashes, and the regular expression library interprets the other.
    Ответ написан
    1 комментарий
  • Как мне выводить из базы данных информацию по группам?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я только недавно начал изучать программирование

    Это очень похвально. Только ради бога, учите его по нормальным учебникам, а не по видеокурсам, которые делали неграмотные дети на мамкином ноутбуке.
    Примеры говнокода

    • unction selectAll1 - это глупость и говнокод. У функции должно быть осмысленное имя
    • ($table1 , $table2 , $table3 , $table4 , $table5){ - это глупость и говнокод. Учитывая, что функция в любом случае уникальная для используемых таблиц, передавать их в качестве параметров имеет 0 смысла.
    • global $pdo; - это глупость и говнокод. Потом сами не будете знать, что откуда взялось. Все параметры надо передавать в функцию явно.
    • dbCheckError($query); - это глупость и говнокод. Специально проверять запрос на ошибки не нужно. Надо написать один общий обработчик ошибок для всего сайта и любых ошибок.
    • <?=$contacts['filial']?> - это говнокод и дыра в безопасности. В любых данных, выводимых в HTML, должны экранироваться спецсимволы HTML


    Поскольку вы используете PDO, то можете сразу получить трехмерный массив, сгруппированный по одному полю
    function listContactsByDepartment ($pdo){
        $sql = "SELECT 
        t3.department, -- обращаем внимание на эту строчку. Она должна быть первой
        t1.id,
        t1.full_name,
        t1.email_user,
        t1.tel_number,
        t2.filial,
        t3.department_email,
        t4.position,
        t5.number
        FROM contact_work AS t1 INNER JOIN filial_work AS t2  ON t1. id_filial = t2.id 
        INNER JOIN department_work AS t3 ON t1. id_department = t3.id
        INNER JOIN position AS t4 ON t1. id_position = t4.id
        INNER JOIN number_work AS t5 ON t1. id_number = t5.id
        ORDER BY `t2`.`filial` ASC , `t3`.`department` DESC ";
        return $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP); # Обращаем внимание на эту константу
    }
    $contacts = listContactsByDepartment ($pdo);

    Из этой функции вы получите трехмерный массив, который выводится двумя вложенными циклами
    <?php foreach($contacts as $department_title => $department_contacts): ?>
                          <tr>
                            <td colspan=10><?=htmlspecialchars($department_title) ?>
                          <tr>
        <?php foreach($department_contacts as $row): ?>
                          <tr>
                            <td><?=htmlspecialchars($row['filial']) ?></td>
                            ...
                          </tr>
        <?php endforeach ?>
    <?php endforeach ?>
    Ответ написан
    Комментировать
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что при работе через API запросы должны выполняться по одному, а не кучей.
    Все эти точечки с запятой предназначены для консоли, а через API с мультизапросами всегда будут проблемы (даже если у какого-то умника в его песочнице с куличиками проблем до сих пор не было).
    Потому что API предназначено для выполнения запросов по одному.

    Тем более что здесь нужно всего три запроса, а не 100500. Множественная вставка делается не так, а одним запросом. При этом, как нас учат в первом классе, запросы должны быть параметризованными а не вот это вот всё.
    Ответ написан
  • В чем ошибка SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Дополню предыдущий ответ правильным кодом, без вот этих всех бессмысленных телодвижений, которые понатыканы в исходном вопросе.
    $query = "UPDATE `users` SET `address`= ?,`phone_number`=?  WHERE email=?";
    $params = [
        $address,
        $phone_number,
        $email,
    ];
    $stmt = $pdo->prepare($query);
    $stmt->execute($params);

    Только орфографические ошибки в именах полей поправил
    Ответ написан
    Комментировать
  • Как взять каждое значение массива mysqli_fetch_array и занести каждое значение в строку таблицы mySQL?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    $id = $_SESSION['id'];
    $sql = "INSERT INTO zakaz (iduser,idkat) SELECT iduser, idkat FROM corzina WHERE iduser=?";
    $stmt = $bd->prepare($sql);
    $stmt->bind_param('i', $id); 
    $stmt->execute($res);

    Не очень понятно, впрочем, в чем смысл этого запроса. А точнее почему ни в корзине, ни в заказе нет количества товара, а в заказе не фиксируется цена.
    Ответ написан
    2 комментария
  • Как решить проблему "Невозможно подключиться к серверу MySQL"?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вы проделали большую работу по отладке, но в этом деле важно не останавливаться.
    Вам mysql в логах человеческим голосом говорит, что она умерла и просит посмертно принять её в пионэры.

    То есть вопрос "как подключиться" становится немного бессмысленным: тут даже Штирлиц сообразит, что если базы нет, то подключиться к ней будет проблематично.
    И куда логичнее будет спросить "что делать, если mysql умерла?" Что, согласитесь, представляет собой совсем другой вопрос.

    Со стандартным, впрочем, ответом: берете сообщение об ошибке и гуглите его. Судя по количеству результатов, вы не единственная жертва любителей флажков. Читайте, пробуйте предложенное. Гуглите другие слова из логов. Перейдите по ссылке, которая в логе. Задайте другой вопрос в конце концов, в котором опишите актуальную проблему, а не симптом широкого профиля.

    Хотя лично я бы выкинул все эти куличики с флажками и окошками и либо поставил весь софт сам, либо взял докер-образ. Это куда полезнее, чем флажки тыкать.
    Ответ написан
    Комментировать
  • Как решить ошибку Warning: mysqli_connect(): (HY000/2002): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Перед тем, как пытаться подключиться к серверу MySQL, его надо запустить.
    Если вы понятия не имеете, что такое сервер MySQL, то ищите нужную кнопочку в своей панельке управления, которая за вас решает, какие программы вам нужны.
    Ответ написан
    Комментировать
  • Как ускорить поиск по бд MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хотелось бы понять как можно ускорить поиск товаров в базе данных MySQL, когда приходится использовать большое количество Id категорий в in.


    Дело не в большом количестве, а в том, сколько уходит времени на поиск одной. Если у колонки нет индекса, то поиск любого количества будет медленным. А если есть индекс, то будет быстрым.

    Плюс непонятно, с чего вы решили, что проблема именно в in. Если у вас сто тыщ товаров, и все их надо отсортировать или сгруппировать, то проблема вообще не в in. А в той самой сортировке или группировке. И надо подбирать составной индекс специально под них.

    Чтобы ускорить поиск по бд MySQL, надо не писать на тостер глубокомысленные умозаключения про три джойна и сто тыщ товаров, а выполнить команду EXPLAIN и начинать тупить в её вывод. или по крайней мере привести его в своем вопросе, чтобы он стал предметным.
    Ответ написан
    3 комментария
  • Функция SUM в sql запросе не работает почему?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Магия:
    $sum = $bd->query("SELECT SUM(cent) FROM corzina")->fetch_row()[0];
    echo "$sum ₽\n";

    Без всяких алиасов и while.
    Ответ написан
    Комментировать
  • Здравствуйте! На хосте fornex php сервер не передает данные в БД, хотя на локалке все работало отлично. Как это исправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы попытаться стать РНР разработчиком (а не бабкой-гадалкой из соседнего ответа), надо открыть для себя волшебный мир отладки.
    И для начала научиться получать от РНР сообщения об ошибках.
    Во-первых, надо убедиться, что никакие ошибки не подавляются. Для этого в коде всегда должна быть строчка

    error_reporting(E_ALL);

    В-вторых, если для работы с БД используется mysqli, то не лишне добавить настройку ошибок и для неё.
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

    ini_set('display_errors',1);

    На боевом - наоборот, выключаем вывод на экран и включаем вывод в лог
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);

    После этого запускаем свой код и смотрим, что написано в сообщении об ошибке.
    Ответ написан
    Комментировать
  • Ошибка: 150 «Foreign key constraint is incorrectly formed» при создании новой таблицы?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это дебильное сообщение об ошибке, но если выполнить команду SHOW ENGINE INNODB STATUS, то там, под заголовком LATEST FOREIGN KEY ERROR будет нормальное объяснение, что конкретно не так.
    Ответ написан
    Комментировать
  • Как сохранить mysql базу?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    На будущее, формат, в котором сохраняется БД, называется "дамп".
    А дальше всё просто, как сохранить дамп в mysql workbench
    Ответ написан
    Комментировать
  • Объясните CASE WHEN THEN?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 0 WHERE ad_id = 34');
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 1 WHERE ad_id = 35');
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 2, amount=466 WHERE ad_id = 36');

    И не делайте себе мозги.
    Вы и сейчас-то смотрите на этот запрос как баран на новые ворота. А через месяц и вовсе перестанете понимать, что имели в виду.
    Ответ написан
    Комментировать
  • Как скрестить ElasticSearch и MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос в заголовке абсолютно нормальный
    Эластик в связке с Mysql используется сплошь и рядом.
    Элементарно по той простой причине, что возможности как фасетного, так и полнотекстового поиска в Mysql оставляют желать лучшего. Да и живым поиском грузить основную БД тоже слишком затратно.

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

    Дружат их элементарно, к примеру на РНР пишется простой индексатор, который по крону читает данные из Mysql и обновляет индексы в Эластике.
    https://www.elastic.co/guide/en/elasticsearch/clie...

    А то что в теле вопроса написан бред - ну так это автор явно имел в виду нормальный вариант, но недоспал/перебрал и перепутал направление.
    Ответ написан
  • Как получить доступ к БД mySQL через терминал?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы соединиться с удаленным сервером, Mysql устанавливать не надо.
    Через терминал сначала соединяются с терминалом удаленного сервера по SSH. В общем случае это выглядит так
    ssh user@host.com

    Дальше вводите пароль, и если всё ок, то вы в своем терминале работаете с сервером хостинга.
    и уже на нем пишете своё
    mysql -u -p -h -P

    Но через терминал работать хотя и полезно уметь, но иногда не очень наглядно.
    Лучше поставить какую-нибудь графическую утилиту - DataGrip, Dbeaver, что-то из этой серии
    А для работы с удалённой БД можно будет поднять SSH туннель

    ssh -N -f -L 3366:127.0.0.1:3306 user@host.com
    вводите пароль и готово! можете соединяться с удалённым сервером хоть в консоли, хоть из любой программы. Только порт надо указывать 3366.
    Ответ написан
    3 комментария