Как заменить функции MySQL на PDO?

при чтении на php.net о функции MySQL. Я столкнулся с этим сообщением

предупреждение Это расширение является устаревшей начиная с версии PHP 5.5.0, и будет удалено в будущем. Вместо mysqli либо расширение PDO_MySQL должны быть использованы. См. также MySQL: выбор руководства API и связанных FAQ для получения дополнительной информации. Альтернативы этой функции включают:

Я читал о PDO. Как я могу обновить свой код до PDO, используя MySQL или MSSQL?

1 ответов


я вижу много кода, размещенного на SO implementing функции my_sql. И комментарии от других (в том числе и от себя), заставляющие вопрошающих отказаться функции MySQL и начните использовать PDO или MySQLI. Этот пост здесь, чтобы помочь. Вы можете ссылаться на него, поскольку он дает объяснение, почему они устарели и что PDO is, плюс минимальный пример кода для реализации PDO.

во-первых все:

преобразование функции mysql до PDO - это не простой случай поиска и замены. PDO-это объектно-ориентированное программирование для языка PHP. Это означает другой подход при написании кода, как с функции mysql. Во-первых, зачем обращать?

почему функции mysql устаревший?

расширение mysql является древним и существует с PHP 2.0, выпущенный 15 лет назад (!!); который решительно отличается от современного PHP, который пытается избавиться от плохих практик своего прошлого. Расширение mysql-это очень сырой, низкоуровневый соединитель с MySQL, которому не хватает многих функций удобства и поэтому трудно правильно применять безопасным способом; поэтому это плохо для noobs. Многие разработчики не понимают SQL injection и MySQL API достаточно хрупкий, чтобы сделать его трудно предотвратить, даже если вы знаете об этом. Он полон глобального государства (неявная передача соединения, например), что упрощает написание кода, который трудно поддерживать. Поскольку он старый, его может быть неоправданно сложно поддерживать на уровне ядра PHP.

расширение mysqli намного новее и устраняет все вышеперечисленные проблемы. PDO также довольно новый и исправляет все эти проблемы, а также многое другое.

из-за этих причин* расширение mysql будет удалено когда-нибудь в будущем.

источник Deceze

как реализовать PDO

PDO предлагает одно решение для подключения к нескольким базам данных. Этот ответ охватывает только в MySQL и MSSQL сервера.

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

это довольно просто и не требует предварительной настройки PHP. Современные установки PHP стандартно поставляются с модулем, который позволяет PDO подключения к серверам MySQL.

модуль php_pdo_mysql.dll

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

это более продвинутая настройка. Вам нужно php_pdo_sqlsrv_##_ts.dll или php_pdo_sqlsrv_##_nts.dll drivers. Они специфичны для версии, следовательно,##. На момент написания статьи Microsoft выпустила официальные драйверы для PHP 5.5.X. Драйверы 5.6 еще официально не выпущены Microsoft, но доступны как неофициальные сборки по другие.

модуль php_pdo_sqlsrv_##_ts.dll для потокобезопасного варианта Модуль php_pdo_sqlsrv_##_nts.dll для варианта без резьбы

подключение к базе данных с помощью PDO Для подключения к базе данных необходимо создать новый экземпляр PDO с PDO construct.

$connection = new PDO(arguments);

конструктор PDO принимает 3 обязательных аргумента и 1 необязательный.

  1. уведомления о доставке или Имя Источника Данных в основном, это строка, содержащая информацию о водителе, хост и имя базы данных.
  2. имя пользователя
  3. пароль
  4. опции

подключение к в MySQL

$dsn = 'mysql:dbname=databasename;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);

давайте посмотрим на $dsn: сначала он определяет драйвер (mysql). Затем имя базы данных и, наконец, хозяин.

подключение к MSSQL

$dsn = 'sqlsrv:Server=127.0.0.1;Database=databasename';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);

давайте посмотрим на $dsn: сначала он определяет драйвер (sqlsrv). Затем хост и, наконец, имя базы данных.

при создании экземпляра выполняется подключение к базе данных. Вам нужно сделать это только один раз во время выполнения PHP-скрипта.

вам нужно обернуть создание экземпляра PDO в try-catch пункт. Если создание не удается, отображается обратная трассировка, раскрывающая важную информацию о вашем приложении, например имя пользователя и пароль. Чтобы избежать этого поймать ошибки.

try 
{
    $connection = new PDO($dsn, $user, $password);
}
catch( PDOException $Exception ) 
{   
     echo "Unable to connect to database.";
     exit;
}

чтобы выбросить ошибки, возвращаемые SQL server, добавьте эти параметры в экземпляр PDO с помощью setAttribute: $connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

выполнение запросов

PDO использует подготовленные заявления. Это реальная разница между PDO подход и функции mysql. Последний был очень susceptibele к SQL-ИНЪЕКЦИЯ. Можно было бы построить такой запрос:

$SQL = 'SELECT ID FROM users WHERE user = '.$username ;

когда вредоносный веб-сайт или человеку сообщения пользователя injector; DROP TABLE users. Результаты будут разрушительными. Вам нужно было доказать свой код, экранируя и инкапсулируя строки и переменные с кавычками. Это нужно было сделать. для каждого запроса. На больших веб-сайтах или плохо поддерживаемом коде риск наличия форма, которая позволяет SQL-инъекции может стать очень высокой. Подготовленные операторы исключают возможность внедрения SQL первого уровня, как в примере выше.

драйверы PDO действуют как человек-в-середине между вашим PHP-сервером и сервером баз данных, называемым абстракция доступа к данным слой. Он не переписывает ваши SQL-запросы, но предлагает общий способ подключения к нескольким типам баз данных ручки и вставки переменных в запросе. в MySQL функции построил запрос на выполнение PHP кода. С PDO запрос фактически получает сборку на сервере базы данных.

подготовленный пример SQL:

$SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';

обратите внимание на разницу; вместо переменной PHP с помощью $ вне строки, мы вводим переменную, используя : в строке. Другой способ:

$SQL = 'SELECT ID, EMAIL FROM users WHERE user = ?';

Как выполнить запрос

ваш экземпляр PDO предоставляет два методы выполнения запроса. Когда у вас нет переменных, вы можете использовать query(), с переменными use prepare(). query() немедленно выполняется при вызове. Обратите внимание на объектно-ориентированный способ вызова (->).

$result = $connection->query($SQL);

метод подготовки

на подготовить метод принимает два аргумента. Первый-это строка SQL, а второй-параметры в виде массива. Основной пример

$connection->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

в нашем Пример строки SQL мы использовали именованную переменную :username. Нам все равно нужно привязать к нему переменную PHP, целое число или строку. Мы можем сделать это двумя способами. Либо создайте массив, содержащий именованные переменные как key или используйте метод bindParam или bindValue. Я объясню вариант массива и метод bindValue для простоты.

Array
Вы можете сделать что-то вроде этого для именованных переменных, где вы предоставляете переменная as ключ массива:

$queryArguments = Array(':username' => $username);

и это для индексированных переменных (?):

$queryArguments = Array($username);

когда вы добавили все необходимые переменные, вы можете вызвать метод execute() для выполнения запроса. Тем самым передавая массив в качестве аргумента функции execute.

$result = $connection->execute($queryArguments);

bindValue
The bindValue метод позволяет привязать значения к PDO пример. Метод принимает два обязательных аргумента и один необязательный. Необязательные аргументы задают тип данных значения.

для именованных переменных:

$connection->bindValue(':username', $username);

для индексированных переменных:

$connection->bindValue(1, $username);

после привязки значений к экземпляру вы можете вызвать execute без передачи каких-либо аргументов.

$result = $connection->execute();

Примечание: Вы можете использовать именованную переменную только один раз! Использование их дважды приведет к сбою в выполнении вопрос. В зависимости от ваших настроек это будет или не будет вызывать ошибку.

получение результатов

снова я буду охватывать только основы для получения результатов из возвращаемого набора. PDO-довольно продвинутое дополнение.

используя fetch и fetchAll

если ты запрос SELECT или выполнил хранимая процедура это вернуло результат set:

fetch
fetch - это метод, который может занять до трех необязательных аргументов. Он извлекает одну строку из результирующего набора. По умолчанию он возвращает массив содержит имена столбцов в виде ключей и индексированных результатов. Наш пример запроса может вернуть что-то вроде

ID      EMAIL
1       someone@example.com

fetch отвечу на это так:

Array
(
    [ID] => 1
    [0] => 1
    [EMAIL] => someone@example.com
    [1] => someone@example.com
)

Эхо всех выходных данных результирующего набора:

while($row = $result->fetch())
{
    echo $row['ID'];
    echo $row['EMAIL'];
}

есть другие варианты вы можете найти здесь: fetch_style;

fetchAll
Извлекает все строки в одном объекте Array. Использование той же опции по умолчанию, что и fetch.

$rows = $result->fetchAll();

если вы использовали запрос, который не возвращал результаты, такие как запрос вставки или обновления, вы можете использовать метод rowCount получить количество затронутых строк.

простой класс:

class pdoConnection
{
    public $isConnected;
    protected $connection;
    public function __construct($dsn, $username, $password, $host, $dbname, $options=array())
    {
        $this->isConnected = true;
        try { 
            $this->connection = new PDO($dsn, $username, $password, $options); 
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); //sets the default to return 'named' properties in array.
        } 
        catch(PDOException $e) { 
            $this->isConnected = false;
            throw new Exception($e->getMessage());
        }
    }

    public function Disconnect(){
        $this->connection = null;
        $this->isConnected = false;
    }

    public function query($SQL)
    {
        try
        { 
            $result = $this->connection->query($SQL); 
            return $result;  
        }
        catch(PDOException $e)
        {
            throw new Exception($e->getMessage());
        }
    }
    public function prepare($SQL, $params=array())
    {
        try
        { 
            $result = $this->connection->prepare($SQL); 
            $result->execute($params);
            return $result;     
        }
        catch(PDOException $e)
        {
            throw new Exception($e->getMessage());
        }       
    }
}

как использовать:

$dsn = 'mysql:dbname=databasename;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$db = new pdoConnection($dsn, $user, $password);

$SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';
$result = $db->prepare($SQL, array(":username" => 'someone'));

while($row = $result->fetch())
{
    echo $row['ID'];
    echo $row['EMAIL'];
}