Класс для работы с mysql php

H Удобный php класс для работы с MySQL в черновиках Из песочницы

В последнее время задался вопросом написания php класса для работы с базой данных mysql. Мои требования – удобство формирования запроса к базе данных и возможность сортировки и записи данных через массив, что упрощает работу с БД.

В результате появился вот такой класс:

Вот такой класс, а теперь подробнее о функциях.

Для подключения к базе данных (БД) объявляем класс Db и с помощью функции connect подключаемся к БД. Значения для функции: connect(Хост, Имя пользователя, пароль, имя базы данных);

После подключения можно приступать к работе. Для сортировки с помощью массива объявляю массив, а для записи данных использую функцию where, в которую передаю массив:

Далее функцию where опишу подробнее. А сейчас объявим из каких полей делать выборку, для этого используем функцію select, по умолчанию ее значение — * и ее можно не объявлять.

По умолчанию where использует знак = для сравнения, но если нужно другое значение, например больше или меньше то можно вторым значением передать нужный нам знак сравнения. В функции можно использовать как строчный вариант сравнения, например ‘price,1000’, так и массив как в примере выше и всему массиву будет подставлен переданный знак.

Для сортировки значений внутри выборки используем функцию order_by, для нее также формируем массив:

Эта функция сформирует такой запрос: ORDER BY price DESC, data ASC. В ORDER BY можно подставлять свои аргументы используя функцию order_by_text():

Теперь функции вывода данных — их три: num_rows, multiline, lines:

Функция num_rows показывает количество записей, соответствующих запросу, false — означает, что объявленные данные для сортировки стирать не нужно. Без false все объявленные данные стираются и их нужно объявлять заново. ‘data’ – таблица в БД к которой делаем запрос.

Функция multiline выводит массивы данных соответствующих запросу.

Функция lines выводит один первый массив соответствующий запросу.

Функции формируют такой запрос:
SELECT msg,zag FROM data WHERE status=’1′ AND category=’2′ AND price>’1000′ ORDER BY price DESC, data ASC, id DESC

Функция limit — устанавливает LIMIT в запрос, где 2 — стартовый номер для вывода (т.е. вывод начнется со 2-го элемента соответствующего запросу), 4 — количество элементов в массиве.

Select, where и order_by объявляем заново, т.к. предыдущая функция lines была без false — это означает, что все данные для сортировки были стерты. Формирует такой запрос:

SELECT id FROM data WHERE status=’1′ AND category=’2′ AND id IN (1,2,3,4) ORDER BY price DESC, data ASC LIMIT 2,4

Здесь была использована еще одна функция where_text – она нужна для того, чтобы самому написать запрос в WHERE

Формирует такой запрос: SELECT * FROM data WHERE MATCH(test,text) AGAINST(‘+тест +поиска’ IN BOOLEAN MODE). Ищем в таблице data, в полях test и text совпадения со словами тест и поиска.

SELECT id FROM data WHERE status=’1′ AND category=’2′ AND MATCH(test,text) AGAINST(‘+тест +поиска’ IN BOOLEAN MODE) ORDER BY price DESC, data ASC

Для записи в базу данных: используем функцию set — передача параметров сохранения массивом и insert — запись в базу данных:

Для внесения изменений в строку используем функцию update:

UPDATE data SET test=’test’, text=’text’, category=’2′, test=’test change’, text=’text change’ WHERE

И еще одна функция query — в ней можно написать свой запрос select полностью:

Также можно сделать параллельное соединение с другой базой данных:

Такой вот класс у меня получился. Не буду сравнивать его с другими класcами для работы с БД, знаю — их множество. Публикую его, т.к. думаю, что, может, кому-то пригодится, а также хочется конструктивной критики, которая позволит улучить этот код.

Источник

Класс для работы с базой данных MySQL

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

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

Конфигурационные настройки класса

Для работы данного класса необходимо иметь конфигурационные настройки, которые касаются непосредственно сервера баз данных:
Опишем основные константы:

DBHOST содержит имя сервера MySQL;

DBNAME содержит имя базы данных;

DBUSER содержит имя пользователя;

DBPASS содержит пароль пользователя базы данных;

COLLATE кодировка по-умолчанию.

Далее опишем функции класса.

Свойства объекта класса MySQLi

— Переменная $db_object будет хранить открытое соединение с базой данных. По умолчанию значение False.

— В переменной $query_num будет хранится число выполненных запросов к базе данных. Это полезно для оптимизации скрипта и определения нагрузки. По умолчанию равна 0.

— Массив $query_list будет хранить список запросов, их время выполнения и сам запрос. Данная переменная служит исключительно для наладочных целей, поэтому ее использование будет оправдано только при работе администратора сайта.

— В переменной $mysql_version будет хранится версия сервера базы данных MySQL. Эти данные будут интересны, например, при тестировании скорости работы различных версий.

— Переменная $MySQL_time_taken будет сохранять общее время, которое тратится на запросы к базе данных. По умолчанию равна 0.

— Переменная $query_object сохраняет значение выполнения запроса к базе данных.

Далее будут следовать необходимые функции, и начнем с функции определения реального времени:
Подключение к базе данных MySQL

Следующим этапом будет функция подключения к базе данных:
Данная функция принимает в качестве параметров имя пользователя, пароль, имя базы данных и хоста.

В зависимости от наличия порта в имени хоста, будет выполнен один из двух вариантов подключения.

Если подключение завершится ошибкой, тогда сработает функция Display_error, которая будет описана далее.
В переменную Mysql_version будет записано значение версии базы данных:
И последнее, что делает данная функция, это устанавливает необходимую кодировку для работы:

Функция выполнения запроса MySQL

Далее следует функция выполнения запроса к базе данных.
Именно данная функция будет выполнять основные действия с базой данных: добавление, удаление, редактирование информации.

Сначала функция записывает в переменную $time_before реальное время начала работы функции:
Далее выполняет подключение к базе данных, если оно не установлено предыдущим вызовом данной функции.
Далее функция выполняет запрос, и в случае его завершения с ошибкой, выдает сообщение об этом:
Далее функция рассчитывает время выполнения запроса, и добавляет его к уже существующему. Переменная MySQL_time_taken будет сохранять общее время выполнения всех запросов:
Далее заполняем массив $query_list, который будет хранить список запросов, их время выполнения и сам запрос.
Последнее действия функции является подсчет количества всех запросов и возвращения результата выполнения:
Функция возврата автоматически генерируемого ID

Далее следует функция возврата автоматически генерируемого ID, используя последний запрос.
Данная функция может пригодится записывая уникальное значение идентификатора ID пользователя при регистрации, то есть при добавлении данных в базу данных.

Функция Mysqli_insert_id возвращает ID, генерируемый запросом к таблице, которая содержит колонку с атрибутом AUTO_INCREMENT.

Извлечение результирующего ряда в виде ассоциативного массива

Следующей функцией будет функция извлечения результирующего ряда в виде ассоциативного массива.
Возвращает ассоциативный массив, соответствующий результирующей выборке или NULL, если других рядов не существует.

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

Освобождение памяти занятой результатам запроса

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

Функция мультизапроса

Опишем функцию, которая выполняет мультизапит к базе данных:
Данная функция принимает в качестве параметра запрос к базе данных. Второй аргумент функции является логический тип, который по умолчанию принимает значение False.

Получаем число строк, полученных предыдущей операцией

Опишем процедуру получения числа строк, затронутых предыдущей операцией запроса к базе данных:
Данная функция возвращает число строк, полученных в последних INSERT, UPDATE, REPLACE или DELETE запросах.

Результатом работы функции является целое число. Если оно большее нуля, значит одна из вышеописанных операция закончилась успешно. Ноль означает, что запросу вида UPDATE не обновлен ни одной записи, или ни один строка не соответствует условию WHERE в запросе, или запрос еще не был выполнен.

Получаем число рядов в результирующей выборке

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

Выборка одной строки из результирующего набора

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

Функция экранирование спецсимволов в строке

Еще одна функция данного класса является функция экранирования спецсимволов в строке:
Данная функция возвращает строку, в которой перед каждым спецсимволов добавлен обратный слэш (\), для дальнейшего использования этой строки в запросе к базе данных. Экранируются одиночные кавычки (‘), двойные кавычки («), обратный слеш (\) и NUL (байт NULL).

Закрытие ранее открытого соединения с базой данных

Функция Close класса для работы с базой данных закрывает ранее открытое соединение с базой данных.
Функция вывода ошибок

Далее следует функция вывода ошибок, благодаря которой можно четко обнаружить местоположение ошибки:
Сначала обрабатываем вывод ошибок, а именно преобразуем специальные символы в HTML-сущности:
Далее запускаем функцию Debug_backtrace, которая возвращает массив вложенных ассоциативных массивов:
Поскольку вызов функции Query содержится в функции Super_query, содержание массивов будет всегда строго по порядку:
Благодаря данной функции, мы точно узнаем имя файла, номер строки с ошибкой, номер самой ошибки с текстовым представлением и запрос, который содержит ошибку.

