Перемещение из 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 процедурной манерой. Если не в процедуре, то что лучше всего в ООП?
Ответы
Ответ 1
- У вас есть все время в мире, так как они никогда не перестанут работать самостоятельно!
- Да, есть несколько способов сделать это.
- Да, но нет единого решения для всех. Каждая ситуация различна, и то, что подходит для вашей конкретной ситуации, может быть нецелесообразным для каждой ситуации.
Во-первых, старый 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
}
Или вы можете сделать это с помощью статической переменной класса с помощью OOP...
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).
Ответ 2
Прежде всего, я даю +1 вашему вопросу, так как это хорошо, что вы начинаете свою миграцию.
ООП и аргумент
О программировании ООП и передаче аргументов, вот решение, основанное на шаблоне Singleton Factory:
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 предоставил script, который является добрым, чтобы перейти от mysql_ к mysqli здесь, и вы можете получить дополнительную информацию здесь.
То, что я могу сказать вам, - это то, что mysqli приносит функциональность под названием "подготовленный оператор", которая действительно обладает сильной и сильной защитой. Способ, которым mysqli обрабатывает подготовленный оператор, менее удобен для пользователя, чем способ PDO, но свойства одинаковы.