Правильно работаем с MySQL в PHP
В данной статье я попробую рассказать вам не только о принципах организация доступа к базам данных MySQL в PHP, но и постараюсь объяснить основные особенности разработки программ с использование базы данных.
1. База данных должна открыватся в самом начале документа и закрыватся в самом конце.
Для того, чтобы открыть соединение с хостом базы данных и выбрать необходиму базу для работы в PHP используются следующий функции:
@mysql_connect( dbhost, dblogin, dbpass ) or die()
@mysql_select_db( dbname ) or die()
Функция @mysql_connect открывает соединение с хостом базы данных (dbhost), использую при этом логин и пароль доступа к серверу базы данных (dblogin, dbpass).
Функция @mysql_select_db выбирает необходимую базу данных для работы.
Для закрытия базы данных используется функция mysql_close(). На самом деле, использование данной функции не обязательно, так как обычно база данных сама закрывается после генерации скрипта.
Необходимо заметить, что некоторые неопытные программисты очень часто открывают и закрывают базу данных по несколько раз на одной странице.
Некорректное (хотя и возможное) обращение к базе данных:
<?php
@mysql_connect ( dbhost, dblogin, dbpass ) or die();
@mysql_select_db ( dbname ) or die();
....
@mysql_close();
....
@mysql_connect ( dbhost, dblogin, dbpass ) or die();
@mysql_select_db ( dbname ) or die();
....
@mysql_close();
?>
Считается, что после обработки данных из базы данных соединения сразу же необходимо закрыть. Необязательно. Вполне разумнее и экономнее использовать следующую конструкцию:
<?php
@mysql_connect ( dbhost, dblogin, dbpass ) or die();
@mysql_select_db ( dbname ) or die();
....
@mysql_close()
?>
2. После выполнения запроса, необходимо убедится, что функция вернула хоть какой-нибудь результат. Для выполнения запроса используется функция mysql_query.
Пример:
<?php
@mysql_connect ( dbhost, dblogin, dbpass ) or die();
@mysql_select_db ( dbname ) or die();
$query = mysql_query ( "SELECT * FROM catalog" );
...
@mysql_close()
?>
В качестве параметра функции mysql_query использутеся SQL запрос к базе данных. Для получения данных, сформированных в результате выполнения запроса используется функция mysql_result в таком виде:
mysql_result ( query, numRecord, Column )
Переменная query - это выполненный запрос (в нашем случае это переменная $query), numRecord - порядковый номер строки выполненного запроса, Column - номер поля таблицы или ее название.
Пример:
<?php
@mysql_connect ( dbhost, dblogin, dbpass ) or die();
@mysql_select_db ( dbname ) or die();
$query = mysql_query ( "SELECT Num, Site FROM catalog" );
$num = mysql_result ( $query, 0, 'Num' );
$site = mysql_result ( $query, 0, 'Site' );
@mysql_close()
?>
В данном случае мы получили значения полей Num и Site первой строки запроса.
3. Если вы используете подобный алгоритм, то неоднократно встречались с такой ошибкой как
Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result
Переводится это все как "попытка выбрать данные из несуществующей строки". Другими словами, вы попытались выбрать данные из строки выполненного запроса, которого не существует. Очень часто данная ошибка возникает, когда $query возвратил пустой результат и ничего не выбрал по заданному запросу. В этом случае обязательно проверяйте, возвратил ли запрос какие-то данные или нет:
<?php
@mysql_connect ( dbhost, dblogin, dbpass ) or die();
@mysql_select_db ( dbname ) or die();
$query = mysql_query ( "SELECT Num, Site FROM catalog" );
if ( mysql_num_rows ( $query ) > 0 ) {
$num = mysql_result ( $query, 0, 'Num' );
$site = mysql_result ( $query, 0, 'Site' );
}
@mysql_close()
?>
Функция mysql_num_rows считает количество записей (строк), которые вернула переменная $query при выполнении запроса. Если количество строк больше нуля, результаты стоит обрабатывать. Если строк больше одной, необходимо обрабатывать результаты выполнения запросов в цикле:
<?php
@mysql_connect ( dbhost, dblogin, dbpass ) or die();
@mysql_select_db ( dbname ) or die();
$query = mysql_query ( "SELECT Num, Site FROM catalog" );
if ( mysql_num_rows ( $query ) > 0 )
for ( $i = 0; $i < mysql_num_rows ( $query ); $i++ ) {
$num = mysql_result ( $query, 0, 'Num' );
$site = mysql_result ( $query, 0, 'Site' );
}
@mysql_close()
?>
5. Обязательно выносите переменные, используемые в запросе, за скобки. Например функция
$query = mysql_query ( "SELECT $field FROM photo" )
будет работать медленнее, чем
$query = mysql_query ( "SELECT ".$field." FROM photo" )