Отправляет email-рассылки с помощью сервиса Sendsay

PHP Wars: против целого мира

  Все выпуски  

PHP Wars: против целого мира


Информационный Канал Subscribe.Ru

PHP Wars: против целого мира - выпуск 11

Iprit, глав(в)ред рассылки.

Автор: Gorinich
Источник: CN GROUP


Работаем с базой данных MySQL

И снова здравствуйте!!! В прошлый раз я писал, как написать собственный парсер страниц. Надеюсь вы со всем этим разобрались. Итак, если вы пишите собственный движок для построения сайтов, то парсер, это как раз то, с чего стоит начать, правильно продумать и предвидеть как можно больше в его разработке. Если вы просматривали код таких достаточно развитых форумов, как phpBB или InvisionPowerBoard, то могли обнаружить, что чисто парсера там нет. Хотя как на это посмотреть. Там, с одной стороны, поддерживаются некоторые соображения прошлой моей статьи, но, в то же время, трудно сказать, что дизайн полностью отделен от кода. В этих системах используется система шаблонов. Так что кардинально дизайн изменить очень проблематично, придется перелопачивать множество модулей.

Что-то я ушел от темы. Вернемся. Вторым важным компонентом движка сайта является поддержка работы с базой данных. Рассмотрим работу с базой данных MySQL, это, пожалуй, самый распространенный вариант. Я не буду писать сложного кода, все-таки статья рассчитана на начинающего пользователя. Если кто желает, то и сам сможет дописать все, что требуется, и как требуется, основываясь на примерах. Итак, приступим. Нам потребуется установленные Apache, PHP и MySQL. Также необходимо знать название базы, логин и пароль к ней. Если у вас все это есть, то продолжим.

Чуть не забыл. В документации PHP сказано, что PHP версии 5 MySQL по умолчанию не поддерживает, поэтому вам придется подключить нужный модуль самостоятельно. По этому вопросу обращайтесь к документации. Также я не буду описывать работу функций имена которых начинаются на mysql_. Они достаточно подробно описаны в документации. Поехали. Создайте файл db_funcs.php. В нем будут размещены функции по работе с базой данных. В этом файле в первую очередь объявите константы, в них мы будем хранить название базы, ее адрес, пользователя и пароль.
//------------------------
// Константы для работы с базой данных
//------------------------
// Имя базы данных

define("DBName", "temp");

/* Имя хоста. Если скрипт расположен на том же сервере, что и база, то указать localhost */
define("HostName", "localhost");

// Имя пользователя
define("UserName", "root");

// Пароль к базе данных
define("Password", "");

Еще нам понадобится несколько переменных
//------------------------
// Внутренние переменные
//------------------------

// результат запроса

$result = '';
// количество строк, возвращенных в результате запроса
$num_rows = 0;
// количество колонок в результате
$num_cols = 0;
// переменная указывает на текущую строку
$row = 0;
// массив имен полей
$fields_names = array();
// флаг ошибки
$QueryError = false;

Подключаемся к базе данных.
//Выполням подключение к базе данных
mysql_connect(HostName, UserName, Password) or die("Нельзя подключиться к базе данных " . DBName);

//Выбираем нашу базу данных на сервере
mysql_select_db(DBName) or die("Нельзя подключиться к базе данных " . DBName);

Теперь опишем нужные нам функции.
// Выполнение запроса к базе данных. Рекомендуется для неселективных запросов
function sql ( $sql )
{
    return mysql_query ( $sql ) or die ("Неверный запрос: $sql") ;
}

Эта функция выполняет запросы к базе, которые не возвращают ничего, это запросы типа SELECT, UPDATE, DELETE и др. Функция возвращает true или false в зависимости от успешности запроса, если запрос некорректен, то выдается соответствующее сообщение.

/* Выполнение селективного запроса. Возвращает первую строку результата в виде ассоциативного массива с именами полей в качестве индексов */
function sqlselect ( $sql )
{
    global $result, $num_rows, $row, $num_cols;
    $result = mysql_query ( $sql ) or die ("Неверный запрос $sql");
    $num_rows = mysql_num_rows( $result );
    $row = 0;
    $num_cols = mysql_num_fields ( $result );
    return mysql_fetch_array ( $result );
}

// Переходит к следующей cтроке результата последнего запроса
function sqlnext ()
{
    global $result, $row;
    $row++;
    return mysql_fetch_array ( $result );
}

// Указывает конец данных в последнем запросе
function sqleof ()
{
    global $num_rows, $row;
    return $row == $num_rows;
}

Эти три функции используются для селективных запросов, возвращающих несколько строк из таблицы. Запрос выполняется функцией sqlselect ( /* запрос */ ), далее перебор осуществляется спомощью второй и третьей функции.

