Переход от подключения к 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_* устарел, у меня есть следующие вопросы:

  1. Сколько времени у меня есть до того, как большинство моих функций перестанут работать?
  2. Есть ли любой текущий или будущий способ доступа к текущему соединению mysqli в качестве добавления дополнительных параметров к моим функциям будет затруднен?
  3. Существует ли какой-либо надлежащий способ кодирования для доступа к текущей ссылке подключения mysqli процедурным способом. Если не процедурно, то что лучше всего в ООП-манере?
Author: phant0m, 2012-12-08

2 answers

  1. У вас есть все время в мире, так как они никогда не перестанут работать самостоятельно!
  2. Да, есть несколько способов сделать это.
  3. Да, но не существует универсального решения для всех. Каждая ситуация отличается, и то, что подходит для вашей конкретной ситуации, может не подходить для каждой ситуации.

Во-первых, старый 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).

 14
Author: Sherif, 2012-12-08 11:46:05

Прежде всего, я даю +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, но свойства те же.

 3
Author: artragis, 2012-12-29 07:52:16