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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Этот запрос строит одну большую строчку из трех таблиц.
    Сначала берет строчку из reviews_clicks, и дописывает к ней строчку из members по условию
    members.`id` = reviews.`member_id`
    дальше точно так же дописывается строчка из reviews_likes
    и так для каждой строчки в reviews_clicks, подходящей под условие в WHERE

    А еще из этого запроса берется SQL инъекция.
    Ответ написан
    1 комментарий
  • Как сделать одну кнопку "Удалить" для разных значений таблицы с помощью PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    <form method="POST" action="edit.php?id=1">
        <input type="submit" name="edit" value="Редактировать">
    </form>
    Ответ написан
    Комментировать
  • Правильный способ хранения текста и HTML-кода в базе MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ на вопрос из заголовка:
    Никак особенно не хранить. Хранить абсолютно так же, как и любые данные, - как есть. То есть, НИКАК их не модифицируя для хранения.

    Решение конкретно твоей проблемы:
    mysql_set_charset('utf8'); после коннекта
    +
    плюс таблицы должны иметь кодировку utf8
    Подробнее: phpfaq.ru/charset

    Разбор вопроса:
    везде совет для записи в базу использовать mysql_real_escape_string(),

    Это информация устарела и не соответствует действительности.
    Единственно правильным вариантом добавления данных в запрос являются подготовленные выражения.

    Как я понимаю необходимо обрабатывать текст вот так перед вставкой:

    Неправильно понимаешь.
    Перед вставкой текст обрабатывать не надо вообще никак.
    Для корректной работы SQL, как я уже писал выше, должны использоваться подготовленные выражения.
    HTML же к SQL не имеет ни малейшего отношения. и никакая HTML функция, разумеется, при сохранении в БД использоваться не должна.

    К примеру "⇔" при записи в базу превращается в "?"

    Вот с этого и надо было начинать. У тебя проблема с кодировками.
    Ответ написан
    2 комментария
  • Как работает fetch_row в CodeIgniter?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это чень просто.
    1. Нужно навсегда забыть про добавление переменных прямо в строку запроса. А а добавлять их только через плейсхолдеры.
    2. При возникновении ошибки смотреть тот запрос, в котором произошла ошибка.. У тебя здесь написан другой.
    Плюс выводить запрос на экран. SQL запрос, а РНР код, который его собирает.
    Ответ написан
    Комментировать
  • Как записать ip в базу?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    функцию get_ip() выкини, используй вместо нее $_SERVER['REMOTE_ADDR']
    подробнее: phpfaq.ru/ip
    Ответ написан
    Комментировать
  • Почему так работает, а так нет?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что во втором случае ты занимаешься ерундой.
    Причем дважды
    Раз уж ты используешь именованные плейсхолдеры, то зачем их привязывать по одному? Ну ведь они специально сделаны для того, чтобы просто передать ассоциативный массив в execute()!
    Тем более, что у тебя совершенно правильная идея отфильтровать ненужное из массива $_POST. Ну так вот сначала отфильтруй, а потом тупо передавай на исполнение, без всяких циклов. Только способ фильтрации у тебя неправильный. Надо не лишнее выкидывать, а нужное контролировать.

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

    $in = ['bText','type','bId'];
    $data = array_intersect_key($_POST, array_flip($in));
    $sql = "UPDATE `$dbname` SET `bText`=:bText WHERE `type`=:type AND `bId`=:bId";
    $stm = $pdo->prepare($sql);
    $stm->execute($data);


    А так-то да, Денормализатор правильно написал. Я же тебе давал ссылку, в которой написано, что bindValue() всегда следует предпочесть bindParam(). Там же написано, что ни ту ни другую использовать не нужно.
    Ответ написан
  • Как правильно писать запросы для поиска по базе (MySQL) и не ронять сервер?

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

    Во-первых, сам запрос
    SELECT m.* FROM genre g, music_genre mg,  music m
    WHERE g.name = 'trance' AND mg.genre_id=g.id AND m.id=mg.music_id

    Во-вторых, никаких mysql_query, только PDO. Код должен выглядеть так:
    $sql = "SELECT m.* FROM genre g, music_genre mg,  music m
    WHERE g.name = ? AND mg.genre_id=g.id AND m.id=mg.music_id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$search]);
    $allmusic = $stmt->fetchAll();

    В-третьих, обе колонки в music_genre должны быть проиндексированы. или даже так - два индекса, один из которых "music_id, genre_id", а второй - "genre_id, music_id"
    Ну и на genre.name тоже можно повесить, уникальный
    Ответ написан
    7 комментариев
  • Можно подобное преобразование массива сделать без цикла?

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

    По коду видно жертву видеокурсов попова. На этом, в общем, вопрос можно закрывать.
    Тебе уже ничто не поможет. Вне зависимости от того, нужно здесь unset, или нет.
    Ответ написан
    1 комментарий
  • Как решить проблему с конкуренцией запросов на чтение в PHP?

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

    А тебе нужна блокировка на чтение
    START TRANSACTION;
    SELECT views FROM page where id=1 FOR UPDATE;

    Заблокирует тебе строку на чтение и запись. Дальше можешь ее апдейтить и коммитить. После этого следующий, кто успеет схватить блокировку, заставить остальных ждать. И так далее.

    Господь, жги.
    Эту толпу обезьян уже не спасти.
    Ответ написан
  • Откуда быстрее получать информацию, mysql или файл?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    У меня дежа-вю
    100% впечатление, что год назад я видел точно такой же пост
    Ответ написан
    1 комментарий
  • Как при JOIN лимитировать данные по одной таблице?

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

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

    Значит, надо погулять полчасика на свежем воздухе, а потом ложиться спать
    Ответ написан
  • Как исправить ошибку синтаксиса?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $data = arrray(
      'username' => $username, 
      'email' => $email, 
      'password' => $newpass, 
      'group' => $group,
    );
    $db->query("UPDATE users SET ?u WHERE id = ?i", $data, $id);
    Ответ написан
    Комментировать
  • Как решить ошибку с сокетом mysql SQLSTATE[HY000] [2002]?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    выкинуть на помойку 200 new PDO. - это полчаса работы. давно бы уже исправил свой адский код вместо того чтобы лечить симптомы
    Ответ написан
    Комментировать
  • Куда PDO пишет ошибки если нет try / catch?

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

    Проблема, как я понимаю, в отсутствии текста ошибки. Я бы грешил на xdebug и для начала попробовал бы без него.
    Ответ написан
    Комментировать
  • Как извлечь из MySQL данные по нескольким критериям силами PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Следует понимать, что EAV - не панацея, а несколько наоборот - постоянная боль пониже спины.
    Во-первых, если в реляционной модели за целостностью данных может следить СУБД, то здесь вся работа ложится на программиста.
    А уж получив в том же EAV хотя бы пару-тройку уровней вложенности, можно начинать заранее строить себе стену, об которую потом захочется убиться.

    А во-вторых, проблему поиска EAV не решает от слова "совсем". Искать надо другими средствами, например - сфинксом.
    И вот тут на первый план выходит не удобство хранения, а удобство построения RT индекса. От которого и надо плясать.
    Ответ написан
    Комментировать
  • Зачем нужны отдельные классы для работы с БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На самом деле это интересный вопрос. А, точнее, два: зачем нужен такой класс, и зачем их пишут.
    Ответ на первый становится очевиден, когда начинаешь не смотреть на код, а писать его ;)
    Практически все библиотеки, представленные в РНР, представляют в пользование программиста довольно низкоуровневые функции, которые позволяют, с одной стороны, довольно гибко управлять процессом, но с другой - делают этот процесс ну очень многословным. Самый яркий пример - CURL. Никто, находясь в здравом уме, не будет писать все время эти бесконечные curlopt. Надо пилить библиотеку, которая реализует стандартные методы пост, гет за один вызов, и только для исключительных случаев позволяет задать кастомные параметры.

    То же самое касается и работы с БД. К примеру, очень часто нам бывает нужно получить из БД массив. Сколько строк нужно написать для этого? Классическим говнокодом - 5:
    $ret = array();
    $res = mysql_query();
    while ($row = mysql_fetch_assoc($res)) {
        $ret[] = $row;
    }

    И такой код надо написать раз 15-20 за приложение. У программиста сразу руки зачешутся уничтожить этот повторяющийся код и написать функцию, которой передаешь запрос, а получаешь массив. За 1 вызов. Вот для этого библиотеки и пишут.

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

    Возьмем для примера код примера из мануала. Даже выкинув из него очевидные глупости, мы получаем пол-дюжины строк кода. Это на ОДИН запрос.
    if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
        $stmt->bind_param("s", $city);
        $stmt->execute();
        $stmt->bind_result($district);
        $stmt->fetch();
    }

    И это все - чтобы получить единственную строчку!

    В то время как с помощью (нормальной) библиотеки вся работа с БД сведется к 1 (одной) строчке, а все необходимые телодвижения будут выполнены библиотекой автоматически:
    $distr = $db->getOne("SELECT District FROM City WHERE Name=?", $city);

    Теперь перейдем ко второму вопрос - зачем их пишут.
    Самый основной мотив - "шоб було!" "У всех есть - значит, и у меня будет!". При этом, подходя к написанию библиотеки, новички наступают на одни и те же грабли.
    Чаще всего, из-за недостатка опыта авторов, код сокращается только для самых примитивных запросов. Но при этом работа с нестандартными запросами превращается в ад. Но самое ужасное - практически никогда такие самописные библиотеки не поддерживают работу с подготовленными выражениями. А это должно быть их главной фичей, без которых ценность сразу стремится к нулю. А точнее, даже к минусу, потому что инъекции. Ну и по мелочи: к примеру, если в коде действительно написано $db->FetchArray(); - то это ужас, летящий на крыльях ночи, потраченной на отлов неочевидных ошибок .
    Ответ написан
  • Где ошибка в коде?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. ты пытаешься обратиться к несуществующей переменной.
    2. http_build_query()
    Ответ написан
    Комментировать