Ну вот и подошел к концу класс для работы с базой данных MySQL.

Опишем основные возможности класса и их реализацию.

Результат выполнения:
Третий вариант:
‘;

Результат:
Проверка существования уникальной записи:
Проверка существования нескольких подходящих записей:
Обновить ячейку в таблице если значения поля совпадает с условием. Данное выражение очень часто используются в программировании:
Можно создать функцию для вывода информации для администратора:
‘;
echo ‘ALL Times: ‘.$db->MySQL_time_taken.’
‘;
echo ‘ALL Query: ‘.$db->query_num.’
‘;
echo ‘ALL Memory: ‘.get_size(memory_get_usage()).’
‘;
echo ‘

Источник

Небольшой класс для работы с БД ( PDO )

Внимание! Моё мнение может отличаться от вашего, поэтому хочу сразу сказать, что эта статья не есть истина в последней инстанции и реализация этого класса зависит от программиста и его предпочтений.

Вступление

Начнём с класса DB.

Тут, я думаю, всё понятно, эти вещи можно не объяснять.

Далее большая часть пояснений будет содержаться в коде.

Прекрасно, мы подключились к БД. Теперь нам нужно создать метод, который позволит совершать SQL запросы.

Реализация метода query

Мы готовы к реализации этого метода, но у нас возникает вопрос:

«Что за параметры он принимает и как он должен их использовать?»

Ответ на первый вопрос очевиден:

А что со вторым вопросом?

Всё так же просто, что бы ответить на этот вопрос, мы должны узнать, в каком виде нам подают эти параметры. А получаем мы их вот такими:

Вернёмся к предыдущему вопросу и ответим на него:

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

Некоторые комментарии немного искажают истину, но при этом кардинально ничего не меняют

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

Моя реализация

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

Здесь эти методы реализованы, возможно не лучшим образом, но реализованы.

Так же сюда можно добавить ещё функции, упрощающие жизнь, но лично мне этого с головой хватает.

Можно добавить следующие методы:

Применение

Мы написали наш класс. Теперь нам нужно протестировать его в реальном «бою».

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

Это понятно и не требует объяснения, идём дальше. Теперь, давайте попросим БД test вернуть нам значение всех постов при помощи нашего класса.

На выходе мы имеем следующее:

Отлично, а теперь давайте выведем только первый пост.

Прекрасно. Ну и в конце добавим запись и выведем данные до и после.

После

Мы получили то, что хотели и убедились в том, что этот класс рабочий.

В заключении

Ссылка на github: class DB

Источник

Класс для работы с базой данных

Класс для работы с mysql php. Смотреть фото Класс для работы с mysql php. Смотреть картинку Класс для работы с mysql php. Картинка про Класс для работы с mysql php. Фото Класс для работы с mysql php

Привожу свой прокомментированный класс для работы с базой данных:

