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

    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()
    Ответ написан
    Комментировать
  • Error 1064 (DB1) ,что это значит?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это значит, что при работе с БД из РНР надо либо работать через ORM, либо добавлять данные в запрос только через плейсхолдеры, для чего использовать PDO.
    Ответ написан
    Комментировать
  • Как правильно вставить данные в MySQL c помощью php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Добавить в код две переменные, $db_db с именем базы данных и $db_charset с кодировкой своего сайта (скорее всего utf8)
    2. исправить запрос. Либо вставлять все поля, какие есть в таблице, либо перечислить вставляемые поля явно.
    3. Прочитать про PDO
    4. в ../template/sql-connect.php поместить код
    $dsn = "mysql:host=$db_host;dbname=$db_db;charset=$db_charset";
    $opt = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    $db = new PDO($dsn, $db_user, $db_pass, $opt);

    5. В обработчике формы написать
    $query = "INSERT INTO users (username, email,company)VALUES (?,?,?)";
    $db->prepare($sql)->execute([$userName, $email, $company]);
    Ответ написан
    Комментировать
  • Как исправить эту ошибку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. научиться отличать mysql от mysqli
    2. Не использовать mysqli напрямую, а взять готовый враппер, например safeMysql. Если не хочется использовать сторонние врапперы, то вместо mysqli следует использовать PDO

    Пример:
    function selectAllItems()
    {
    	global $pdo;
    	$sql = 'SELECT id, title, author, pubyear, price FROM catalog';
    	return $pdo->query($sql)->fetchAll();
    }
    function addItemToCatalog($title, $author, $pubyear, $price)
    {
    	global $pdo;
    	$sql = "INSERT INTO catalog (title, author, pubyear, price)VALUES (?,?,?,?)";
    	$pdo->prepare($sql)->execute(func_get_args());
    }

    Про использование mysqli прямо в коде приложения - повторюсь - надо забыть как про страшный сон.
    Ответ написан
  • Как сделать по MVC динамичный leftbar?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Скажем так, в таком самописном MVC есть два варианта.
    1. Во всех экшенах всех контроллеров вызывать контроллер leftbar, передавать ему нужный параметр и получать из него данные для отображения, которые потом пойдут в шаблон вместе с остальными.
    2. Вещь сколь очевидная, столь же и редко приходящая людям в голову: главному шаблону тоже нужен свой контроллер! У тебя ведь отображение состоит из двух основных частей - шаблон конкретной страницы, и шаблон всего сайта. Первый включается во второй. Но при этом у первого есть свой конроллер, а у второго - нету! А если его завести, то всю логику виджетов, лефтбаров, баннеров, меню и прочего - можно (а, главное - НУЖНО) будет вынести в него.
    Ответ написан
    Комментировать
  • Как построить запрос в sql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    select authors.*, count(1) cnt from books, authors where books.author_id=authors.id group by author_id having cnt >1
    Ответ написан
  • Как правильно обработать SQL запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вот некоторые говорят, что я нервный.
    Ну как тут не будешь нервным, когда видишь такой обезьяний* код, средоточие греха и порока?
    Ну вот как можно умудриться наделать СТОЛЬКО ошибок в одной строчке?
    • за одно die(mysql_error()) надо убивать. кто вас учил вываливать ошибку прямо на экран?
    • мало того - для mysql_result нет ни малейшего смысла выводить mysql_error() - там ничего не будет. Все что могло быть, было на этапе выполнения запроса. Я понимаю, что хомячок, высунув от усердия язычок, старательно переписывает непонятные ему иероглифы. Но отсебятину тоже не надо пороть. Не надо думать, что если ты распространишь or die() на все функции работы с БД, то твой код станет лучше или умнее.
    • мало того - mysql_result - самая уродливая функция этого API, которую не рекомендовали использовать, когда наш песатель кода еще не родился.
    • ну, и как вишенка на торте - само несчастое API, про которое сами разработчики пишут красными буквами: не используйте вы его, ради бога!

    Гуга, мальчик мой. Если ты будешь продолжать писать вот это вот всё, то попадешь в ад.
    Вот, смотри как на самом деле правильно обработать SQL запрос:
    $stmt = $pdo->prepare("SELECT id FROM users WHERE email =?");
    $stmt->execute([$email]);
    $id = $stmt->fetchColumn();

    -----
    * от слова "обезьянничать", т.е. повторять некие действия, не понимая их смысла.
    Ответ написан
    3 комментария
  • Почему появились символы �? на сайте?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    проверь свой сайт по этому списку: phpfaq.ru/charset#encodings
    Ответ написан
    Комментировать
  • Как сделать грамотную постраничную навигацию на PDO с подготовленными запросами?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    а какая разница - подготовленный запрос, или неподготовленный?

    И что означает этот странный код?
    if($pricemin > 0) echo $result->bindParam(':pricemin', $pricemin);


    пример пагинации с подготовленными выражениями есть здесь: phpfaq.ru/paginator#new
    библиотека, правда, более удобная чем, ПДО, но принцип тот же.

    Чтобы не собирать условия в ПХП, можешь написать в запрос так
    SELECT * FROM board_post, model, marka WHERE model.id_model=board_post.id_model 
    AND board_post.id_marka=marka.id_marka 
    AND (:brand    = 0 OR id_marka = :brand) 
    AND (:model    = 0 OR id_model = :model) 
    AND (:pricemin = 0 OR price   >= :pricemin) 
    AND (:pricemax = 0 OR price   <= :pricemax) 
    AND (:yearmin  = 0 OR year    >= :yearmin) 
    AND (:yearmax  = 0 OR year    <= :yearmax) 
    ORDER BY date DESC
    Ответ написан
  • Как организовать следующий запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Таблица складов
    Таблица коробок
    Таблица фруктов
    Таблица фрукт_айди, коробка_айди, количество
    Ответ написан
    3 комментария
  • Почему запрос UNION не возвращает ничего, тогда как по отдельности результаты есть?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    if ($_SERVER['PHP_AUTH_USER']<>'login' OR $_SERVER['PHP_AUTH_PW']<>'pass')
    {
        Header('WWW-Authenticate: Basic realm="Admins"');
        Header("HTTP/1.0 401 Unauthorized");
        exit;
    }
    Ответ написан
    Комментировать
  • Materialized path сортировка - новые ноды сверху списка?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    добавь поле node, и сортируй по нему
    Ответ написан
  • Что лучше использовать: serialize php или дополнительную таблицу mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Неправильно спрашивать, что быстрее.
    Если ты не программист, а любитель, то надо спрашивать "как правильно?"

    Правильно будет - отдельная таблица.
    Ответ написан
    Комментировать
  • Как объединить значения из $_POST удалить лишнее и записать все в БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Самое главное - никогда не храни ничего в БД "через |||"
    Ответ написан
    2 комментария
  • MATERIALIZED PATH mysql+php?

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

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

    Есть. Но добавление пользователем полей не имеет РЕШИТЕЛЬНО никакого отношения к ситуации "ой мы стркутуру БД еще не придумали а уже пишем вконтактик"
    Ответ написан
    4 комментария