Сравнение mysql ext и mysqli

shakil

Новичок
"пацаны с пхп.су рассказали" - это не "факт". Это называется "бабкины сказки"

Тебе наврали.
Скорость самого расширения никакой роли не играет вообще.

Про безопасность тоже.
сама по себе MySQLI никак безопасности не прибавляет
а если с умом пользоваться, то и та и другая библиотека одинаково безопасны.

вот видишь - ты не можешь привести ни одного конкретного примера, почему надо использовать MySQLI, а лезешь с советами.
Советовать (да ещё таким тоном) надо только то, в чем сам уверен, а не что пацаны на раёне рассказали
Добрый день всем!
Читал темку, и увидел больной вопрос на тему чем mysqli лучше mysql, а поскольку недавно убил 2 недели на выяснение этого вопроса, т.к. mysql не могла решить поставленных задач, то решил зарегаться, чтобы ответить.
По существу:
1. mysql не умеет работать с процедурами MySQL, т.е. можно вызвать процедуру с помощью CALL, но ответ не получим - можно только получить одиночный результат, а не выборку. Зачем использовать процедуры - это отдельный рассказ, вкратце - передается набор параметров в MYSQL, по ним строятся временные таблицы, и потом делается запрос с фильтрацией по временным таблицам (так сделано для оптимизации быстродействия). mysqli позволяет же получить выборку и ее обработать, единственный маленький минус в том, что нужно пройтись по всем результатам запроса, иначе след. запрос выдаст ошибку (на этом же подключении).
2. mysqli позволяет использовать мультизапросы. Очень удобно при большом количестве update - собрал с один запрос и отправил. mysql query позволяет использовать только один запрос :-(
3. по быстродействию не подскажу.

P.S. Сейчас перевожу свой сайт на использование mysqli с использованием единого класса обработки данных из БД, т.к. сайт писали до меня и засилье mysql_query() немного достало.
Сначала думал написать свой класс по типу того как написал автор, но в результате все равно получиться что-то типа DBSimple, поэтому считаю, что лучше все-таки использовать сторонние разработки и расширить их своими классами.
 

malina95

Дракула кода:)
Вы правы но не во всем, во первых, использовать голое соединение мжно, но это не удобно, во вторых, если писать класс оюертку, то лучше делать в виде singleton, так гораздо лучше и оптимизированней для самописного сайта.
 

Фанат

oncle terrible
Команда форума
Добрый день всем!
Читал темку, и увидел больной вопрос на тему чем mysqli лучше mysql, а поскольку недавно убил 2 недели на выяснение этого вопроса,
То есть, большая красная надпись в мануале вопрос не прояснила?
можно только получить одиночный результат, а не выборку.
Это тебе кто сказал?
единственный маленький минус в том, что нужно пройтись по всем результатам запроса, иначе след. запрос выдаст ошибку (на этом же подключении).
с мануалом, я вижу, совсем не дружишь, и про store_result не в курсе?
Очень удобно при большом количестве update - собрал с один запрос и отправил.
ну да, ну да.
Собирать в цикле удобно, а отправлять - ну никак. Хотя казалось бы - цикл тот же, кода столько же. А вот поди ж ты.
 

shakil

Новичок
Я думаю что если бы Вы столкнулись с проблемой получения данных из процедуры MySQL используя mysql_query(), то не писали бы такие вопросы, о том кто мне такое сказал :)
По существу:
- сначала читаем статью ссылка.
- там написано почему mysql не вернет выборку (если все таки остались сомнения, то гуглим по фразе "can't return a result set in the given context"), а также то, почему после выборки одноразовый запуск функции store_result() не сработает - поскольку в результате возвращается как результат процедуры, как и ответ, но нужно пройтись по всем записям с помощью next_result(), чтобы в дальнейшем не вылезла ошибка "Commands out of sync; you can't run this command now".
- по мультизапросам. Мне удобней собрать мультизапрос на изменение 500 цен и один раз отправить в БД, чем 500 раз посылать запросы к базе. Я думаю, что это как минимум быстрее и корректнее. Но это личное дело каждого. Кстати, надо будет потестить на быстродействие (стало самому интересно).
 

