В Joomla 1.0 для работы с базой данных используется переменная $database. Исходники класса database лежат в /includes/database.php.
Обычно работа с Базой Данной состоит из двух этапов.
- Использование метода SetQuery, который берёт строку SQL запроса для дальнейшего её вычисления.
- Использование другого метода (например, loadResult) для выполнения запроса и возвращения его результа.
Небольшой пример из /includes/content.php (Получаем имя пользователя по его id)
1 2 3 4 5 6 |
$query = "SELECT name" . "\n FROM #__users" . "\n WHERE id = " . (int) $user_id ; $database->setQuery( $query); $creator = $database->loadResult(); |
Перейдём к описанию некоторых методов с примерами.
SetQuery - самый первый вызываемый метод. берёт строку SQL запроса для дальнейшего её вычисления.
Синтаксис:
void setQuery ( sting $query [, integer $offset=0 [, integer $limit=0 [, string $prefix='#__' ]]] )
Например, setQuery("SELECT name FROM $__users",5,10) вернёт 10 имён пользователей начиная с 5-го.
mixed loadResult ( )
Пример приведён выше.
loadRow - возвращает первую строку запроса в виде массива или false, если запрос неудачен.
Синтаксис:
array loadRow ( )
1 2 3 4 5 6 7 8 9 10 |
$query = "SELECT *" . "\n FROM #__users" . "\n WHERE id = " . (int) $user_id ; $database->setQuery( $query); $row = $database->loadRow(); //В $row теперь массив Можно получить, например, email следующим образом echo $row['3']; |
loadObjectList - возвращает массив, состоящий из строк таблицы (точнее - каждый элемент массива - экземпляр stdClass, поля которого совпадают с названиями полей в таблице)
Синтаксис:
1 |
array loadObjectList ( [ string $key ] )
|
Пример:
1 2 3 4 5 6 7 |
$query = "SELECT * FROM #__users"; $database->setQuery( $query ); $rows = $database->loadObjectList(); //далее можно, например, пройтись и напечатать все имена foreach ($rows as $row){ echo $row->name; } |
loadResultArray - Возвращает массив, каждый элемент которого - одно поле. Используется при выборе одной колонки.
Синтаксис:
array loadResultArray ( [ integer $num_in_array=0 ] )
Пример:
1 2 3 4 |
$query = "SELECT email FROM #__users"; $database->setQuery( $query ); $rows = $database->loadResultArray(); |
Пример с использованием $num_in_array (выдаст массив имён пользователей)
1 2 3 |
$query = "SELECT id, name, email FROM #__users"; $database->setQuery( $query ); $rows = $database->loadResultArray(1); |
query - выполняет запрос. Используется, например, для запросов DELETE или UPDATE, где не надо выдавать результат. Возвращает database resource object если успешно, null - если нет.
Синтаксис:
object query ()
Пример (удаляем пользователя с id=5)
1 2 3 4 5 6 |
$query = "DELETE FROM #__users WHERE id=5"; $database->setQuery( $query ); if (!$database->query()) { //выдаём сообщение об ошибке если не удачный запрос echo "\n"; } |
После выполнения запроса можно получить информацию о том, как он был выполнен - успешно ли, сколько строк затронул. Если не успешно - можно получить сообщение об ошибке. Для этого используются следующие методы
getErrorNum - возвращает номер ошибки при последнем запросе к базе данных
getErrorMsg - возвращает описание ошибки
stderr - выдаёт сообщение о ошибке в стандартном формате. Оно включает в себя и номер ошибки, и её описание
Синтаксис:
string stderr ( [ boolean $showSQL=false ] )
$showSQL - показывать ли SQL.
getNumRows - возвращает число строк, возвращённое предыдущим запросом к базе данных. Или, если указан $resource - запросом, с указанным ресурсом
Синтаксис:
int getNumRows ( [ object $resource=null] )
Пример (число пользователей зарегестрированных на сайте - конечно, лучше использовать запрос SELECT count(*) FROM #__users):
1 2 3 4 5 6 |
$database->setQuery( "SELECT id FROM #__users" ); if (!$database->query()) { echo $database->stderr(); return false; } return $database->getNumRows(); |
getAffectedRows - возвращает число строк, которые были затронуты последним запросом. Например, SELECT, INSERT, UPDATE или DELETE.
insertid - возвращает ID значение сгенерированное полем c AUTO_INCREMENT . Метод возвращает 0 если предыдущий запрос не сгенерировал AUTO_INCREMENT значение.
Безопасность при работе с базой данных.
Более подробно тут. Если кратко, то нужно обязательно следовать двум правилам:
1) все подставляемые в SQL-запрос выражения должны быть в кавычках, например в одинарных
$query = "INSERT INTO table (name) VALUES ('$name')";
2) использовать mosGetParam() для получения переменных, используемых в запросе. (mosGetParam автоматически применяет функцию addslashes, если это нужно)