Pull to refresh

Comments 35

Спасибо, полезно! Но насчет нервов и трудозатрат — это спорный вопрос. Как сам автор отметил: «Сегодня все используют PDO...».
Да, хотелось бы в продолжение аналогичную статью для PDO
mysqlnd_ms может адекватно и нативно заменить mysql proxy?
Спасибо, про память было особенно интересно!
Огромное спасибо за это:
mysqli_options($m, MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);

Впилил в mysqli модуль для Коханы, при выборке 100 записей из БД потребление памяти упало на 5%. Помоему неплохо для однострочного фикса.
UFO just landed and posted this here
тысячу лет назад, да, появилось
UFO just landed and posted this here
полуофициальный, кто-то из разработчиков Коханы написал по быстрому и залил на гитхаб. Релиза не было естественно.
По теме статьи: моя любимая функция в PHP — как раз mysqli_real_escape_string </sarcasm>
Моя тоже. No sarcasm.
Прекрасная функция, у которой нет никаких проблем, кроме пользователей.
Очень интересная и полезная статья. Я прочитал её недели 2 назад и сразу отправил ссылки знакомым. Могу порекомендовать остальные 3 статьи в блоге автора: jpauli.github.io/ (английский язык). Пишет про внутренности PHP и то, как это соотносится с буднями программирования на самом PHP.
UFO just landed and posted this here
эмм возможно я вас неверно понял но функции mysqli_set_character_name() у mysqli нет, есть mysqli_set_charset
Автор, по-видимому, описался. Правильно mysqli_set_charset().

Кому интересно, чем это отличается от SET NAMES и почему функция mysqli_set_charset() правильнее, вот тут есть пример того, как кодировка влияет на правила эскейпинга. Для меня было откровением. Правда, в реалиях UTF-8, насколько я понимаю, на это наткнуться невозможно (т. е. отличия SET NAMES 'utf8' от mysqli_set_charset не будет).
Ну и для полноты картины стоит добавить, что в PDO аналогичный эффект достигается заданием charset в DSN. Работает начиная с 5.3.6
Спасибо, поправил. Как-то я и сам этот момент упустил
только аккуратней с apt-get install php5-mysqlnd, так как php5-mysql (и всё что с ним связано, например phpmyadmin) будут удалены
Вроде phpmyadmin уже может использовать пакет mysqlnd
Спасибо. Классная статейка. Особенно понравилось про раздувание памяти. Как-то я раньше не думал об этом.
Более 5 лет использую mysqli и узнал кое-что новое
как говорится «век живи — век учись»
а вообще-то ман в руки и с флагом по жизни!
спасибо за статью

интересно, а с каких пор в маил-ру есть РНР-ные проекты?
первая статья мейлру которую я плюсану с большим удовольствием. Спасибо за подробное описание. Даёшь меньше коммерции, больше технической информации!
статья действительно хорошая, тоже плюсанул, но справедливости ради — это перевод, а не авторская статья мейлру
Ну, как показывает практика, сама libmysql написана через Ж..., и для её использования в много-тредовом режиме приходится делать танцы с бубнами. Багрепорты не помогают…
Да вроде как с инитом только проблемы, не? У нас постоянно в многопоточном либмай гоняют, без проблем.
UFO just landed and posted this here
Ну как бы, можно использовать ORM, которая будет делать все за вас, можно сделать обертку над DBAL, можно много чего придумать что бы не прописывать все руками.

Да и что сейчас стоит взять маленький виртуальный сервачек для своего небольшого проектика и распрощаться с болью.
UFO just landed and posted this here
Вот кто и зачем делает настолько бледные схемы расцветки кода?
Они как бы говорят мне «У твоего монитора недостаточно выкручена контрастность»)
Очень грустно читать статью, автор которой предубеждён против какой-либо технологии, и, за неимением фактов, пытается отстаивать свои пристрастия с помощью голословных утверждений.

В случае с MySQL, уровень эмуляции PDO активен по умолчанию, когда вы готовите запрос. Но он никогда не достигнет уровня подготовленного выражения. По сути, код PDO отпарсит и соберёт ваш запрос без взаимодействия с MySQL на эту тему. Это странное поведение.

Это единственно правильное поведение в 99.9% случаев.
Поддерживаемые базой подготовленные выражения ориентированы на однократную подготовку и множественное выполнение одного и того же запроса. В пхп такое поведение требуется в мизерном количестве случаев. Всё остальное время гонять запрос в БД по два раза, чтобы «достичь уровня просветления подготовленного выражения» — бессмысленно. И замена плейсхолдеров на их значения, производимая PDO, работает прекрасно.

Да, режим эмуляции приводит к небольшим неудобствам.
Да, параметр LIMIT без явного указания типа приведет к ошибке.
Да, даже явное указание не спасёт для случая
$stmt->bindValue('limit', '10', PDO::PARAM_INT);

— PDO все равно добавит кавычки, несмотря на модификатор PDO::PARAM_INT.
Но положа руку на сердце — это не те проблемы, ради которых стоит устраивать такой шум. Режим эмуляции — прекрасная вещь, и бежать отключать его совсем не обязательно.

Несмотря на то, что мы явным образом отключили уровень эмуляции подготовленных выражений в PDO, он всё ещё немного активен. У него инициирован парсинг параметров. Есть два вида синтаксиса параметров: анонимные параметры, представленные как «?» в вашем запросе на заполнение, и именованные параметры, вроде «:myparam». Не каждая RDBMS поддерживает оба синтаксиса, причём MySQL не поддерживает именованные, только анонимные. Однако наш предыдущий запрос завершён без проблем. Всё дело в том, что анализатор запросов PDO всё ещё активен, даже с отключённым уровнем эмуляции. Он вмешался и заменил каждый именованный параметр на анонимный

Я не пойму — это аргумент за «режим эмуляции» или против? Судя по тону автора, складывается впечатление, что второе.
Однако по отзывам знакомых программистов — это чуть ли не лучшее, что есть в PDO.

Поэтому отключите этот уровень эмуляции как можно скорее

Куда полезнее будет включить режим критического отношения к голословным утверждениям (это же относится к заявлениям еще одного противника режима эмуляции — А.Феррары, если вам случалось читать их на Stackoverflow).
У меня после запуска скрипта с статьи:
2ой столбец результат функции ( memory_usage с этого скрипта), 3ий ф. memory_get_usage() / 1000000

libmysql

initial memory ->79144 kB — 0.237144
resultSet stored ->95688 kB — 0.237472
query result saved ->170812 kB — 75.687992
resultSet freed ->154364 kB — 75.687952
saved result freed ->79760 kB — 0.237408
Db closed ->79760 kB — 0.236944

И после установки mysqlnd:

initial memory ->5524 kB — 0.244352
resultSet stored ->27172 kB — 2.646576
query result saved ->84524 kB — 61.295688
resultSet freed ->82212 kB — 75.694144
saved result freed ->80928 kB — 0.244744
Db closed ->80928 kB — 0.236944

Ubuntu 14.4.1 / php 5.5.9
Sign up to leave a comment.