Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом Телицкий.doc
Скачиваний:
206
Добавлен:
09.02.2016
Размер:
4.72 Mб
Скачать

Поля даты

Очень часто используется поле типа datetime, хранящее дату и время некоторого события. Когда мы используем это поле, очень важно знать про эффект временных зон. Все даты и время должны быть сохранены в нулевом поясе UTC+0 (GMT / Z). А уже при выводе на экран используем класс JDate.

Многоязычные требования

В кодировке UTF-8 колличество бит на символ от 8 и более. К сожалению в MySql версиях до 4.1.2, один символ всегда занимает один байт, что вызывает некоторые проблемы. Единственное решение - это создать различные файлы sql запросов для различных версий MySql-серверов, поддерживающих и не поддерживающих кодировку UTF-8. Для MySql не поддерживающих данную кодировку мы должны задать увеличенный размер полей. Например для поля varchar(20) лучше задать размер varchar(60). Размер поля увеличен в три раза, потому что большинство символов в кодировке UTF-8 занимают максимум 3 байта. Но например поле varchar(100) мы должны были бы увеличить в три раза и получить varchar(300). Но это невозможно, так как максимальный размер - varchar(255). Единственный выход - это задать тип TEXT. Для примера, ядро Joomla содержит таблицу #__content, хранящее поле title. Для MySql поддерживающих UTF-8 поле определяется как

'title' varchar(255) NOT NULL default ''

а для неподдерживающих

'title' text NOT NULL default ''

Запрос в базу данных

Когда мы выполняем запрос, мы передаем сам запрос в глобальный объект JDatabase. Мы должны использовать метод setQuery() для установки запроса, но запомните - он не выполняет сам запрос.

$db =& JFactory::getDBO();

$result = $db->setQuery($query);

Когда запрос установлен, нужно использовать метод query(), чтобы выполнить его. Этот метод аналогичен PHP функции mysql_query(). Если запрос правильный и содержит команды SELECT, SHOW, DESCRIBE, или EXPLAIN, то он вернет результат.

if (!$result = $db->query($query))

{

// отлавливаем ошибки

// используйте $db->getError() для большей информации

}

Написание запросов

Вот несколько правил при написании запросов к базе данных.

  • Используйте префикс #__ вначале всех имен таблиц.

  • Используйте метод nameQuote() для формирования названных элементов в запросе.

  • Используйте метод Quote() для формирования значений.

nameQuote() - устанавливает правильность разделителей в имени поля, а Quote() - устанавливает правильность разделителей в передаваемом значении. Например:

$db = JFactory::getDBO();

$query = 'SELECT * FROM '

.$db->nameQuote('#__test')

.' WHERE '

.$db->nameQuote('name')

.' = '

.$db->Quote('Some Name');

Если мы использовали MySQL или MySQLi драйвер, то запрос в итоге будет выглядеть следующим образом:

SELECT * FROM 'jos_test' WHERE 'name' = "Some Name";

Получение результата

Мы можем использовать метод query() для получения результата. Но чаще нам приходится пользоваться другими методами класса JDatabase, для получения результата в различных форматах. Для показа работы методов мы будем использовать таблицу #__test. Эта таблица содержит два поля: id и name. В таблице имеются две записи:

id

name

1

Foo

2

Bar

Далее в примерах мы не будем применять методы nameQuote() и Quote(). loadResult( ) : string Метод загружает значение первой ячейки результата.

$query = 'SELECT 'name' FROM '#__test' WHERE 'id'=2';

$db =& JFactory::getDBO();

$db->setQuery($query);

echo $db->loadResult();

Результат: Bar loadResultArray( numinarray : int=0 ) : array Метод загружает столбец с номером numarray, обозначающим его логическую позицию, в виде массива.

$query = 'SELECT 'name' FROM '#__test'';

$db =& JFactory::getDBO();

$db->setQuery($query);

print_r($db->loadResultArray());

Результат: Array ( [0] => Foo [1] => Bar ) loadAssoc( ) : array Метод загружает первую запись результата в виде ассоциативного массива.

$query = 'SELECT * FROM '#__test'';

$db =& JFactory::getDBO();

$db->setQuery($query);

print_r($db->loadAssoc());

Результат: Array ( [id] => 1 [name] => Foo ) loadAssocList( key : string='' ) : array Метод загружает результат в виде массива ассоциативных массивов. Если мы укажем необязательный параметр key, то будет получен массив ассоциативных массивов с единственным полем key.

$query = 'SELECT * FROM '#__test'';

$db =& JFactory::getDBO();

$db->setQuery($query);

print_r($db->loadAssocList());

Результат:

Array

(

[0] => Array

(

[id] => 1

[name] => Foo

)

[1] => Array

(

[id] => 2

[name] => Bar

)

)

loadObject( ) : stdClass Этот метод загружает первую запись в виде объекта.

$query = 'SELECT * FROM '#__test'';

$db =& JFactory::getDBO();

$db->setQuery($query);

print_r($db->loadObject());

 

stdClass Object

(

[id] => 1

[name] => Foo

)

loadObjectList( key : string='' ) : array Этот метод загружает результат в виде массива обьектов класса stdClass. Если есть параметр key, то будет загружен массив объектов с единственным свойством key.

$query = 'SELECT * FROM '#__test'';

$db =& JFactory::getDBO();

$db->setQuery($query);

print_r($db->loadObjectList());

 

Array

(

[0] => stdClass Object

(

[id] => 1

[name] => Foo

)

[1] => stdClass Object

(

[id] => 2

[name] => Bar

)

)

loadRow( ) : array Метод загружает первую запись результата в виде массива.

$query = 'SELECT * FROM '#__test'';

$db =& JFactory::getDBO();

$db->setQuery($query);

 

print_r($db->loadRow());

Array

(

[0] => 1

[1] => Foo

)

loadRowList( key : int ) : array Метод загружает массив массивов.

 

$query = 'SELECT * FROM '#__test';

$db =& JFactory::getDBO();

$db->setQuery($query);

print_r($db->loadRowList(0));

 

Array

(

[0] => Array

(

[0] => 1

[1] => Foo

)

[1] => Array

(

[0] => 2

[1] => Bar

)

)