2012-12-08 2 views
21

У меня есть функция, которую я использовал с моими скриптами. openDBConn() и closeDBConn() Эти функции называются функцией mysql_connect(). Используется, как показано нижеПеремещение из mysql-соединения в mysqli

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 процедурной процедурой. Если не в процедуре, то что лучше всего в ООП?
+3

Семейство функций 'mysql_' будет устарело в 5.5 и может быть полностью удалено в любой последующей * основной * версии. Рассмотрение 5.5 даже не в бета-версии, а релиз * после *, который находится в отключенном состоянии, вам не нужно паниковать. Примите это хорошо и медленно, и учитесь в своем собственном темпе. Кроме того, проверьте каждый последний из этих вопросов на боковой панели ** Related **. Они помогут. – Charles

+3

Также обратите внимание на [PDO] (http://php.net/book.pdo) вместо mysqli. Они оба настолько же способны, но подготовленный синтаксис инструкции PDO намного, гораздо более дружелюбный. PDO - только OO- * * и не имеет процедурного отступления, такого как mysqli. – Charles

ответ

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

Во-первых, старый внутр/MySQL является устаревшим PHP 5.5.0, но она никогда не перестанет работать полностью как расширение сама в конечном итоге будет перемещен в PHP PECL repository (, когда приходит время, чтобы удалить его). Тем не менее, мы еще не находимся, и вас могут затронуть только тогда, когда вы решили перейти на эту версию 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 prepared statements and parameterized queries.

Я хочу обратить ваше внимание на преимущества использования новых API-интерфейсов для взаимодействия с вашей базой данных MySQL (а именно PDO and MySQLi).

+0

Спасибо за это, очень ценю. Я всегда думал, что могу использовать mysqli_init() для доступа к последней ссылке соединения, но все, что она возвращает, - это объект с пустым thread_id –

+0

. Вы очень желанны, но это не то, что [mysqli_init] (http://php.net/mysqli .init). Он используется для получения объекта к [mysqli_real_connect] (http://php.net/mysqli.real-connect), который делает что-то очень отличное от [mysqli_connect] (http://php.net/mysqli.construct) , Пожалуйста, прочитайте соответствующие ссылки для руководства. – Sherif

+0

Я пробовал свой код, но когда я вызываю его в функции, выполняющей запрос, ссылка пуста. Есть что-то, чего я не вижу? –

3

Прежде всего, я даю +1 вашему вопросу, так как это хорошо, что вы начинаете свою миграцию.

OOP и аргумент

О ООП программирование и аргументы прохождения, вот это решение, которое основано на Singleton завода схеме:

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 here, и вы можете получить более подробную информацию here.

Что я могу сказать вам, что mysqli приносит функциональность под названием «подготовленный оператор», то есть действительно мощный и сильный о безопасности. Способ, которым mysqli обрабатывает подготовленный оператор, менее удобен для пользователя, чем способ PDO, но свойства одинаковы.

Смежные вопросы