PDO. Часть 2.
В этой статье мы разберём основные методы для работы с данными в PDO.
Для начала давайте установим соединение с нашей базой данных MySQL.
$host = 'localhost'; // хост
$dbname = 'test'; // название базы
$user = "admin"; // логин пользователя
$pass = 123; // пароль
$db = new PDO("mysql:host=$host;dbname=$db", $user, $password);
В результате, в $db попадёт объект, используя который мы сможем работать с нашей базой. Давайте этим и займёмся.
К примеру, мы хотим что-нибудь вставить, тогда будем использовать метод exec.
$sql = "INSERT INTO(login, password) VALUES($login, $password)";
$res = $db->exec($sql);
Наш запрос будет выполнен, а в переменную $res попадёт количество затронутых строк.
exec выполняет запросы, но не может получить данные из БД, этим занимается метод query.
$sql = "SELECT login FROM users";
$res = $db->query($sql);
Однако не стоит забывать про безопасность и про то, что данные нужно проверять. Для этого раньше нам нужно было сделать примерно следующее:
$sql = "SELECT * FROM users WHERE login = $login";
$login = $_POST["login"];
$login = mysql_real_escape_string($login); // MySQL
$login = sqlite_escape_string($login); // sqlite
$login = pg_escape_string($login); // PostgreSQL
Теперь за нас всё сделает PDO и его метод quote.
$login = $db->quote($login);
$result = $db->query($sql);
Чтобы преобразовать вернувшийся результат в массив, мы использовали функции mysqli_fetch_assoc() для ассоциативного и mysqli_fetch_num() для нумерованного массива. Посмотрим, как это делается в PDO.
$stmt = $db->query($sql);
$res = $stmt->FETCH(PDO::FETCH_ASSOC); // ассоциативный
$res = $stmt->FETCH(PDO::FETCH_NUM); // нумерованный
$res = $stmt->FETCH(PDO::FETCH_BOTH); // ассоциативный и нумерованный вместе
$res = $stmt->FETCH(PDO::FETCH_OBJ); // объектный тип
$res = $stmt->FETCH(PDO::FETCH_LAZY); // сразу все типы
Думаю, тут всё понятно. Мы просто вызываем метод FETCH и передаём туда соотвествующую константу. В использовании проблем возникнуть так же не должно.
echo $res["name"]; // ассоциативный
echo $res[0]; // нумерованный
echo $res->name; // объектный
Используя константу FETCH_LAZY, вы можете извлекать данные любым удобным для вас способом, но помните, что это плохо для производительности.
Метод FETCH возвращает одну запись, а чтобы получить все, нам следует использовать FETCHALL.
$stmt = $db->query("SELECT * FROM users");
$res = $stmt->FETCHALL(PDO::FETCH_ASSOC);
foreach($res as $arr) {
echo $arr["name"]."<br>";
}
Тут пояснять нечего. Давайте лучше поговорим про константу FETCH_CLASS. Эта константа позволяет нам заполнить наш класс данными, полученными из БД.
class User {
public $login;
public $pass;
public function showInfo() {
echo "<b>".$this->pass."</b>"." : ".$this->login."<br>";
}
}
$db = new PDO("mysql:host=localhost;dbname=test", "root", "");
$stmt = $db->query("SELECT * FROM `users`");
$result = $stmt->FETCHALL(PDO::FETCH_CLASS, "User");
foreach($result as $user) {
$user->showInfo();
}
В методе FETCHALL мы указываем константу FETCH_CLASS, а затем название класса в кавычках. После мы перебираем объект с результатом с помощью цикла foreach и выводим информацию. Главное помните, что названия свойств в классе обязаны быть такими же, как и названия полей в базе данных.
Сегодня мы разобрали основные способы работы с базой данных, а в следующей статье перейдём к уже более сложным, но интересным фишкам PDO.
-
- Михаил Русаков
Комментарии (1):
$host = 'localhost'; // хост $dbname = 'test'; // название базы $user = "admin"; // логин пользователя $pass = 123; // пароль $db = new PDO("mysql:host=$host;dbname=$db", $user, $password); Михаил в данном фрагменте допущены ошибки переменные разные в одном месте переменная $pass, а в другом месте называется $password и еще одна $dbname, а в другом месте просто $db. Я использую БД mysql пришлось моленько изменить запрос sql добавление после INTO названия Таблицы, также поэкспериминтировал с `` - кавычками вокруг параметров они на выполнение запроса не повлияли, также ;-точка с запятой в конце запроса на работу не повлияли. ЕСЛИ ЧИТАЕТЕ КОММЕНТАРИИ НАПИШИТЕ
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.