PHP примитивы — Подключение к базе данных через PDO

Редакция автор: stain

Защита от SQL инъекций

Защита собственными силами
Библиотека и методы ее использования

Класс для безопасной и удобной работы с MySQL
Еще про класс

PDO

Частичка статьи.

Пример типа правильного соединения:

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $user, $pass, $opt);

- в $dsn задается тип БД, с которым будем работать (mysql), хост, имя базы данных и чарсет.
- затем идут имя пользователя и пароль
- после которого задается массив опций, про который ни в одном из руководств не пишут.

При том что этот массив - чрезвычайно полезная, как уже говорилось выше, штука. Самое главное - режим выдачи ошибок надо задавать только в виде исключений.
- Во-первых, потому что во всех остальных режимах PDO не сообщает об ошибке ничего внятного,
- во-вторых, потому что исключение всегда содержит в себе незаменимый stack trace,
- в-третьих - исключения чрезвычайно удобно обрабатывать.

Тут выше описан типа "верный" способ соединения с базой, так вот в реальности он заработал только в таком варианте.

$host = 'localhost';
$dbname = 'basename';
$user = 'username';
$password = 'pass1234';
//$charset='utf8';

$dsn = "mysql:host=$host;dbname=$dbname"; //;charset=$charset
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $user, $password, $opt);
$pdo->exec("set names utf8");

//простой запрос
$stmt = $pdo->query('SELECT login FROM users');
while ($row = $stmt->fetch())
{
    echo $row['login'] . " ";
}

Другой вариант

//Описание переменных для доступа к бд
$host = 'localhost';
$dbname = 'basename';
define('user', 'username');
define('password', 'pass1234');

//Подключение к бд
try {
  $db = new PDO("mysql:host=$host;dbname=$dbname", user, password);
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $db->exec("set names utf8");
}
catch(PDOException $e) {
    echo $e->getMessage();
}

Так же по непонятным мне причинам константы host и dbname не воспринимаются, а вот простые переменные с ними все работает

//Простой запрос к бд
$stmt = $db->query('SELECT login FROM users');
while ($row = $stmt->fetch())
{
    echo $row['login'] . " ";
}

Вариант с выводом ошибок(все в одном поэтому требует доработки)

try {
    $dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->exec("set names utf8");
    foreach($dbh->query('SELECT * from users') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . " br - убрал галочки для лучшей читабельности ";
    die();
}

Самый логичный вариант

//Описание переменных для доступа к бд
$host = 'localhost';
$dbname = 'basename';
$user = 'username';
$password = 'pass1234';

//Подключение к бд
    $db = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->exec("set names utf8");

//Простой запрос к бд с обработкой ошибок
try{
	$stmt = $db->query('SELECT login FROM users');
	while ($row = $stmt->fetch()){
    		echo $row['login'] . " ";
	}
	$stmt = null; //очищает переменную $stmt
}
 catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . " br - убрал галочки для лучшей читабельности ";
    die();
}

Подключение к различным типам баз данных описано тут
Еще вариант

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.