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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    я уже не в первый раз вижу этот говнокод на тостере, "db::i()"
    там ещё шаблонизатор вызывается такими же командами, как будто у программиста вычитают из зарплаты за каждый написанный символ.
    кто-нибудь знает, что это за творение нечеловеческой мысли?
    Ответ написан
  • Почему неправильно работает сравнение?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос
    Сколько строк вернёт база данных, если в запрос передать несуществующий логин?

    Дополнительный вопрос
    Какой смысл вообще городить авторизацию, если любой придурок авторизуется без всякого пароля, через SQL инъекцию?

    Подробнее про вопрос секьюрности этого куска:
    Если переменная подставляется напрямую в запрос, то это значит что в нее можно дописать SQL, который будет делать совсем не то, что ожидалось.
    Например, если вместо имени пользователя написать что-то вроде имя' AND LEFT(password, 1) = 'a
    то тогда код напишет "Лоигн занят" если первая буква пароля - "а". Пара десятков таких запросов - и первую букву мы уже угадали. Тем же способом же достаём остальные и вот мы получили пароль любого клиента.

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

    Здесь надо делать так

    $input = json_decode(file_get_contents("php://input"), true);
    
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect(*информация БД*);
    $link->set_charset("utf8mb4");
    
    $stmt = $link->prepare( "SELECT login FROM sn_users WHERE login=?");
    $stmt->bind_param("s", $login);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    if ($row) {
        echo "Лоигн занят";
    } else {
        echo "Лоигн свободен";
    }
    Ответ написан
    7 комментариев
  • Лучший способ автоматического бэкапа для mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все зависит от начальных условий.
    Если условия "я тут мимо проходил, покажите какие кнопочки нажимать", то тогда скорее всего подойдут решения, предложенные выше. Но на более менее нормальном сайте (постоянная запись в БД, транзакции) не будет выполняться условие "Бэкап должен не мешать работе сайта"
    В этом случае надо использовать percona xtrabackup

    Я, правда, в свою очередь не уверен в требованиях "Защищенная работа обработчика" и "возможность работы через ISPmanager".
    Первое это какая-то непонятная чушь, а про второе я просто не в курсе. Никогда не пользовался этим мусором и никому не советую.
    Ответ написан
    Комментировать
  • Как правильно связать php сайт с mysql?

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

    Чтобы соединить сайт с mysql, в РНР вообще-то есть два API - mysqli и PDO. Несколько лет назад с mysqli вообще невозможно было нормально работать, но на данный момент они выровнялись, хотя PDO все равно удобнее, по трем причинам
    1. Единый интерфейс при работе с различными СУБД (неактуально, если mysql для нас является синонимом слова база данных)
    2. Набор функций-хелперов для получения данных из БД в различных форматах (при желании легко воспроизводится вручную)
    3. Именованные плейсхолдеры (для некоторых это главная причина использовать PDO)

    Но в целом, как я говорил выше, сейчас можно использовать любое API. Главное - не использовать тот древний говнокод, который приведён в вопросе.

    1. Создаём файл`config.sample.php` куда кладем все настройки приложения, в том числе базы данных
    return [
    	'db' => [
    		'host' => '127.0.0.1',
    		'username' => '',
    		'password' => '',
    		'dbname' => '',
    		'port' => 3306,
    		'charset' => 'utf8mb4',
    	],
    ];

    2. В файле, который включается во все скрипты сайта, добавляем код
    if (!file_exists('config.php'))
    {
    	throw new \Exception('Create config.php based on config.sample.php');
    }
    $config = require 'config.php';

    3. И дальше в этом же файле пишем собственно нормальный код подключения к БД
    либо к mysqli
    // включаем режим информирования об ошибках
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    // подключаемся к серверу
    $dbc = $config['db'];
    $db = new \mysqli($dbc['host'], $dbc['username'], $dbc['password'], $dbc['dbname'], $dbc['port']);
    // не забываем установить кодировку, чтобы не было ошибок с кракозябрами
    $db->set_charset($dbc['charset']);

    либо к PDO
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dbc = $config['db'];
    $dsn = "mysql:host=$dbc[host];dbname=$dbc[dbname];charset=$dbc[charset];port=$dbc[port]";
    $pdo = new \PDO($dsn, $dbc['username'], $dbc['password'], $options);

    После того как будет освоена работа с системой контроля версий (а по-хорошему это надо было сделать уже давно) добавляем config.php в файл .gitignore
    Таким образом на каждом хосте, где исполняется этот код, будет собственный файл с настройками, создаваемый по образцу из config.sample.php

    Да, и Очень Важное Дополнение:
    почему нельзя сделать 1 соединение для сайта и не тратить каждый раз время на коннект к БД?

    Никогда не следует переживать по поводу воображаемых проблем. Вот только когда создание коннекта каждый раз станет реальной проблемой, только тогда и начинать переживать по этому поводу и искать пути решения (спойлер: никогда).
    Ответ написан
    14 комментариев
  • Почему не обновляется запись в бд при нажатии на кнопку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    потому что нельзя получить программу, задавая вопросы на форуме
    Учиться всё равно надо
    Надо купить или хотя бы скачать учебник Котерова, и начать осваивать программирование.
    Прочитать и усвоить оттуда, что такое SQL, как пишутся запросы
    Что такое РНР и как выполнять SQL запросы из РНР
    Как сделать так, чтобы баланс пополнился только у одного пользователя, а не у всех сразу
    Как отличать пользователей друг от друга
    Что такое база данных
    И так далее

    А если просто из головы выдумывать какие-то нелепые фантазии вместо кода, то они работать-то не будут

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Учить РНР надо не по написанным нубами при царе Горохе руководствам, а по нормальным учебникам.
    Или хотя бы по нормальным ответам на тостере.
    https://qna.habr.com/q/918033#answer_1847841

    Никакого $data в запросе быть не должно. Любые переменные должны отправляться в БД отдельно
    Для этого надо
    Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    Подготовить запрос к исполнению с помощью функции 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".

    И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже про инъекции.
    Ответ написан
    2 комментария
  • Почему не работает REGEXP в mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что во-первых, идиотский формат хранения "через запятую". В нормальной БД никакая регулярка не нужна и все прекрасно работает.
    Во-вторых, непонятно, с какого перепугу вообще эта странная кривизна должна работать. Что должны означать все эти развесистые баяны?
    Ответ написан
    4 комментария
  • Что лучше выбрать Partitioning или вынос данных в другую базу (таблицу)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как всегда, человек выстрелил себе в ногу, но ищет почему-то партитуру Маленькой ночной серенады Моцарта.
    Казалось бы, при чем здесь партиционирование, если проблема в том, что в БД хранятся файлы?

    Ну вот как можно быть настолько слепым, и не видеть реальной проблемы, а уноситься фантазиями в какие-то совершенно голубые дали, вообще никак не связанные с реальностью?

    Партиционирование применяется, когда в БД много строк.
    А физический размер БД не имеет значения.

    Надо во-первых, выкинуть файлы из БД
    А во-вторых, решать только реальные проблемы, а не "что-то у меня база растолстела"
    Ответ написан
    2 комментария
  • Несколько ключевых слов redbeanphp?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ключевые слова red bean: говнокод, лохи, самозванец с ютубы
    Ответ написан
    2 комментария
  • Как сделать в запрос Mysql что бы вывести по 10 записей каждой страны?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    И наш традиционный вопрос: что я делаю не так, печатая заголовок вопроса не в форму на тостере, а в адресную строку своего браузера?
    Ответ написан
    Комментировать
  • Как вывести информацию с БД массивом?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    для этого надо SQL учить не по видео с юутубы, а по учебникам
    открыть для себя джойн, и узнать, что все делается одним запросом.
    Ответ написан
  • Как выбирать и вытаскивать из БД значения по ID?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Кира, что я делаю не так?
    почему мне интернет сообщает ответ на ваш вопрос, а вам показывает фигу?
    Ответ написан
    Комментировать
  • Есть ли готовые скрипты запуска sql-запроса по заданию?

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

    далее надо понять, что это не одна задача, а две
    ну то есть можно в и самой базе через Event Scheduler, как написал Акина, но в общем случае это две задачи

    1. научиться исполнять sql из консоли. для mysql это будет либо mysql -e"SQL query" либо mysql < file.sql
    2. разобраться, как в своей операционной системе запускать консольные команды по расписанию. в линуксе это крон, в винде это либо команда АТ, либо вот это вот убожество под названием "Планировщик задач"
    Ответ написан
    Комментировать
  • Можно ли текстовую переменную хранить в таблице Mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Забавно, что месяц назад ему уже отвечали на этот вопрос
    Но видимо у детей, воспитанных ютубой, память настолько короткая, что даже такие простые вещи не держатся
    Ответ написан
  • PHP как привязать код к странице?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если данные должны суммироваться, то никакой запятой в них быть не должно. Десятичный разделитель для данных в mysql - ТОЧКА.
    И числовые данные надо хранить в предназначенных для этого типах полей.
    Со списком можно ознакомиться в документации: https://dev.mysql.com/doc/refman/8.0/en/numeric-ty... и выбрать наиболее подходящий. Это может быть либо тип с фиксированной точкой (DECIMAL), либо с плавающей (FLOAT).
    Ответ написан
    9 комментариев
  • Каким образом можно перебрать массив в строке для поиска в IN?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Найти того гения, который придумал так хранить данные, и дать ему хорошенько по голове, чтобы он на всю жизнь запомнил, что так делать нельзя
    2. Сделать нормальную базу данных, где эти идентификаторы хранятся в таблице-связке
    3. Выполнить простейший стандартный SQL запрос.
    Ответ написан
    2 комментария
  • Как обработать ошибку mysql подключения в PHP 8.1?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ни в коем случае не надо совершать ни одно из телодвижений, предложенных Rsa97
    Режим выброса исключений специально сделан, чтобы не писали этот говнокод из прошлого века.
    Если в коде написано if($mysqli->connect_errno) {, это означает что никакой нормальной обработки ошибок там всё равно не было. И надо просто убрать этот бесполезный мусор. Поскольку вариант с исключением в сто раз информативнее и удобнее для обработки.
    И у запросов тоже, кстати, надо поубирать всю тупизну с if($mysqli->error) или, того хуже, or die()

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

    Тот редкий случай, когда действительно требуется именно обработка ошибки соединения, а не "die('что-то пошло не так')" мы здесь не рассматриваем, поскольку к моменту, когда программисту такое может понадобиться, он уже владеет базовыми приемами программирования и вполне разберётся сам.
    Ответ написан
    Комментировать
  • Как сравнить текущую дату в sql запросе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    t.close_date >= curdate()
    Ответ написан
    Комментировать