Подтвердить что ты не робот

Перемещение из 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 процедурной манерой. Если не в процедуре, то что лучше всего в ООП?
4b9b3361

Ответ 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, но свойства одинаковы.