Переход от подключения к mysql к mysqli
У меня есть функция, которую я использовал в своих сценариях. openDBConn()
и closeDBConn()
Они оба вызвали функцию mysql_connect()
. Используется, как показано ниже
openDBConn();
$car_model = getCarModel($car_id);
$car_color = getCarColor($car_id);
closeDBConn();
Выполнение этого таким образом также позволяет мне сделать следующее
openDBConn();
mysqlStartTranscation();
upgradeCarColor($car_id);
addNewWing($car_id);
mysqlCommit();
closeDBConn();
Дилемма теперь в том, что если я перейду на mysqli, мне нужно будет передать ссылку для подключения.
Я также читал, что mysql_* устарел, у меня есть следующие вопросы:
- Сколько времени у меня есть до того, как большинство моих функций перестанут работать?
- Есть ли любой текущий или будущий способ доступа к текущему соединению mysqli в качестве добавления дополнительных параметров к моим функциям будет затруднен?
- Существует ли какой-либо надлежащий способ кодирования для доступа к текущей ссылке подключения mysqli процедурным способом. Если не процедурно, то что лучше всего в ООП-манере?
2 answers
- У вас есть все время в мире, так как они никогда не перестанут работать самостоятельно!
- Да, есть несколько способов сделать это.
- Да, но не существует универсального решения для всех. Каждая ситуация отличается, и то, что подходит для вашей конкретной ситуации, может не подходить для каждой ситуации.
Во-первых, старый ext/mysql устарел с PHP 5.5.0, но он никогда не перестанет работать полностью, так как само расширение в конечном итоге будет перенесено в репозиторий PHP PECL ( когда придет время удалить его). Однако мы еще не достигли этого, и вы можете пострадать только тогда, когда и если вы решите перейти на эту версию PHP. Точное время удаления расширения не определено.
Во-вторых, вы можете использовать переменную для хранения подключения к базе данных точно так же, как старое расширение ext/mysql делало для вас за кулисами. Хитрость заключалась в том, что вы не знали, что он делает (он использует последний открытый соединение, созданное вами при вызове mysql_connect, и использует его каждый раз, когда вы вызываете что-то вроде mysql_query для доступа к базе данных).
Вы можете сделать это со статической переменной в своей функции, используя процедурный стиль....
function openDBConn() {
static $link;
if (!isset($link)) {
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
}
return $link; // returns the link
}
Или вы можете сделать это с помощью статической переменной класса, используя ООП...
Class MyDBConnect {
public static $link;
public function openDBConn() {
if (!isset(static::$link)) {
static::$link = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
}
}
}
Я хочу поощрить вас за использование новых API-интерфейсов, и я благодарю вас за это, но я также хочу предостеречь вас по мере продвижения вперед. Когда вы начнете переносить свой функции, переходящие от старых функций ext/mysql к новому расширению mysqli, будьте осторожны, чтобы также не переносить плохие методы старого расширения (например, использование старой конкатенации строк SQL и методов экранирования, предлагаемых ext/mysql). Вместо этого воспользуйтесь преимуществами подготовленных операторов MySQLi и параметризованных запросов.
На что я действительно хочу обратить ваше внимание, так это на преимущества использования новых API для взаимодействия с вашей базой данных MySQL (а именно PDO и MySQLi).
Прежде всего, я даю +1 на ваш вопрос, так как это хорошо, что вы начинаете свою миграцию.
ООП и аргумент
Что касается программирования ООП и передачи аргументов, вот решение, основанное на одноэлементном фабричном шаблоне:
class MysqliConnection{
private static $connection = null;
public static function getConnection(){
if(self::$connection === null){
//Here get some routine to make your configuration extern
self::$connection = new Mysqli(/*args*/);
}
return self::$connection;
}
Если вы хотите отправить запрос, вы можете использовать его следующим образом:
function methodWhichSendsAQuery(){
$mysqli = MysqliConnection::getConnection();
$query = $mysqli->prepare(/*your query*/);
/*some param bindings with $query->bindParam()*/
$query->execute();
return $query->fetchAll(); //an array with all results
}
Я предпочитаю это решение другим, так как оно чистое, читаемое и не зависит от глобальных переменных. Принцип единой ответственности заключается в уважаемый, и это нормально.
Рефакторинг mysql_ в mysqli
Рефакторинг может быть действительно сложным, если вы привыкли обрабатывать mysql_ старым способом, я имею в виду без аргумента ressource, mysql_escape_string
и т. Д. и т. Д.
Mysql предоставил скрипт, который является мощным средством для миграции с mysql_ на mysqli здесь, и вы можете получить дополнительную информацию здесь.
Что я могу вам сказать, так это то, что mysqli предоставляет функциональность под названием "подготовленное заявление", которая действительно мощный и сильный в плане безопасности. Способ, которым mysqli обрабатывает подготовленный оператор, менее удобен для пользователя, чем способ, которым это делает PDO, но свойства те же.