> /dev/null
 Аватар для Блеф
286 / 119 / 86
Регистрация: 14.05.2014
Сообщений: 767
MySQL

Работа с БД MySQL | PDO

28.07.2017, 22:06. Показов 1317. Ответов 4

Студворк — интернет-сервис помощи студентам
Работа с БД MySQL в PHP


Данный пост решил написать в дополнение Работа с БД MySQL в PHP автор (KOPOJI).

Преимущества PDO:
  • PDO работает с разными базами данных.
  • Защита от sql инъекций
  • Поверх PDO можно использовать ActiveRecord , что значительно сокращает время разработки.
  • Большие возможности по сравнению с mysql(i)


1. Подключение к MySQL

PHP
1
2
3
4
5
6
7
$host = 'localhost'; // Хост
$db   = 'test'; // База
$user = 'root'; // Пользователь
$password = ''; // Пароль
$charset = 'utf8'; // Кодировка
 
$db = new PDO('mysql:host='.$host.';dbname='.$db.';charset='.$charset, $user, $password);
2. Выполнение запросов

Для выполнения запросов которые не используют каких-либо входящих данных можно воспользоваться обычным query

PHP
1
$q = $db->query('SELECT `name` FROM `users`');
Но я бы не рекомендовал дел так если вы принимаете какие-то переменные от пользователя, потому что любые данных которые к нам приходят нужно фильтровать. С помощью подготовленых запросов мы можем избавится от sql инъекций, к тому же это очень даже удобно.

PHP
1
2
3
4
$data = array('Sasha', 'My home', 'London');  
  
$q = $db->prepare("INSERT INTO user (name, addr, city) values (?, ?, ?)");  
$q->execute($data);
В массиве $data мы указываем переменные которые нам нужно вставить в таблицу, а в prepare указываем плейсхолдером (?) в какое место нужно вставить наши данные. В данном случае очень важен порядок.

в итоге наш sql запрос будет выглядеть так:

SQL
1
INSERT INTO USER (`name`, `addr`, `city`) VALUES ('Sasha', 'My home', 'London')

Также можно использовать именные плейсхолдеры, в данном случае порядок не важен.

PHP
1
2
3
4
$data = array('name'=>'Sasha', 'addr'=>'My home', 'city'=>'London');  
  
$q = $DBH->prepare("INSERT INTO user (name, addr, city) values (:name, :addr, :city)");  
$q->execute($data);
3. Выборка данных

Получение ассоциативного массива

PHP
1
2
3
4
5
6
7
8
9
$q = $db->query('SELECT * FROM `users`');  
  
$q->setFetchMode(PDO::FETCH_ASSOC);  // Режим выборки
  
while($row = $q->fetch()) {  
    echo $row['name'] ;  
    echo $row['phone'];  
    echo $row['email'];  
}
Получение в виде экземпляра класса std

PHP
1
2
3
4
5
6
7
8
9
$q = $db->query('SELECT * FROM `users`');  
  
$q->setFetchMode(PDO::FETCH_OBJ);    // Режим выборки
  
while($row = $q->fetch()) {  
    echo $row->name ;  
    echo $row->phon;  
    echo $row->email;  
}
Интересной функцией, с большим функционалом , является fetchAll(). Она возвращает массив, который состоит из всех строк, которые вернул запрос. Она дает возможность избавится от цикла для получения массива со всеми значениями строк.

PHP
1
$data = $db->query('SELECT * FROM users')->fetchAll(PDO::FETCH_UNIQUE);
Статья написана с целью что бы ученики начинали изучение php с более современных технологий типа mysqli и PDO.
Надеюсь моя статья будет хоть кому, то полезна и я не зря потратил свое время.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.07.2017, 22:06
Ответы с готовыми решениями:

Php,MySql,PDO
Здравствуйте подскажите пожалуйста как переделать данный класс чтобы он работал не с PDO а с MySql <?php namespace...

Singleton и PDO::MYSQL
Здравствуйте. Пытаюсь организовать работу с БД используя шаблон Singleton. В интернете нашел такой пример. Но тут используется устаревший...

Использование PDO и MySQL
Есть функция, никак не могу понять почему не работает: function developer_get_profile ($login) { global $config, $DBH; ...

4
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
30.07.2017, 10:58
Такие символы, как тире, угловая скобка, двоеточие не удобно набирать (приходится нажимать shift), поэтому предпочитаю
[РЕЦЕПТ] Класс для работы с БД
0
> /dev/null
 Аватар для Блеф
286 / 119 / 86
Регистрация: 14.05.2014
Сообщений: 767
30.07.2017, 11:18  [ТС]
plohoyav, по любому нужно использовать какую-то библиотеку для работы с бд. Только почему вы решили использовать самописный класс? Если можно использовать готовый, проверенный многими?
0
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
30.07.2017, 11:22
когда в коде ничего лишнего с ним легко работать, можно быстро найти нужное место в коде и исправить
0
Эксперт PHP
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
30.07.2017, 12:09
Цитата Сообщение от plohoyav Посмотреть сообщение
когда в коде ничего лишнего с ним легко работать
Цитата Сообщение от plohoyav Посмотреть сообщение
$b = "'".DBi::real_escape_string($v)."'";
Угу, ручное экранирование и проставление кавычек вместо нормального использования плейсхолдеров - это, конечно, ничего лишнего. Ещё и ООП с функциями зачем-то намешали. Очень сомнительное решение, тем более mysqli вместо обсуждаемого здесь PDO.
Цитата Сообщение от plohoyav Посмотреть сообщение
можно быстро найти нужное место в коде и исправить
В итоге при разработке проекта вы тратите время не только на сам проект, но и на поддержку этой самописки. И хорошо ещё, если такая самописка в проекте только одна.

По теме. Один из плюсов PDO - возможность быстрого получения данных в особом виде, отличном от обычного ассоциативного массива.

Помимо вышеупомянутого PDO::FETCH_UNIQUE, ещё есть FETCH_COLUMN, FETCH_KEY_PAIR, FETCH_GROUP.

Подробно расписывать влом, почитать можно здесь.

Как пример, постоянно пользуюсь FETCH_KEY_PAIR:
PHP
1
2
3
4
5
6
7
8
$data = $pdo->query('SELECT name, car FROM users')->fetchAll(PDO::FETCH_KEY_PAIR);
 
/* array (
  'John' => 'Toyota',
  'Mike' => 'Ford',
  'Mary' => 'Mazda',
  'Kathy' => 'Mazda',
) */
Реально полезная штука, вместо многомерного массива сразу получаем первую колонку как ключ, вторую как значение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.07.2017, 12:09
Помогаю со студенческими работами здесь

Какая-то фигня с PDO MySQL
Всем привет! есть класс: <?php class DB_PDO_MySQL extends DB { public static $pdo;

PDO в MySQL. Ошибки и прочее
Всем привет. имеется следующий код: <?php $host = 'localhost'; $db = 'test_db'; $user = 'root'; $pass = ''; ...

Как реализовать на PDO с MySql ?
вообщем есть готовый код $result = mysql_query("SELECT * FROM klient WHERE phone='$phone'"); $myrow = mysql_fetch_array($result);...

Транзакции в PDO и SELECT FOR UPDATE в MySQL
Уважаемые участники форума, подскажите, пожалуйста, кто знает. Если скрипт выполняет запрос SELECT FOR UPDATE и последующий UPDATE...

Ошибка подключения к СУБД MySQL PDO
Здравствуйте. Установлен Open Server, на нём PHP 7.2 и MySQL 5.7. Имя базы данных test, хост, логин и парроль по умолчанию. При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru