Как успешно переписать старый код mysql-php с устаревшими функциями mysql_ *?
Я все еще участвую в основном из книг, которые покупаю, но сегодня я стараюсь, чтобы моя книга была старой, хотя я купил ее в этом году в отношении программирования на PHP. Теперь я знаю, что команды mysql_ * на PHP устарели и должны быть заменены более безопасными и стабильными подготовленными операторами и PDO. Поэтому я поставил себе переписать всю свою сеть в соответствии с ней, и, может быть, мне понадобятся некоторые советы от вас, как это сделать правильно и работать у вас все более опытные ребята:)
Итак, я начну переписывать только основную часть (подключитесь к db и выбирая DB) здесь (остальное я могу сделать самостоятельно с помощью google и руководств). Я напишу здесь свой старый script и спрошу вас, делаю ли я все правильно и ничего не пропускаю, и надеюсь, что это может быть хорошим руководством для других людей. Итак, давайте начнем.
Итак, в config у меня есть что-то вроде этого:
$db = new dbConn('127.0.0.1', 'root', 'pass', 'people', 'animals');
Что должно быть следующим:
$db = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');
Правильно? Но когда мне нужно выбрать базу данных позже, я должен сделать это без dbname=people;
? Но как выбрать базу данных позже?
Вот мой единственный и единственный script для перезаписи, который является основным в большинстве веб-проектов, и я надеюсь, что это принесет мне не только понимание того, как действительно работает новая система PDO:
class dbConn
{
public function __construct($server, $user, $pass, $db_people, $db_animals)
{
if (!empty($server) && !empty($user) && !empty($pass) && !empty($db_people) && !empty($db_animals))
{
$this->server = $server;
$this->user = $user;
$this->pass = $pass;
$this->db_people = $db_people;
$this->db_animals = $db_animals;
$this->connect();
}
else
{
die("Set up connection to db");
}
}
public function connect()
{
$this->conn = mysql_connect($this->server, $this->user, $this->pass) or die ('cannot connect to MySQL');
}
public function selectDb($database)
{
switch($database)
{
case 'people':
mysql_select_db($this->db_people, $this->conn) or die ('cannot connect to database '.$this->db_people.'.');
mysql_query("SET NAMES 'utf8'");
break;
case 'animals':
mysql_select_db($this->db_animals, $this->conn) or die ('cannot connect to database '.$this->db_animals.'.');
mysql_query("SET NAMES 'utf8'");
}
}
public function __destruct()
{
if (!empty($this->conn))
{
mysql_close($this->conn);
}
}
}
Итак, из того, что я знаю из Google и Wiki, функции, такие как public function __construct
и public function __destruct()
, больше не нужны, не так ли? То же самое с такими функциями, как public function connect()
SO, только что осталось public function selectDb($database)
, но я понятия не имею, как это сделать правильно, без ущерба для всего соединения с базой данных. Потому что в остальной части моего кода (не упоминается здесь) я легко могу выбрать базу данных по этому коду: $this->db->selectDb("people");
Но с подготовленными утверждениями я не знаю, возможно ли это даже в том случае, если это возможно. Надеюсь, некоторые советы по этому поводу помогут мне и другим пользователям лучше понять этот новый код. Другие части кода, которые могут возникнуть в этом PDO Tutorial для разработчиков MySQL. Спасибо.
Ответы
Ответ 1
Собственно, простой, сладкий и короткий: Да, больше не нужно.
Давайте рассмотрим код, который мы не потеряли:
-
__construct
- Конструктор просто содержал всю конфигурацию. PDO имеет гораздо более понятную концепцию здесь, строку соединения, содержащую большую информацию:
mysql:host=127.0.0.1;dbname=people;charset=UTF-8
Кроме того, PDO предоставляет конструктор для использования в готовом виде, поэтому double необязательно.
-
connect
- Функция соединения больше не нужна. Это делается путем создания экземпляра PDO. Вы можете искать исключения, в руководстве PHP есть пример на странице конструктора.
-
selectDb
- Эта сложная функция больше не нужна. Вау, третья функция, которую мы можем просто сбросить из-за строки подключения PDO. Большая мощность с таким количеством символов. Ура!
-
__destruct
- деструктор. Пусть справедливо: MySQL тоже не нужен. Однако с PDO мы получаем это бесплатно - без написания одной строки кода.
Выглядит хорошо! Вам удалось перейти от этого неясного класса базы данных к PDO, удалив устаревший код! ПОЗДРАВЛЯЕМ:
$db = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');
Если вы сейчас подумаете, а что, если я хочу иметь класс базы данных самостоятельно? Хорошо, вы можете это сделать, потому что вы можете перейти от PDO (да, это работает!):
class DB extends PDO
{
... my super-new-shiny-code
}
Почему вы можете это сделать? Не знаю, но, возможно, он более свободно говорит о вашем коде. Если вы ищете лучший пример кода, у меня есть его в таблице PHP/MySQL с гиперссылками.
Ответ 2
Я думаю, что самый простой способ переключить базу данных внутри вашего приложения будет:
$pdo_instance->query("USE people");
и
$pdo_instance->query("USE animals");
или, возможно, лучший (и более чистый) способ может быть
$db_people = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');
и
$db_animals = new PDO('mysql:host=127.0.0.1;dbname=animals;charset=UTF-8', 'root', 'pass');
Если вы помечаете базу данных в активном классе, вы можете получить доступ к данным с помощью $db_people->query()
или $db_animals->query()
.