PDO, подключение к базе данных

Подключение к БД с помощью PDO выглядит так:

<?php
$dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);

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

Для обнаружения ошибок будем использовать методы try/catch:

<?php
try {
    $dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

PDO::ERRMODE_EXCEPTION - выводить исключения, когда они произойдут.

PDO, получение (чтение) и вывод данных из БД

В PDO получить данные можно двумя способами (методами):

  • query
  • execute

Разберем оба.

Чтение и вывод данных с помощью query

Сразу к примеру:

<?php
$q = 'кодер.укр';

try {
    //соединение с БД
    $dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //получаем данные
    $data = $dbcon->query('SELECT * FROM tableName WHERE fieldName = ' . $dbcon->quote($string));

    //выводим результат
    foreach($data as $rows) {
        print_r($rows);
    }

} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

$dbcon->quote - метод аналогичный mysql_real_escape_string, для экранирования данных.

Еще один пример:

<?php
$q = 'кодер.укр';

try {
    //соединение с БД
    $dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //получаем данные
    $data = $dbcon->query('SELECT * FROM tableName');

    //выводим результат
    foreach ($dbcon->query($sql) as $row) {
        echo " ID: ".$row['ID'] . "<br />"; 
        echo " Name: ".$row['name'] . "<br />"; 
        echo " Other field: ".$row['otherField'] . "<br />"; 
    }

} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Чтение и вывод данных с помощью execute

Пример:

<?php
$q = 'кодер.укр';

try {
    //соединение с БД
    $dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);
    $data = $dbcon->prepare('SELECT * FROM tableName WHERE fieldName = :q');
    $data->execute(array('q' => $q));

    $result = $data->fetchAll();

    if (count($result)) {
        //выводим результат
        foreach($result as $row) {
            print_r($row);
        }
    } else {
        echo "Нет записей для вывода";
    }

} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Здесь мы работаем с методом prepare. Это сводит к минимуму возможность SQL инъекции. Так как $q не попадет непосредственно в запрос, а в запросе используем заполнитель :q.

Так же выводить данные можно следующим образом:

while($row = $data->fetch(PDO::FETCH_OBJ)) {
    print_r($row);
}

PDO::FETCH_OBJ - создает анонимный объект со свойствами, которые соответствуют именам столбцов запроса.

PDO::FETCH_ASSOC - вернет массив, индексированный именами столбцов запроса.

PDO::FETCH_BOTH - возвращает массив, индексированный именами столбцов запроса, а также их номерами (начиная с 0). Используется по умолчанию.

PDO::FETCH_NUM - возвращает массив, индексированный номерами столбцов (начиная с 0).

PDO, создаем таблицу

<?php
try {
    //соединение с БД
    $dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);

    //запрос на создание таблицы
    $sql = "CREATE TABLE `tableName` ( `ID` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(40) NOT NULL, `otherField` VARCHAR(40) NOT NULL, PRIMARY KEY (`ID`)) ";
    $dbcon->exec($sql);
    echo "Таблица tableName готова к использованию.";

} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

PDO, вставка новых записей в таблицу (БД)

Добавляем запись в таблицу:

<?php
try {
    //соединение с БД
    $dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $data = $dbcon->prepare('INSERT INTO tableName VALUES(:fieldName)');
    $data->bindParam(':fieldName', $fieldData);

    $fieldData= 'Нужные данные';
    $data->execute();
} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Добавляем несколько записей подряд в таблицу:

<?php
try {
    //соединение с БД
    $dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $data = $dbcon->prepare('INSERT INTO tableName VALUES(:fieldName)');
    $data->bindParam(':fieldName', $fieldData);

    $fieldData= 'Нужные данные';
    $data->execute();

    $fieldData= 'Нужные данные 2';
    $data->execute();

    $fieldData= 'Нужные данные 3';
    $data->execute();
} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

PDO, обновление существующих записей в таблице

Пример обновления записей:

<?php
//данные для вставки
$id = 1;
$name = "Новое имя";

try {
    $dbcon = new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $data = $dbcon->prepare('UPDATE tableName SET name = :name WHERE id = :id');

    $data->execute(array(
        ':id' => $id,
        ':name' => $name
    ));

    echo $data->rowCount(); //выведет: 1

} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

PDO, удаление записей из таблицы

Последний пример, удаление записей из таблицы:

<?php
$id = 1;

try {
    $dbcon= new PDO('mysql:host=localhost;dbname=dbName', $dbUsername, $dbPassword);
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $data = $dbcon->prepare('DELETE FROM tableName WHERE id = :id');
    $data->bindParam(':id', $id);
    $data->execute(); 
    echo $data->rowCount(); //выведет: 1

} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Я описал основные способы работы с базой данных через PDO, для более детального изучения можно почитать документацию: http://php.net/manual/en/book.pdo.php.