Зручний 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> 'тисячі' 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 збігу зі словами тест і пошуку.


$ Order_by і $ where беруться з попередніх оголошених змінних і отримуємо такий запит:

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 - запис в базу даних:


Функція поверне id записи в змінну $ id. Запит буде виглядати так: INSERT data SET test = 'test', text = 'text'

Для внесення змін до рядка використовуємо функцію update:


Якщо запис пройшла успішно, $ message поверне UPDATE OK інакше ERROR UPDATE. Запит буде таким:

UPDATE data SET test = 'test', text = 'text', category = '2', test = 'test change', text = 'text change' WHERE id = '1'

І ще одна функція query - в ній можна написати свій запит select повністю:


Також можна зробити паралельне з'єднання з іншою базою даних:

Такий ось клас у мене вийшов. Не буду порівнювати його з іншими клас для роботи з БД, знаю - їх безліч. Публікую його, тому що думаю, що, може, комусь стане в нагоді, а також хочеться конструктивної критики, яка дозволить покращити цей код.

Якщо настільки хочеться написати щось своє з нуля, то на початку я б порадив хоч трохи розібратися з матчастиною: почитати хороші практики (PDO або mysqli на худий кінець, поділ відповідальності і тд), почитати про безпеку (всіма улюблені ін'єкції наприклад), подивитися реалізацію подібного в інших бібліотеках ...

Ну що ви напали на людину, можна подумати ніхто так не робив :) Та все писали свій «клас для MySQL», а то й не один.

Справжній PHPшнік зобов'язаний в житті написати свій фреймворк :)
Так що, є до чого прагнути

Забувши про PSR і PHPDoc

Исходник - найкраща документація (ц)

Написати свою БД - завдання кожного програміста

>> Ну що ви напали на людину, можна подумати ніхто так не робив :) Та все писали свій «клас для MySQL», а то й не один.

Писали може і все, а на Хабре постили не всі ...

хочеться конструктивної критики, яка дозволить покращити цей код
Про актуальність написання подібного класу говорити не будуть, просто наведу кілька своїх зауважень за кодом:
01) Функції, які можуть кидати виключення (наприклад, mysql_connect) слід обертати в блоки try-catch

02) Тексти запитів виду «SELECT $ this-> select FROM $ table WHERE $ this-> where $ this-> order_by $ this-> limit» - я б так не робив, оскільки це потенційна загроза XSS-атак.

03) Повідомлення про помилки в html-розмітки теж погана практика, оскільки вам не завжди буде вимагатися виводити помилки саме на екран. Тексти повідомлень краще взагалі винести в константи класу (имхо).

04) У рядку $ db = mysql_connect ( "$ host", "$ login_mysql", "$ password_mysql"); не зовсім зрозумів, навіщо потрібно змінні брати в лапки, без них теж все повинно запрацювати. Хоча, можливо, я чогось не знаю.

02) Тексти запитів виду «SELECT $ this-> select FROM $ table WHERE $ this-> where $ this-> order_by $ this-> limit» - я б так не робив, оскільки це потенційна загроза XSS-атак.
Доброго ранку, прокидайтеся, що не XSS а SQL-Injection :)

Час вказано в тому часовому поясі, який встановлений на вашому телефоні.

Схожі статті