Одной из распространенных задач при выборке из базы данных является определение числа записей, которые возвращает функция mysqi_query(). Для этого предназначена функция mysqi__num_rows (), которая имеет следующий синтаксис:
int mysql_num_rows(resource result)
В качестве единственного аргумента result функция принимает дескриптор запроса, возвращаемый функцией mysqi_query ().
Функция mysqi_query () в случае успеха всегда возвращает дескриптор соединения и flase только в случае ошибочного синтаксиса SQL-запроса, поэтому проверка соответствия пароля в листинге 8.46 ошибочна, т. к. такая проверка будет срабатывать в любом случае, даже если число возвращенных записей окажется равным нулю.
Транзакции позволяют объединять операторы в группу и гарантировать, что все операции внутри группы будут выполнены успешно. Если часть транзакции выполняется со сбоем, результаты работы всех операторов транзакции до места сбоя отменяются, приводя базу данных к виду, в котором она была до выполнения транзакции.
Для выяснения механизма транзакций рассмотрим ситуацию, которая возможна при работе интернет-магазина, торгующего книгами. Предположим, что на складе имеется 100 экземпляров книги. При этом в один момент времени оформление покупки книги начинают два покупателя.
Первый покупатель оформляет покупку книги, при этом происходят два события: регистрируется факт покупки и обновляется количество книг, существующих на складе. Регистрация покупки разрешена, если количество книг, возвращаемое оператором SELECT, больше нуля. Далее из этого значения вычитается количество заказываемых покупателем книг и происходит обновление базы данных склада. Первый раз программное обеспечение по запросу SELECT получает количество книг на складе, равное 100.
Одновременно второй покупатель начинает оформление покупки. Запрос на выборку количества книг для него так же возвращает значение 100.