При чтении на php.net о функциях MySQL . Я столкнулся с этим сообщением
Предупреждение Это расширение устарело с PHP 5.5.0 и будет удалено в будущем. Вместо этого следует использовать расширение MySQLi или PDO_MySQL. См. Также MySQL: выбирая руководство по API и связанные с ним FAQ для получения дополнительной информации. Альтернативы этой функции включают:
- PHP и MySQL: усечение нескольких таблиц
- PHP: проверять базу данных mysql каждые 10 секунд для любых новых строк
- Нужна консультация для создания оцифрованной системы приема билетов
- MySQL получает разговор между двумя пользователями
- как сохранить ссылку встраивания youtube в базе данных
- mysqli_connect ()
- PDO :: __ конструкт ()
Я читал о PDO. Как я могу обновить свой код до PDO с помощью MySQL или MSSQL?
Я вижу много кода, размещенного на SO, реализующего функции my_sql . И комментарии от других (включая меня), нажимая на вопросников, чтобы отказаться от функций MySQL и начать использовать PDO или MySQLI. Этот пост здесь, чтобы помочь. Вы можете обратиться к нему, поскольку он дает объяснение тому, почему они устарели и что такое PDO , плюс минимальный пример кода для реализации PDO.
Прежде всего:
Преобразование из функций mysql в PDO – это не простой случай поиска и замены. PDO – это объектно-ориентированное программирование, добавляемое для языка PHP. Это означает другой подход при написании кода, как и в функциях mysql . Сначала зачем конвертировать?
Расширение mysql является древним и существует со времен PHP 2.0, выпущенного 15 лет назад (!!); который является совершенно другим зверем, чем современный PHP, который пытается избавиться от плохих практик своего прошлого. Расширение mysql является очень сырым, низкоуровневым коннектором для MySQL, которому не хватает многих удобных функций, и поэтому его сложно применять правильно в безопасном режиме; поэтому плохо для noobs. Многие разработчики не понимают SQL-инъекцию, а API-интерфейс mysql достаточно хрупкий, чтобы затруднить его предотвращение, даже если вы знаете об этом. Он заполнен глобальным состоянием (например, неявное соединение), что упрощает запись кода, который трудно поддерживать. Поскольку он старый, может быть неоправданно трудно поддерживать на уровне ядра PHP.
Расширение mysqli намного новее и устраняет все вышеперечисленные проблемы. PDO также является довольно новым и устраняет все эти проблемы, а также больше.
По этим причинам * расширение mysql будет удалено когда-нибудь в будущем.
источник Deceze
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
дляphp_pdo_sqlsrv_##_nts.dll
не связанного с потоком
Подключение к базе данных с использованием PDO Для подключения к базе данных вам нужно создать новый экземпляр PDO из конструкции PDO .
$connection = new PDO(arguments);
Конструктор PDO принимает 3 требуемых аргумента и 1 необязательный.
Подключение к 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-сервером, добавьте эти параметры в свой PDO-экземпляр, используя
setAttribute
:$connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
PDO использует подготовленные заявления . Это реальная разница между подходом PDO и функциями mysql . Последний был очень восприимчивым к SQL-INJECTION . Можно было бы построить такой запрос:
$SQL = 'SELECT ID FROM users WHERE user = '.$username ;
Когда вредоносный веб-сайт или человек отправляет имя пользователя- injector; DROP TABLE users
injector; DROP TABLE users
. Результаты будут разрушительными. Вам нужно было подтвердить свой код, экранируя и инкапсулируя строки и переменные кавычками. Это нужно было сделать для каждого запроса. На более крупных веб-сайтах или плохо поддерживаемом коде риск получения формы, которая допускает SQL-инъекцию, может стать очень высокой. Подготовленные утверждения устраняют вероятность внедрения SQL Server первого уровня, как в примере выше.
Драйверы 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
Вы можете сделать что-то подобное для именованных переменных, где вы указываете переменную как массив :
$queryArguments = Array(':username' => $username);
И это для индексированных переменных ( ?
):
$queryArguments = Array($username);
Когда вы добавили все необходимые переменные, вы можете вызвать метод execute()
для выполнения запроса. Таким образом, передача массива в качестве аргумента функции execute
.
$result = $connection->execute($queryArguments);
bindValue
Метод bindValue позволяет привязывать значения к экземпляру PDO . Метод принимает два обязательных аргумента и один необязательный. Необязательные аргументы задают тип данных значения.
Для именованных переменных:
$connection->bindValue(':username', $username);
Для индексированных переменных:
$connection->bindValue(1, $username);
После привязки значений к экземпляру вы можете вызвать execute
без передачи каких-либо аргументов.
$result = $connection->execute();
ПРИМЕЧАНИЕ. Вы можете использовать только именованную переменную один раз! Использование их дважды приведет к неспособности выполнить запрос. В зависимости от ваших настроек это приведет или не вызовет ошибку.
Опять же, я расскажу только об основах для получения результатов из возвращаемого набора. PDO – довольно продвинутое дополнение.
Использование fetch
и fetchAll
Если вы выполнили запрос выбора или выполнили хранимую процедуру, которая вернула результирующий набор:
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']; }