Свершилось!
Старый добрый драйвер mysql (не путать с СУБД MySQL) объявлен вне закона. Ну то есть deprecated Пока не совсем, но всё же. Ликуют поборники универсальных и тормознутых классов-велосипедов для работы с СУБД, наконец то они увидели пользу от своих монструозных поделок.
Да фиг с ними, пусть радуются. У нас возникла небольшая проблема и мы её сейчас решим. Решим без всяких "универсальных" велосипедов, во сто крат проще.
Что нужно, что бы перевести проект на mysqli Первым делом необходимо взвесить все за и против. Дело в том, что mysql будет жить на хостингах еще минимум лет 20. Хостеры не дураки, создавать себе проблемы. Панику разводят только параноики, как в случае с концом света.

Собственно ничего не случилось, просто объявили о прекращении поддержки. Дык mysql настолько обкатана, что в ней и не нуждается. Так что если проект работает, не трогайте его. Никакого профита не будет, это точно.
Но все же если прижало, не печальтесь. Все до безумия просто. Вот маленькая утилитка
(MMiC Mysql MysqlI Converter), которая переведет ваш сайт с mysql на mysqli за несколько секунд.

Не верите? Ну тогда смотрим, как это устроено.
Для начала уясним разницу. Драйвер mysqli предоставляет два интерфейса. Разрабы тоже не дураки и понимают, что не у всех тараканы в голове. Один интерфейс объектно-ориентированный. Второй процедурный. Второй на самом деле очень мало отличается от mysql. Вот его и зюзаем.
Основное отличие в том, что теперь для организации запроса в основную функцию необходимо передать объект, а не указатель на ресурс. А его не поместишь в константу. И передать его нужно обязательно. Причем передать его нужно первым аргументом, не вторым. Так что тут нам не обойтись без обертки. Если кто юзал обертку, ему проще. Кто не юзал, сейчас научу. Обертка, это пользовательская функция, которая расширяет возможности штатной. Ну или подстраивает её под свои нужды. Вот мы и напишем сейчас такую, которая будет похожа на mysql_query():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php
$link = @mysqli_connect('localhost', 'root', '', 'test') or die('No connect');
function mysqlQuery($sql) { global $link; $result = mysqli_query($link, $sql) or die(mysqli_error($link)); return $result; }
|
В таком виде она уже готова к работе. Но это не есть гут. Мы передали объект в функцию из глобального пространства. Сам по себе global не так страшен, как его малюют, но в нашем случае он не годится.
Дело в том, что этот объект требуется аргументом не только в этой функции. Но и во многих других. Допустим mysqli_insert_id() А она может находиться где угодно, в любой нашей функции или классе. Прописывать в каждую функцию global $link; мы задолбаемся. Так что нужно решить проблему раз и на всегда.
Делается это очень просто. Пишем маленький классик и делаем этот линк свойством.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
class DB { static $link; static $count = 0;
public static function connect() {// Синглтончик-с в целях экономии if(empty(self::$link)) { self::$link = @mysqli_connect('localhost', 'root', '', 'test') or die('No connect'); mysqli_set_charset(self::$link, 'utf8'); } } }
// Запускаем не отходя от кассы DB::connect();
|
Поместить этот класс нужно в файл с названием db.php в доступном для автолоада месте. Ну или просто подключать по мере необходимости. В классе реализован синглтон, а значит мы будем иметь только один коннект, сколько раз бы не дергали класс.
Теперь эта переменная доступна в любом месте. Стоит только прописать так:
1
2
3
4
5
6
7
8
9
10
|
<?php
function mysqlQuery($sql) { $result = mysqli_query(db::$link, $sql) or die(mysqli_error(db::$link)); return $result; }
|
По факту мы получили глобальную переменную без явного объявления её таковой. И обертка теперь у нас приняла подобающий вид, и можно продолжать реплейсить свой проект.
Дальше все просто. Берем функцию mysql и меняем её на аналог mysqli.
Так вот, утилитка MMiC делает это все сама. И создает класс, и меняет функции.
Нужно отметить, что не все аналоги есть. Допустим понадобится новая реализация функции mysql_result(). Утилитка сделает и это. А остальные используются очень редко, программа покажет, где они присутствуют в проекте. И тогда можно что-то с ними решить. Либо написать свою реализацию, либо исключить из логики.
Главное не забывайте подключить новый файл коннекта. Он должен быть доступен отовсюду, где есть запросы.
Ну и конечно никто не застрахован от внештатных ситуаций. Программа на всякий случай делает бэкап приложения. Так что особо не бойтесь. Ничего не испортится.
Ну и удачи. Если что не так - пишите)
Николай aka twin
Роман