Начинающему программисту часто сложно ориентироваться в запросах к базе.
Опытному - лень. Зачем писать типовые запросы каждый раз, когда их можно написать один раз, и забыть? Незачем!
Так я подумал три года назад, и написал себе библиотечку работы с мускулом.
Код не идеален, но лично мне в 90% случаев его хватает, поэтому я его не дорабатывал.
Описание модуля
==============
Модуль содержит весь типичный SQL код. В нем реализованы большинство
типичных запросов к базе в виде отдельных функций. В остальном коде
мы только вызываем эти функции. Можно больше не заморачиваться о написании
SQL запросов - модуль это сделает сам. При переезде с MySQL на другую СУБД
достаточно внести небольшие изменения в этот модуль. Если Вы не использовали
каких-то специфических функций, то скорее всего переезд на этом и закончится.
Для того чтобы функции модуля могли работать нужно вызвать функцию sql_start.
Обычно она вызывается в том месте проекта где объявляются настройки
используемой базы. Дальше выполняются нужные нам действия с базой при помощи
вызовов функции sql_do (см. ниже) которая вызывается или из других функций
модуля или непосредственно. Заканчиваем работу с базой вызовом функции sql_end.
Ниже функции модуля описанны более подробно.
function sql_start() - Создает соединение с базой, объявляет кодовые таблицы
и т.п. при этом используются уже объявленные в других модулях константы:
DB_HOST - имя хоста где лежит база(обычно равен localhost)
DB_NAME - имя базы данных в которой храним наши данные
DB_USER - имя пользователя базы данных от имени которого мы будем
работать с базой.
DB_PASS - пароль вышеуказанного пользователя.
function sql_end() - Функция закрытия базы... по хорошему ее стоит вызывать
когда с базой больше не работаете. Но если вы забудете ее выполнить
то ничего страшного не случится, php сам закроет соединение. Пользоваться
ли ей это дело стиля.
function sql_do($sql) - основная функция db модуля - на входе получает
SQL запрос т.е. текст инструкции на языке SQL.
на выходе возвращает результат работы SQL запроса:
таблица с возвращаемыми данными
или 1 (TRUE) если у запроса не положено данных (не путать с пустым
результатом имеется ввиду выполнение инструкций которые ничего не
могут возвратить) и при этом все было хорошо (в смысле без ошибок).
В случае ошибки функция "умирает". как правило ошибки базы фатальны
для скрипта, и поэтому нет смысла продолжать его выполнение.
Далее идут функции которые просто формируют SQL запрс по образцу и вызывают
sql_do - они описывают наиболее частые действия с базой. Это упрощает код,
не более... но и не менее. Нет надобности постоянно писать однотипные запросы
достаточно просто вызвать простую функцию. Можно даже и не знать SQL (хотя
это очень желательно.)
function sql_del($tab_name,$where) - (DELETE) - удаляет из таблицы $tab_name все
записи удовлетворяющие условию $where. Если нужно удалить все записи из
таблицы то нужно указать $where="1=1" или другое верное выражение. Я
специально не сделал проверку на пустой запрос (where ='') - пусть
при вызове будет писаться "1=1"вручную. Это предохранит от случайной
"очистки" таблицы. (при пустой строке WHERE () падает с ошибкой).
Пример вызова: sql_del('users','uid=12345').
function sql_ins($tab_name,$data) - (INSERT) - добавляет (вставляет) в таблицу
$tab_name запись с данными описанными в масиве $data. Индексы массива
описывают названия полей таблицы а значения - значения.
Пример вызова функции:
$sql_data = array('login' => 'Mendel', 'name' => 'Maxym', 'sex' => 'm');
sql_ins('users',$sql_data);
функция возвращает номер автоинкремента если таковой есть
в случае неудачиии возращает -1... иногда бывает удобно
не проверять наличие "дупа" а тупо добавлять в базу... ошибка и ладно..
немного кривовато, но зато эфективно.
function sql_up($tab_name,$data,$where) - (UPDATE) - обновляет (изменяет)
запись (или записи) таблицы $tab_name которые удовлетворяют условию
$where. Данные для изменения описаны в массиве $data. Индексы массива
описывают названия полей а значения - новые значения.
Пример вызова функции:
$sql_data = array('login' => 'Mendel', 'name' => 'Maxym', 'sex' => 'm');
sql_up('users',$sql_data,'uid=1');
function sql_sel($tab_name,$where[,$limit[,$offset]]) - (SELECT) - считывает из таблицы $tab_name
данные удовлетворяющие условию $where. На выходе выдает массив записей
где каждая запись это массив, индексом которого являются названия полей
а значения - это их значения.
опциональные параметры - limit это максимальное колво записей
offset - начиная с указанной записи....
Пример вызова функции:
$users=sql_sel('users','id>=10');
function sql_sel1($tab_name,$where) - тоже что и sql_sel но на выходе только
одна запись поэтому возвращает не массив из одного масисива
а просто запись. Это удобно когда нужно считать одну запись.
Пример вызова функции:
$user=sql_sel('users','id=1');
PHP код:
<?php
// ***********************************************************************
// Модуль базы данных. Почти весь SQL код здесь.
// (c) Maxym Dyachenko.
// ***********************************************************************
// *************************************************************
// Объявим все нужные функции. Описание см. в документации.
// *************************************************************
function sql_start()
{
GLOBAL $db_connect_id;
// Создадим соединение с сервером Мускула
$db_connect_id = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("Could not connect");
// Выберем активной нашу базу
mysql_select_db(DB_NAME) or die("Could not select database");
// разберемся с глюком кодировки
sql_do ("set character_set_client='cp1251'");
sql_do ("set character_set_results='cp1251'");
sql_do ("set collation_connection='cp1251_general_ci'");
}
function sql_end()
{
GLOBAL $db_connect_id;
// Закрываем соединение
mysql_close($db_connect_id);
}
function sql_do($sql)
{
GLOBAL $db_connect_id;
// Выполним SQL запрос или "умрем" с ошибкой
$res = mysql_query($sql) or die("Query failed... <br><b>err_msg=</b>".mysql_error($db_connect_id).'<br><b>$sql=</b>'.$sql);
// если вернула 1 т.е. TRUE значит запрос данных не возвращает
// ну мы и вернем эту же единицу.
if ($res == 1)
{
$data = 1;
}
// в противном случае положенно данные вернуть в виде массива
else
{
// сделаем data пустым массивом на случай если нужно
// вернуть пустой результат.
$data = array();
// в цикле вынимаем все записи и пихаем их в наш массив
while($row = mysql_fetch_array($res, MYSQL_ASSOC))
{
$data[] = $row;
}
// "освобождаем" память от результатов последнего запроса.
mysql_free_result($res);
}
// и возвращаем подготовленный результат.
return $data;
}
function sql_del($tab_name,$where)
{
// формируем SQL запрос на удаление и передаем его sql_do
$sql = 'DELETE FROM ';
$sql .= $tab_name;
$sql .= ' WHERE (';
$sql .= $where;
$sql .= ');';
sql_do($sql);
}
function sql_ins($tab_name,$data)
{
// TODO: переписать покрасивее и описать
$qqq = '';
$qww = '';
// в цикле разберем масив и сделаем из него две переменные с списками
// значений и названий полей
while (list($var, $param) = each($data))
{
$param = mysql_escape_string($param); // исправим строчку чтобы не вываливалась с ошибкой
// если это не первое поле то добавим перед ним запятую
if ($qqq != '')
{
$qqq .= ', ';
}
// если это не первое поле то добавим перед ним запятую
if ($qww != '')
{
$qww .= ', ';
}
$qqq .= "`";
$qqq .= $var;
$qqq .= "`";
$qww .= "'";
$qww .= $param;
$qww .= "'";
}
$sql = 'INSERT INTO ';
$sql .= $tab_name;
$sql .= ' (';
// здесь пошли через запятую в кавычках имена всех выводимых полей
$sql .= $qqq;
$sql .= ') VALUES (';
// здесь пошли в кавычках, через запятую значения тех самых полей
$sql .= $qww;
$sql .= ');';
// sql_do($sql);
// ************************************************************
// выполним запрос. не sql_do чтобы вернуть AUTO_INC если есть
// ************************************************************
GLOBAL $db_connect_id;
// Выполним SQL запрос... не умираем в случае неудачи. ибо возможно это изза дупов, а дупы не повод для смерти.
$res = mysql_query($sql);
if (!$res) return -1;
// Криво но мы узнаем последний ид здесь...
$sql="select LAST_INSERT_ID();";
$res = mysql_query($sql);
$row = mysql_fetch_array($res, MYSQL_ASSOC);
$autoid=$row['LAST_INSERT_ID()'];
// узнаем значение автоинкремента, или ноль если такого нет.
// // "освобождаем" память от результатов последнего запроса.
mysql_free_result($res);
// и возвращаем подготовленный результат.
return $autoid; // Возращает 0 если нет инкремента... это не ошибка!!!
}
function sql_up($tab_name,$data,$where)
{
// TODO: переписать покрасивее и описать
$sql = 'UPDATE ';
$sql .= $tab_name;
$sql .= ' SET ';
// Здесь идет список изменяемых полей с их значениями
$qqq = '';
// в цикле разберем масив и сделаем из него строку из
// значений и названий полей
while (list($var, $param) = each($data))
{
$param = mysql_escape_string($param); // исправим строчку чтобы не вываливалась с ошибкой
// если это не первое поле то добавим перед ним запятую
if ($qqq != '')
{
$qqq .= ', ';
}
$qqq .= "`";
$qqq .= $var;
$qqq .= "`";
$qqq .= " = ";
$qqq .= "'";
$qqq .= $param;
$qqq .= "'";
}
$sql .= $qqq;
$sql .= ' WHERE (';
$sql .= $where;
$sql .= ');';
sql_do($sql);
}
function sql_sel($tab_name,$where,$limit=FALSE,$offset=FALSE)
{
// формируем запрос и передаем sql_do его результат возвращаем.
// все довольно прозрачно.
$data=array();
// если where пустой - заменим его, чтоб не падал с ошибкой
if($where=='')
{
$where = '1=1';
}
$sql = 'SELECT * FROM ';
$sql .= $tab_name;
$sql .= ' WHERE (';
$sql .= $where;
$sql .= ')';
if ($limit)
{
$sql .= ' LIMIT ';
if ($offset) $sql .= $offset.','.$limit;
else $sql .= $limit;
}
$sql .= ';';
return sql_do($sql);
}
function sql_sel1($tab_name,$where)
{
$tab=sql_sel($tab_name,$where,1);
// если нифига не получено - выдадим пустой массив, чтоб не падать с ошибкой
if (count($tab)==0)
{
return array();
}
else
{
return $tab[0];
}
}
?>