mysqli = new mysqli(«localhost», «root», «», «my_db»);
$this->mysqli->query(«SET lc_time_names = ‘ru_RU'»);
$this->mysqli->query(«SET NAMES ‘utf8′»);
>

Как видите, нет ничего лишнего, только всё самое необходимое. Теперь разберём PHP-код, который использует данный класс:

Вот такой незамысловатый класс для работы с базой данных я использую в своих проектах.

Класс для работы с mysql php. Смотреть фото Класс для работы с mysql php. Смотреть картинку Класс для работы с mysql php. Картинка про Класс для работы с mysql php. Фото Класс для работы с mysql php

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Комментарии ( 21 ):

Интересный метод getQuery(), напоминает параметризованные запросы prepare(), bind_param(). Как по вашему, стоит ли заморачиваться с ними или для безопасности вполне хватит вашего подхода для подстановки значений в запрос?

Лично я их не использую и особого смысла не вижу.

Михаил, возникла проблема. Все методы работают кроме select и selectRow. Не знаю в чем проблема, никаких ошибок не выводит но и то, что нужно тоже 🙁 Я в отчаянии.

Скорее всего, ошибка в Вашем запросе. Используйте этот метод для поиска ошибок: http://myrusakov.ru/php-finderror.html и для поиска ошибки в SQL: http://myrusakov.ru/sql-finderror.html

Он Array и должен возвращать. Это же массив данных.

Михаил, спасибо БОЛЬШОЕ Вам за это курс, подскажите, пожалуста, нет ли в отправке формы в БД каких-либо особенностей при отправке значений радиокнопок? У меня есть форма отзыва о компании, в которой есть 2 текстовых поля и 2 поля с радиокнопками. Значения полей с текстом в БД попадает, а выбранное значение радиокнопок-нет. просто пустая ячейка. Хотя через echo на странице оно выводиться?

Никаких особенностей нет, надо просто искать ошибку: http://myrusakov.ru/php-finderror.html

Спасибо за класс, удобно. Прошу показать пример работы с insert и update

Мне больше вот этот нравится, не знаю, дает он 100% защиту от sql инъекция, но хотя бы какая то. http://habrahabr.ru/post/165069/

Дякую за посилання.. дуже зручно і безпечно.

Не получается подключиться к базе данных. Куда класть этот файл класса БД?

В папку положите корневую.

Сделал! Сделал! Оказывается в файле класса БД не надо было прописывать данные БД (логин пароль и пр.)!

Добавить этот весь код надо в один файл? У меня database_class.php

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.

Источник

PHP класс для удобной и безопасной работы с MySQL

Безопасность

Удобство и краткость кода приложения

Универсальность и простота освоения

Тем не менее, в итоге мы получили мощный и лёгкий генератор запросов, который с лихвой оправдывает этот небольшой недостаток.
Мощный потому, что мы не ограничены синтаксисом квери-билдера, «SQL-ем, написанным на PHP» — мы пишем чистый SQL.
Лёгкий потому, что весь API составления запросов состоит из полудюжины плейсхолдеров и функции parse()
Вот мой любимый пример — вставка с использованием функций Mysql

С одной стороны, мы сохраняем синтаксис SQL, с другой — делаем его безопасным, а с третьей — капитально сокращаем количество кода.

Подробнее о типизованных плейсхолдерах

Кроме того, типизованный плейсхолдер — это ОЧЕНЬ удобно!
Во-первых, потому что становится ненужным специальный оператор для привязки значения к плейсхолдеру (но при этом сохраняется возможность указать тип передаваемого значения!)
Во-вторых, раз уж мы изобрели типизованный плейсхолдер — мы можем налепить этих плейсхолдеров огромное количество, для решения множества рутинных задач по составлению SQL запросов.
В первую очередь сделаем плейсхолдер для идентификаторов — нам его отчаянно не хватает в реальной, а не воображаемой авторами стандартных API, жизни. Как только девелопер сталкивается с необходимостью динамически добавить в запрос имя поля — каждый начинает извращаться по-своему, кто в лес, кто по дрова. Здесь же всё унифицировано с остальными элементами запроса, и добавление идентификатора становится не сложнее добавления строки. Но при этом идентификатор форматируется не как строка, а в соответствии со своими собственными правилами — заключается в обратные кавычки, а внутри эти кавычки экранируются удвоением.
Дальше — больше. Следующая головная боль любого разработчика, когда-либо пытавшегося использовать стандартные prepared statements в реальной жизни — оператор IN(). Вуаля, у нас есть плейсхолдер и для этой операции! Подстановка массива становится не сложнее любых других элементов, плюс она унифицирована с ними — никаких отдельных функций, меняется всего лишь буква в плейсхолдере.
Точно таким же образом делаем и плейсхолдер для SET. Не удержусь и продемонстрирую, насколько простым становится код для такого замороченного запроса, как INSERT… ON DUPLICATE:

Кстати, как многие могли заметить, этот класс во многом напоминает библиотеку DbSimple Дмитрия Котерова. Но у меня есть принципиальные расхождения с некоторыми идеями, заложенными в неё.
Во-первых, я противник любой магии, когда одна и та же функция может возвращать различный результат в зависимости от типа переданных данных. Это, возможно, чуть упрощает написание, но при этом чудовищно затрудняет сопровождение и отладку кода. Поэтому в моем классе вся магия сведена к минимуму, а все операции и типы данных всегда прописываются явно.
Во-вторых, в DbSimple немного, на мой взгляд, переусложнённый синтаксис. С одной стороны, фигурные скобки — гениальная идея. С другой — а зачем, если в нашем распоряжении вся мощь PHP? Поэтому я решил пойти другим путём и весто «внутренней» — заведомо ограниченной — логики ввёл «внешнюю», ограниченную лишь синтаксисом РНР. Главное, чтобы любые динамические элементы попадали в запрос только через плейсхолдеры, а остальное зависит лишь от фантазии разработчика (и функции parse()).

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *