Intereting Posts
Cant login: mysqli_query () ожидает как минимум 2 параметра, 1 Статус GTML XMPPHP как я могу получить доступ к моему приложению laravel с другого компьютера? Как отключить или зашифровать «Просмотр источника» для моего сайта Использование регулярного выражения для фильтрации года фиксированной длины 0 или 4 цифры Google-подобная поисковая система в PHP / mySQL Личная переменная Laravel, разделенная между двумя методами в контроллере Форма PHP: невозможно изменить информацию заголовка – уже отправленные заголовки PHP CURL & HTTPS php preg_match, сопоставление, когда 2 слова могут входить в случайную последовательность Вычислить разницу дат с большим диапазоном с PHP У проблемы $ _REQUEST проблемы с безопасностью? Использование jQuery для отправки данных из multipart / form-data через ajax Код парсера с открытым исходным кодом для разметки Mediawiki Интеграция внешних скриптов с Zend Framework

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

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

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

  • mysqli_connect ()
  • PDO :: __ конструкт ()

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

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

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

Прежде всего:

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

Почему функции mysql устарели?

Расширение mysql является древним и существует со времен PHP 2.0, выпущенного 15 лет назад (!!); который является совершенно другим зверем, чем современный PHP, который пытается избавиться от плохих практик своего прошлого. Расширение mysql является очень сырым, низкоуровневым коннектором для MySQL, которому не хватает многих удобных функций, и поэтому его сложно применять правильно в безопасном режиме; поэтому плохо для noobs. Многие разработчики не понимают SQL-инъекцию, а API-интерфейс mysql достаточно хрупкий, чтобы затруднить его предотвращение, даже если вы знаете об этом. Он заполнен глобальным состоянием (например, неявное соединение), что упрощает запись кода, который трудно поддерживать. Поскольку он старый, может быть неоправданно трудно поддерживать на уровне ядра 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 для php_pdo_sqlsrv_##_nts.dll не связанного с потоком

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

 $connection = new PDO(arguments); 

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

  1. DSN или Data Source Name , в основном это строка, содержащая информацию о имени драйвера, хоста и базы данных.
  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-сервером, добавьте эти параметры в свой 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']; }