Останнім часом задався питанням написання 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 :)
Час вказано в тому часовому поясі, який встановлений на вашому телефоні.