Робота з PDO в PHP

8 вересня 2024 р. 23 egor

Функції mysql в PHP для роботи з БД давно вже застаріли, на сьогодні бажано використовувати mysqli або PDO (PHP Data Objects).

Крім того PDO підтримує велику кількість різних типів БД, таких як: MySQL, PostgreSQL, SQLite, Oracle, Firebird тощо. Тож давайте розберемося, як працювати з PDO, розглянемо запити, які використовуються найчастіше.

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.


DatabasePHPPDO