PHP best practices — использование PDO или mysql_query deprecated

С новых версии PHP 5.3+ использование функций mysql_ отмечена как deprecated. Это означает что в скором времени функция будет удалена и имеется рекомендация перейти на более новые провайдеры доступа к базам данных.

Конечно остаётся туча legacy кода, в которых переход на более новые версии PHP не стоит. Тут уж ничего не поделать.

Что же рекомендуют использовать сегодня для работой с базой данных (теми же mysql,postgres,mssql)? Ответ: PDO.

PDO — PHP Data Objects — удобное расширение для работы с различными базами данных.

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

<?php
try{

    $link = new \PDO(   'mysql:host=hostname;dbname=db;charset=utf8mb4',
                        'username',
                        'password',
                        array(
                            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
                            \PDO::ATTR_PERSISTENT => false
                        )
                    );

    $handle = $link->prepare('SELECT name from Table WHERE id = ? or data = ? limit ?');

    $handle->bindValue(1, 100, PDO::PARAM_INT);
    $handle->bindValue(2, 'example');
    $handle->bindValue(3, 10, PDO::PARAM_INT);

    $handle->execute();

    $result = $handle->fetchAll(\PDO::FETCH_OBJ);

    foreach($result as $row){
        print($row->name);
    }
}
catch(\PDOException $ex){
    print($ex->getMessage());
}

В начале происходит инициализация и соединение с базой данных.

Для защиты от инъекций используется Prepared Statements. Т.е сначала SQL запрос «компилируется» и затем вы подставляете вместо знаков вопроса свои значения.

Важно: для чисел целых и плавающих нужно указывать тип параметра как допустим для integer в примере:  PDO:PARAM_INT.
Еще важно: если что-то идёт не так PDO сразу же бросает PDOException. Поэтому чтобы ваше приложение не отвалилось по середине необходимо все исключения обрабатывать.

Строки сами экранируются. Тем самым ваш запрос будет защищен от инъекций.
Для перебора данных используется fetchAll.

Конечно использовать PDO в таком виде не очень и удобно, поэтому рекомендую использовать какую-нибудь ORM для работы с базами данных.

 

Leave a Comment

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