HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Как правило, запросы в базу формируются динамически на основе данных, которые поступают извне. Например, создание пользователя чаще всего происходит во время регистрации. В таком случае код вставки выглядит так:</p>
1 <p>Как правило, запросы в базу формируются динамически на основе данных, которые поступают извне. Например, создание пользователя чаще всего происходит во время регистрации. В таком случае код вставки выглядит так:</p>
2 <p>Составленные таким образом запросы несут в себе серьезную опасность -<strong>SQL-инъекции</strong>. Вместо обычных данных злоумышленник может отправить текст, который изменит SQL-запрос. Представьте, что внутри переменной $phone хранилась бы такая строка:</p>
2 <p>Составленные таким образом запросы несут в себе серьезную опасность -<strong>SQL-инъекции</strong>. Вместо обычных данных злоумышленник может отправить текст, который изменит SQL-запрос. Представьте, что внутри переменной $phone хранилась бы такая строка:</p>
3 <p>В таком случае после подстановки мы бы получили следующий запрос:</p>
3 <p>В таком случае после подстановки мы бы получили следующий запрос:</p>
4 <p>Фактически, вместо одного запроса получилось два. Таким образом, злоумышленник может выполнить произвольный запрос в базу данных - то есть удалить, добавить или изменить все, что ему хочется.</p>
4 <p>Фактически, вместо одного запроса получилось два. Таким образом, злоумышленник может выполнить произвольный запрос в базу данных - то есть удалить, добавить или изменить все, что ему хочется.</p>
5 <p>В разработке существует правило "Никогда не доверяй пользовательским данным" - оно особенно важно в работе с базами данных. Любые данные перед вставкой нужно экранировать с помощью подготовленных запросов:</p>
5 <p>В разработке существует правило "Никогда не доверяй пользовательским данным" - оно особенно важно в работе с базами данных. Любые данные перед вставкой нужно экранировать с помощью подготовленных запросов:</p>
6 <p>Подготовленные запросы создаются с помощью<strong>плейсхолдеров</strong>. Это заполнители, которые расставляются в местах, где ожидается подстановка данных. При этом плейсхолдеры не нужно оборачивать в кавычки, если это строки, драйвер сделает это автоматически.</p>
6 <p>Подготовленные запросы создаются с помощью<strong>плейсхолдеров</strong>. Это заполнители, которые расставляются в местах, где ожидается подстановка данных. При этом плейсхолдеры не нужно оборачивать в кавычки, если это строки, драйвер сделает это автоматически.</p>
7 <p>Плейсхолдеры могут быть не только именованные, но и позиционные, в виде знака вопроса ?</p>
7 <p>Плейсхолдеры могут быть не только именованные, но и позиционные, в виде знака вопроса ?</p>
8 <p>Заполнение данными выполняется с помощью метода bindParam(). Метод принимает на вход два обязательных параметра:</p>
8 <p>Заполнение данными выполняется с помощью метода bindParam(). Метод принимает на вход два обязательных параметра:</p>
9 <ul><li>Идентификатор параметра. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name. Если используются позиционные параметры, то это будет позиция плейсхолдера в запросе, начиная с 1</li>
9 <ul><li>Идентификатор параметра. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name. Если используются позиционные параметры, то это будет позиция плейсхолдера в запросе, начиная с 1</li>
10 <li>Данные, которые нужно подставить</li>
10 <li>Данные, которые нужно подставить</li>
11 </ul><h2>Ускорение запросов</h2>
11 </ul><h2>Ускорение запросов</h2>
12 <p>Кроме того, подготовленные запросы могут работать быстрее обычных. Дело в том, что мы можем выполнять множество запросов подряд в рамках одного подготовленного запроса. При использовании подготовленного запроса СУБД анализирует и оптимизирует запрос только один раз, а приложение запускает на выполнение уже подготовленный шаблон. За счет этого ускоряется работа</p>
12 <p>Кроме того, подготовленные запросы могут работать быстрее обычных. Дело в том, что мы можем выполнять множество запросов подряд в рамках одного подготовленного запроса. При использовании подготовленного запроса СУБД анализирует и оптимизирует запрос только один раз, а приложение запускает на выполнение уже подготовленный шаблон. За счет этого ускоряется работа</p>
13 <h2>Возврат идентификатора</h2>
13 <h2>Возврат идентификатора</h2>
14 <p>Когда мы вставляем данные в базу, иногда нам нужно получить идентификатор вставленной записи и потом использовать его в коде. Например, когда мы создаем какую-то сущность и хотим потом ее использовать:</p>
14 <p>Когда мы вставляем данные в базу, иногда нам нужно получить идентификатор вставленной записи и потом использовать его в коде. Например, когда мы создаем какую-то сущность и хотим потом ее использовать:</p>
15 <p>Чтобы выполнить эту задачу, используем метод lastInsertId(), который возвращает идентификатор последней вставленной записи в виде строки</p>
15 <p>Чтобы выполнить эту задачу, используем метод lastInsertId(), который возвращает идентификатор последней вставленной записи в виде строки</p>
16  
16