$quer = sqlselect ( /* запрос */ );
while (!sqleof () )
{

    // некоторые действия...

    $quer = sqlnext ();
}

Функции sqlselect() и sqlnext() возвращают массив, в котором содержится текущая строка таблицы запроса. Данные содержатся в массиве в формате $quer[ имя_поля1 ], $quer[ имя_поля2 ] и т.д., т.е. в качестве индексов используются имена полей таблицы. Каждый элемент массива продублирован и имеет целочисленный индекс, нумерация с нуля. Этими функциями вы пользоваться скорее всего не будете, ниже мы рассмотрим более универсальную и удобную функцию sqlfields().

Количество строк и столбцов в результате последнего запроса можно узнать с помощью функций
function sqlrows ()
{
    global $result;
    return mysql_num_rows ( $result );
}

function sqlcols ()
{
    global $result;
    return mysql_num_fields ( $result );
}

Иногда необходимо выполнить запрос, в результате которого должна вернуться всего одна строка из таблицы.Чтобы сэкономить время и ресурсы я использую функцию

/* Выполнение селективного запроса. Возвращает первую строку результата в виде массива. Не трогает переменную $result. Иногда так надо. */ function sqlselectone ( $sql )
{
    $result = mysql_query ( $sql ) or die ( "Неверный запрос $sql ");
    if ( mysql_num_rows ( $result ) == 0 ) return false;
    else return mysql_fetch_array ( $result ) ;
}

Иногда, работая с автоинкрементным индексом в таблице, необходимо узнать значение индекса автоинкремента после выполнения последнего запроса типа INSERT. Это делает функция

/* Возвращает значение автоинкрементного первичного ключа, полученного после последней операции INSERT */
function sqlLastID ()
{
    return mysql_insert_id ();
}

Теперь рассмотрим обещанную функцию sqlfields(). Вот её код

// Возвращает результат запроса в виде двумерного массива
function sqlfields( $query , $type = MYSQL_ASSOC , $reverse_array = false)
{
    global $result, $fields_names;
    $result = mysql_query( $query ) or die("Неверный запрос $query");
    $num_rows = mysql_num_rows( $result );
    $num_cols = mysql_num_fields( $result );
    $fields_names = array();

    for ( $j =0; $j < $num_cols; $j++) $fields_names[$j] = mysql_field_name( $result , $j );

    $arr = array();

    for ($i = 0; $i < $num_rows; $i++)
    {
        $f = mysql_fetch_array ( $result , $type);
        foreach ( $f as $k => $v)
       {
            if ( $reverse_array ) $arr[$i][$k] = $v;
            else $arr[$k][$i] = $v;
        }
    }
    return $arr;
}

Рассмотрим подробнее работу этой функции. Сначала функция выполняет запрос, и получает количество строк и столбцов запроса. Затем функция строит массив имен полей таблицы

$fields_names = array();
for ( $j = 0; $j < $num_cols; $j++) $fields_names[$j] = mysql_field_name ( $result, $j );

это практически не нужно, но иногда может понадобиться, например, если мы захотим отобразить таблицу на экране.

Далее строится двумерный массив по результату запроса. Массив имеет формат $arr[ имя_поля ][ номер_строки ]. Нумерация строк ведется с нуля. Иногда необходимо получить массив типа $arr[ номер_строки ][ имя_поля ], для этого необходимо флаг $reverse_array установить в значение true. Строится такой массив достаточно просто
$arr = array();
for ( $i = 0; $i < $num_rows ; $i++ )
{
    $f = mysql_fetch_array( $result , $type );
    foreach ( $f as $k=>$v )
    {
        if ( $reverse_array ) $arr[$i][$k] = $v;
        else $arr[$k][$i] = $v;
    }
}

После завершения работы с базой от нее необходимо отключиться, делается это функцией

// Завершает связь с базой данных
function sqlclose()
{
    global $result, $num_rows, $row, $num_cols;
    if ( $result != null) mysql_free_result ( $result );
    mysql_close ();
}

Этого можно и не делать, PHP сам отключится от базы по завершению работы скрипта.

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


Нам очень важно Ваше мнение о нашей рассылке, если у вас есть какие-либо пожелания или предложения, Вы хотите высказать свое мнение по поводу опубликованного материала, то пишите нам.
На сегодня это все. Очередной выпуск нашей рассылки ждите как обычно в следующее воскресенье. Продолжение неизбежно…
PHP Wars 2005, Все права на материалы принадлежат их авторам. Перепечатка или любое другое использование материалов рассылки разрешается только с письменного разрешения.

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.phpwars
Архив рассылки
Отписаться
Вспомнить пароль

В избранное