Главная > Работа с базами данных


Работа с базами данных

А какой же электронный магазин без базы данных? В принципе, можно и без нее, но насколько СУБД облегчает разработку подобных проектов. PHP поддерживает множество СУБД от xBase до дорогих коммерческих SQL-серверов. Особого внимания заслуживают такие базы, как MySQL и PostgreSQL - по причине их популярности, хороших характеристик и бесплатности. Легкодоступность СУБД и интерфейса к ней побуждает юные умы применять базу данных направо и налево, не особенно задумываясь о необходимости применения и об алгоритмах работы с базой.

Самая распространенная ошибка авторов скриптов - это отношение к СУБД как к чему-то сверхоперативному. А это вовсе не так. Вот пример, как не надо писать скрипты:

1 pg_pconnect("host=localhost dbname=test");
2 $s1=pg_exec("select a from b");
3 for ($i=0; $i
4 $a=pg_result($s1,$i,0);
5 $s2=pg_exec("select c,x,y,z from d where e=$a");
6 for ($j=0; $j
7 $c=pg_result($s2,$j,0);
8 $x=pg_result($s2,$j,1);
9 $y=pg_result($s2,$j,2);
10 $z=pg_result($s2,$j,3);
11 echo "$c $x $y $z
n";
} } ?>

1 - надо трижды подумать, прежде чем иcпользовать постоянное соединение с базой. Здесь выбран хост localhost, но работа с локальным сервером через unix socket может быть быстрее.

2 - надо проверить, выполнился ли запрос без ошибок.

3 - нехорошо вызывать функцию в цикле, лучше завести дополнительную переменную $num=pg_numrows($s1).

5 - самая грубая ошибка: запрос в цикле по другому запросу, от такого программирования не спасут ни множество процессоров, ни обилие памяти, ни быстрая дисковая система. Почему бы не решить проблему в один запрос? $s1=pg_exec("select a,c,x,y,z from b,d where e=a order by a");

В цикле можно запомнить предыдущее значение $a и прерывать цикл при смене этого значения. В любом случае, чем меньше запросов будет к базе, тем лучше - имейте это в виду.

7-10 - можно не вытаскивать поля по одному, а применить функцию pg_fetch_array() или pg_fetch_object(), которые возвращают хэш и объект соответственно с именами полей, соответствующими именам полей результата запроса.

PHP позволяет поддерживать постоянные соединения с СУБД. То есть при завершении скрипта соединение с сервером базы данных разорвано не будет, а будет возобновлено при повторном запросе. Такой метод работы очень экономит время соединения, но съедает системные ресурсы (память, дескрипторы и т. д.). Если у вас один пользователь базы, одна база и один сайт, который непрерывно обращается к базе, то вам стоит попробовать поэкспериментировать. В конфигурации PHP можно глобально отменить постоянные соединения, чем и пользуются провайдеры, чтобы защитить свои хосты от жадных пользователей.