- Saved searches
- Use saved searches to filter your results more quickly
- a1phanumeric/PHP-MySQL-Class
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- readme.md
- About
- Небольшой класс для работы с БД ( PDO )
- Вступление
- Реализация метода query
- Моя реализация
- Применение
- В заключении
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Simple MySQL class written in PHP, for interfacing with a MySQL database.
a1phanumeric/PHP-MySQL-Class
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
readme.md
As of December 2014 I decided to upload the PHP MySQL Class I wrote a while back, and now use on a daily basis. It’s PDO based (the mysql_* functions were due to be deprecated quite a while back now!).
The old version is still a part of this repo for now, and the readme is still available here.
This is a simple to use MySQL class that easily bolts on to any existing PHP application, streamlining your MySQL interactions.
Include the class using composer as below:
composer require a1phanumeric/php-mysql-class
To use in your project, use the following:
$DB = new DBPDO(‘db_host’, ‘db_name’, ‘db_user’, ‘db_pass’);
Firstly, define four constants for the host, database name, username and password:
Then, simply include this class into your project like so:
To perform direct queries where you don’t need to return any results (such as update, insert etc. ), just do the following:
$DB->execute(«UPDATE customers SET email = ‘newemail@domain.com’ WHERE username = ‘a1phanumeric'»);
That’s the easiest way to use the class, but we should be utilising prepared statements now. This means no more escaping shizzle! To utilise prepared statements, just change the above code to the following:
$DB->execute(«UPDATE customers SET email = ? WHERE username = ?», array(‘newemail@domain.com’, ‘a1phanumeric’));
The class will invoke PDO’s prepared statements and put the email and username in their place respectively, as well as escape all values passed to it. Note: You don’t need to put the speechmarks in on the query, the ? is enough, and PDO will sort that out for you.
To perform select queries with this class, the syntax is similar to the above, but we have two functions we can utilise, fetch and fetchAll .
fetch simply returns one row, useful for getting a user by their ID for example. This returns an associative array and looks like:
$user = $DB->fetch(«SELECT * FROM users WHERE $id);
Now $user will contain an array of the fields for the row where there query matches. Oh, what’s that? We didn’t pass an array as the second parameter we just passed a single variable? That’s cool, the class will treat a single variable the same as if you passed array($id) . It’s just a handy little time-saver.
fetchAll is used to fetch multiple rows, the parameters are similar, but the result returns an array of records:
$counties = $DB->fetchAll(«SELECT * FROM counties»);
The above will return a list of counties (in the UK) in my database like so:
[0] => Array ( [id] => 1 [county] => London ) [1] => Array ( [id] => 2 [county] => Bedfordshire ) [2] => Array ( [id] => 3 [county] => Buckinghamshire )
However, what if I want to loop over some raw data and check if the data matches the county name? To do that means either looping over these results every time, or shifting the key to the root dimension of the multi-dimensional array. However, if we pass a third variable, we can have that column as the key:
$counties = $DB->fetchAll(«SELECT * FROM counties», null, ‘county’);
Note: I passed null as the second paramater as we’re not passing any variables into the query to be escaped.
This will now return an array like the following:
[London] => Array ( [id] => 1 [county] => London ) [Bedfordshire] => Array ( [id] => 2 [county] => Bedfordshire ) [Buckinghamshire] => Array ( [id] => 3 [county] => Buckinghamshire )
So of course we could now do something like:
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
About
Simple MySQL class written in PHP, for interfacing with a MySQL database.
Небольшой класс для работы с БД ( PDO )
Привет, Хабр! Очень много статей написано о PDO, но при этом очень мало реальных примеров. В этой статье я хочу представить свою версию класса для работы с базой данных (далее — БД). Эта статья будет полезна начинающим программистам, которые только осваивают эту технологию.
Внимание! Моё мнение может отличаться от вашего, поэтому хочу сразу сказать, что эта статья не есть истина в последней инстанции и реализация этого класса зависит от программиста и его предпочтений.
Вступление
Тут, я думаю, всё понятно, эти вещи можно не объяснять.
Далее большая часть пояснений будет содержаться в коде.
db = new PDO('mysql:host=' . $dbinfo['host'] . ';dbname=' . $dbinfo['dbname'], $dbinfo['login'], $dbinfo['password']); > > ?>
Прекрасно, мы подключились к БД. Теперь нам нужно создать метод, который позволит совершать SQL запросы.
db = new PDO('mysql:host=' . $dbinfo['host'] . ';dbname=' . $dbinfo['dbname'], $dbinfo['login'], $dbinfo['password']); > // Операции над БД public function query($sql, $params = []) < >> ?>
Реализация метода query
Мы готовы к реализации этого метода, но у нас возникает вопрос:
«Что за параметры он принимает и как он должен их использовать?»
Ответ на первый вопрос очевиден:
- $sql — переменная с текстом SQL запроса.
- $params — переменная с какими-то параметрами для запроса.
А что со вторым вопросом?
Всё так же просто, что бы ответить на этот вопрос, мы должны узнать, в каком виде нам подают эти параметры. А получаем мы их вот такими:
У незнающего человека возникает вопрос: «Что за двоеточие?» Я тут же отвечаю — такие запросы называются подготовленными и используются, дабы исключить возможность SQL инъекции.
Вернёмся к предыдущему вопросу и ответим на него:
Мы должны обойти массив $params и подставить значение в запрос.
Но сначала, мы должны подготовить запрос для подстановки этих значений. В итоге код будет выглядеть так:
db = new PDO('mysql:host=' . $dbinfo['host'] . ';dbname=' . $dbinfo['dbname'], $dbinfo['login'], $dbinfo['password']); > // Операции над БД public function query($sql, $params = []) < // Подготовка запроса $stmt = $this->db->prepare($sql); // Обход массива с параметрами // и подставление значений if ( !empty($params) ) < foreach ($params as $key =>$value) < $stmt->bindValue(":$key", $value); > > // Выполняем запрос $stmt->execute(); // Возвращаем ответ return $stmt->fetchAll(PDO::FETCH_ASSOC); > > ?>
Некоторые комментарии немного искажают истину, но при этом кардинально ничего не меняют
Мы имеем уже довольно мощный инструмент, использующий подготовленные запросы и требующий от разработчиков знание SQL, а не тонкостей класса. Но при этом, я бы зашил в этот класс типовые запросы, такие как:
- getAll() — двумерный массив, индексированный числами по порядку
- getRow() — одномерный массив, первую строку результата
Моя реализация
Эти методы могут быть реализованы по разному, но я представлю свою реализацию.
db = new PDO('mysql:host=' . $dbinfo['host'] . ';dbname=' . $dbinfo['dbname'], $dbinfo['login'], $dbinfo['password']); > // Операции над БД public function query($sql, $params = []) < // Подготовка запроса $stmt = $this->db->prepare($sql); // Обход массива с параметрами // и подставляем значения if ( !empty($params) ) < foreach ($params as $key =>$value) < $stmt->bindValue(":$key", $value); > > // Выполняя запрос $stmt->execute(); // Возвращаем ответ return $stmt->fetchAll(PDO::FETCH_ASSOC); > public function getAll($table, $sql = '', $params = []) < return $this->query("SELECT * FROM $table" . $sql, $params); > public function getRow($table, $sql = '', $params = []) < $result = $this->query("SELECT * FROM $table" . $sql, $params); return $result[0]; > > ?>
Здесь эти методы реализованы, возможно не лучшим образом, но реализованы.
Так же сюда можно добавить ещё функции, упрощающие жизнь, но лично мне этого с головой хватает.
Можно добавить следующие методы:
- getOne() — возвращает первый элемент первой строки результата
- getCol() — возвращает 1 колонку таблицы
- и т.д.
Применение
Мы написали наш класс. Теперь нам нужно протестировать его в реальном «бою».
Давайте попробуем. Для начала нам нужно создать любую таблицу в БД, допустим это будет таблица posts. Добавим туда пару записей и попробуем вывести их с помощью нашего класса.
Далее я не буду приводить код класса DB . Подразумевается, что этот класс либо написан выше, либо подключается к этому скрипту.
Так как ранее я не показал файл dbinfo.php — сейчас я приведу код этого конфигурационного файла.
'127.0.0.1', 'dbname' => 'test', 'login' => 'root', 'password' => '' ]; ?>
Это понятно и не требует объяснения, идём дальше. Теперь, давайте попросим БД test вернуть нам значение всех постов при помощи нашего класса.
// Создаём объект $db = new DB; // Получаем и выводим данные echo ""; print_r($db->getAll('posts')); ?>
На выходе мы имеем следующее:
Отлично, а теперь давайте выведем только первый пост.
// Создаём объект $db = new DB; // Получаем и выводим данные echo ""; print_r($db->getRow('posts')); ?>
Прекрасно. Ну и в конце добавим запись и выведем данные до и после.
// Создаём объект $db = new DB; // Получаем и выводим данные echo "До
"; print_r($db->getAll('posts')); echo "
После
"; $params = [ 'title' => 'Заголовок через PHP', 'author' => 'Автор через PHP' ]; $db->query('INSERT INTO `posts` ( title, author ) VALUES ( :title, :author )', $params); print_r($db->getAll('posts')); ?>
Мы получили то, что хотели и убедились в том, что этот класс рабочий.
В заключении
В конце статьи я хочу повториться и сказать, что моя реализация не идеальна, но всё таки данный класс работает и выполняет свою главную функцию - работает с базой данных. Надеюсь для вас эта статья была полезной
Ссылка на github: class DB