---
title: Mysql prepared statements
date: 2007-04-22T10:00
tags: [backend, mysql, php, tech]
---

воскресенье, 22 апреля 2007 г. в 14:10:12

Подготовленные запросы имеются в MySQL начиная с 4.1 и нужны по трём причинам.

1. Скорость. Если вы выполняете однообразные запросы, то mysql парсеру каждый раз приходится выполнять распознавание - какой тип запроса, какие данные передаются и тому подобное. Если сделать прототип запроса, а в последствии передавать только данные, то ясное дело что это скажется на скорости.
2. Передача данных. Мало того что для подобных запросов передача бинарных данных не нуждается в конвертировании в строку, так и то что стандартное ограничение на один запрос имеет около 1 мб можно подвинуть благодаря тому что каждый кусок данных передаётся отдельным запросом, а не одним общим (INSERT скажем).
3. Безопасность. Благодаря отделению данных от запроса вы можете обезопасить себя от [SQL injection](http://en.wikipedia.org/wiki/SQL_injection) .

```sql
PREPARE some_statement_1 FROM "INSERT INTO my_table (`some_HTML`, `some_title`) VALUES ('?','?')";  
SET @someparam_1 = "HTML SOURCE";  
SET @someparam_2 = "TITLE HERE";  
EXECUTE some_stament_1 USING @someparam_1,@someparam_2;  
DEALLOCATE PREPARE some_statement_1;
```

Всё достаточно просто - объявил запрос, вместо переменных поставил символы вопросов, потом по порядку этих символов [объявил переменные](http://dev.mysql.com/doc/refman/5.0/en/user-variables.html) , выполнил запрос и удалил кэширование (которое только планируется сделать).

Использование подобной техники через PHP на низком уровне занимается [PDO extension](http://ee.php.net/pdo) и [mysqli](http://ru.php.net/manual/en/function.mysqli-stmt-bind-param.php) правда порой не совсем удобным способом, ну а если хочется по-старинке эти запросы генерировать самому, то можно попробовать огромную [PEAR:DB](http://pear.php.net/package/DB) или [DbSimple](http://dklab.ru/lib/DbSimple/)

## Related

- [Mysql import - export](/ru/blog/tech/backend/DB/mysql/mysql-import-export/)
- [Mysql rownum](/ru/blog/tech/backend/DB/mysql/mysql-rownum/)
- [Random order в Postgres](/ru/blog/tech/backend/DB/postgres/random-order-v-postgre/)