malina95

Дракула кода:)
То есть, большая красная надпись в мануале вопрос не прояснила?

Это тебе кто сказал?

с мануалом, я вижу, совсем не дружишь, и про store_result не в курсе?

ну да, ну да.
Собирать в цикле удобно, а отправлять - ну никак. Хотя казалось бы - цикл тот же, кода столько же. А вот поди ж ты.
Согласен, я эту тему перерыл уже много раз, и это чистая правда...
 

shakil

Новичок
почему после выборки одноразовый запуск функции store_result() не сработает - поскольку в результате возвращается как результат процедуры, как и ответ, но нужно пройтись по всем записям с помощью next_result(), чтобы в дальнейшем не вылезла ошибка "Commands out of sync; you can't run this command now".
Здесь немного некорректно написал. store_result() сработает, но при след. запросе при использовании объекта этого класса возникнет ошибка.
 

shakil

Новичок
Если делать обычный запрос, и выбирать через store_result(), то потом не возникнет, а если вызвать процедуру, которая вернет выборку, например:
$this->mysqli->query('call create_tables_for_getPriceDataCompl("'.$values.'")');
это пример из рабочей базы, потом выбрать данные через store_result(), и не пройдясь по всем результатам (а их 2, как я писал раньше - выборка и результат выборки) попытаться опять выполнить какой-то запрос, то возникнет вышеописанная ошибка.
Я использую конструкцию
while($this->mysqli->next_result()) $this->mysqli->store_result();
чтобы пройтись по результатам и они уйдут из буфера.

Испытано на собственной шкуре как говориться :) Возникнет!
 

Фанат

oncle terrible
Команда форума
- сначала читаем статью
сначала смотрим на её дату
и сразу понимаем, что читать её - только глаза портить.
гуглим по фразе
я парень простой, в гуглях не очень разбираюсь. мне проще код написать
PHP:
$rs = mysql_query( 'CALL test.get_users()' );
while($row = mysql_fetch_assoc($rs))
{
    var_dump($row);
}
array(3) {
["users_id"]=>
string(1) "1"
["first_name"]=>
string(4) "Joey"
["last_name"]=>
string(6) "Rivera"
}
array(3) {
["users_id"]=>
string(1) "2"
["first_name"]=>
string(4) "John"
["last_name"]=>
string(3) "Doe"
}
что я делаю не так?
 

Фанат

oncle terrible
Команда форума
это уже из другой оперы. "пройтись по всем результатам запроса" и "пройтись по всем результсетам мультизапроса или процедуры" - это разные вещи.
ох, ностальгия!
Я там до сих пор вторым номером в рейтинге %)
Блин, столько не живут
 

shakil

Новичок
Все правильно делаете. Еще может быть дело в версии PHP.
У меня на локальном компе стоит 5.3.5 - mysql отрабатывает вызов процедуры нормально, как и у Вас, а вот у провайдера 5.2.6, и вот там уже начинаются проблемы, которые я описал выше, а поскольку провайдер вряд ли будет менять PHP под меня, поэтому пришлось переходить на mysqli. Нужно было решение которое работает везде, и обладает более расширенным функционалом.
Предложение поменять провайдера не предлагать :)
 

Фанат

oncle terrible
Команда форума
провайдер вряд ли будет менять PHP под меня
а у некоторых нет, к примеру, mysqli
в общем, это проблема сборок, а не расширения.

по поводу скорости - если сделать транзакцию, то в скорости разницы не будет.

в общем, если подытожить, то принципиальных проблем у mysql ext нет.

но mysqli, разумеется, новее, моднее и с фичами.
и если бы в ней сделали нормальную работу с prepared statements, а не как сейчас - задним ходом через Владивосток с рыданиями вприсядку - то и вовсе была бы прекрасная библиотека.
 
Сверху