RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

JDatabase – прямые запросы в базу данных Joomla

с примерами запросов

Безопасная вставка данных

Главное при работе с базой данных — это безопасность, поэтому предохраняйтесь от случайных данных. Таким средством является метод getEscaped();

$_REQUEST["sometext"] = "Безопасность превыше всего, всевозоможные апострофы - (') нужно экранировать   ";
$mytext = JRequest::getVar('sometext','');
$db =& JFactory::getDBO();
$mytext = $db->getEscaped($mytext);
echo $mytext;

Установка используемой базы данных

Эта возможность полезна, когда нужно получить данные из базы данных, отличной от текущей. Однако нужно заметить, чтобы этот метод был выполнен успешно, нужно, чтобы пользователь mysql установленный в настройках Джумла имел право работать с обеими базами данных.

$db =& JFactory::getDBO();
$database_name = "db2";
if ($db->select($database_name)) {
    //запросы к другой базе данных

}

Отладка текущего запроса

От ошибок не застрахован никто, поэтому полезно иногда посмотреть что возвращает ваш запрос. И для этого не обязательно копировать его и вставлять в phpmyadmin.

$db = JFactory::getDBO();
$q = "SELECT * FROM #__content LIMIT 5";

$db->setQuery($q);
$db->explain();


Проверка соединения с базой данных

Иногда полезно знать, что сервер mysql не «упал» и соединение с ним работает. Например перед тем как обновить данные в базе об оплате счета и т. п.

$db =& JFactory::getDBO();
if (!$db->connected()) {
    echo "Нет соединения с сервером баз данных";    
    jexit();
} else {

    echo "Все отлично, мы можем выполнять важные действия с базой данных";
}

Получение данных о пользователе

Работа с записью пользователя Joomla 1.5.x получение данных о пользователе

Частенько приходится отделять зерна от плевел. Как это сделать в Джумла? — Очень просто — назначить группы. А как же узнать к какой группе принадлежит пользователь, конечно же по идентификатору группы.

Вот табличка соответствия стандартных групп Джумла.

Идентификатор Название Группы
18 Зарегистрированные пользователи
19 Автор
20 Редактор
21 Публикатор
23 Менеджер
24 Администратор
25 Супер администратор

//для текущего пользвоателя
$user =& JFactory::getUser();
$user62 =& JFactory::getUser(62);
echo "ИД группы текущего пользователя:".$user->get( 'gid' );
echo "ИД группы пользователя с ИД=62:".$user62->get('gid' );



if ($user->get( 'guest' )) {
    echo "Пользователь проходимец или просто гость"; 

} else {
    echo "Пользователь зарегистрирован"; 
    echo "Дата последнего визита:".$user->get('lastvisitDate');
    echo "Дата регистрации:".$user->get('registerDate');
    echo "Имя пользователя/никнейм:".$user->get('name'). "/".$user->get('username');
    echo "ID пользователя:".$user->get('id');
    echo "Тип пользователя:".$user->get('usertype');

    echo "email пользователя:".$user->get('email');
    echo "MD5 хеш от пароля:".$user->get('password');
}

Получить количество обработанных строк в последнем запросе

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

//1. Создадим экземпляр класса
$db=&JFactory::getDBO();

//2. Создадим запрос к базе данных, в данном случае мы выбираем статьи
$sql = 'SELECT id,title FROM jos_content ORDER BY id ASC  ';

//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($sql);

//4.  Выполним запрос 
$db->query(); 

//5. Посмотрим  сколько было задействовано строк
echo $db->getAffectedRows ();

Исполнение нескольких запросов

В основном следующая конструкция используется при установке или удалении данных о компоненте в базе данных

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();

$sql = "";

//2. Создадим запросы к базе данных, в данном случае мы статью вне категорий 
for ($i=0;$i<10;$i++) {
    $sql .=" INSERT INTO `jos_content` (`title`, `introtext`) VALUES  ('Тест$i', 'test$i') ; ";
}

//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($sql);

//4.  Для того чтобы выполнить эти запросы будем использовать следующую конструкцию
$db->queryBatch();

Выполнение запросов

В основном следующая конструкция используется для выполнения запроса INSERT,UPDATE,DELETE.

//1. Создадим экземпляр класса

$db =& JFactory::getDBO();

//2. Создадим запрос к базе данных, в данном случае мы статью вне категорий
$sql = " INSERT INTO `jos_content` (`title`, `introtext`) VALUES  ('Тест', 'test') ";

//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($sql);

//4.  Для того чтобы выполнить этот запрос будем использовать следующую конструкцию
if(!$db->query()) {
    // 5. Выводим ошибку, в случае если запрос не выполнился
    echo __LINE__.$db->stderr();
} 

После этого в менеджере статей вы можете увидеть эту статью.

Получаем результат запроса из базы в виде неассоциативного массива

Фактически результат функции php — mysql_fetch_row.

//1. Создадим экземпляр класса
$db=& JFactory::getDBO();

//2. Создадим запрос к базе данных, в данном случае мы выбираем первую статью
$q='SELECT id,title FROM jos_content ORDER BY id ASC LIMIT 1 ';

//3. Установим этот запрос в экземпляр класса  работы с базами данных
$db->setQuery($q);

//4.  Выполним запрос и получим данные 
$data_row = $db->loadRow(); 

//5. Посмотрим  что нам вернул этот метод, должен быть массив из 2-х элементов id и  title 
print_r($data_row);

Результат:

Array
(
    [0] => 1
    [1] => Welcome to Joomla!
)

Получаем единичное значение из базы

Иногда нужно просто получить одно значение из базы.

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();

//2. Создадим запрос к базе данных, в данном  случае мы выбираем первую статью
$query='SELECT title FROM jos_content ORDER BY id ASC LIMIT 1 ';

//3. Установим этот запрос в экземпляр класса  работы с базами данных
$db->setQuery($query);

//4.  Выполним запрос и получим данные 
$datavalue = $db->loadResult(); 

//5. Посмотрим  что нам вернул этот метод,  это должна быть строка с заголовком первой статьи.
print_r($datavalue);

Загружаем данные одной записи таблицы в массив

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

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();

//2. Создадим запрос к базе данных, в данном случае мы выбираем первую статью
$q = 'SELECT title FROM jos_content ORDER BY id ASC LIMIT 1 ';

//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($q);

//4.  Выполним запрос и получим данные 
$data_array = $db->loadResultArray(); 

//5. Посмотрим  что нам вернул этот метод,  должен быть массив с элементами id и  title
print_r($data_array);

Результат:

Array

(
    [0] => Welcome to Joomla!
)


Загружаем данные одной записи таблицы в объект

Мы можем получить объект свойствами которого будут поля записи.

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();

//2. Создадим запрос к базе данных, в данном случае мы выбираем 1 статью
$query = 'SELECT * FROM  jos_content ORDER BY id ASC  LIMIT 1';

//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($query);

//4.  Выполним запрос 
$row = $db->loadObject(); 

//5. Посмотрим  что нам вернул этот метод
print_r($row);

Получение ассоциативного списка записей

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

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();

//2. Создадим запрос к базе данных, в данном случае мы выбираем только первые 10 статей
$query = 'SELECT id,title FROM jos_content ORDER BY id ASC LIMIT 10 ';

//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($query);

//4.  Выполним запрос и получим данные в качестве списка объектов
$data_rows_assoc_list = $db->loadAssocList(); 

//5. Посмотрим  что нам вернул этот метод
print_r($data_rows_assoc_list);

Получение списка объектов

Многие, кто пишет расширения для Joomla сталкивается с тем что нужно выполнить запрос к базе данных для получения или вставки данных. Попробуем получить простейший список объектов.

//1. Создадим экземпляр класса
$db=& JFactory::getDBO();

//2. Создадим запрос к базе данных
$q = 'SHOW TABLES';

//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($q);

//4.  Выполним запрос и получим данные в качестве списка объектов
$data_object_list = $db->loadObjectList();

//5. Посмотрим какие таблицы у нас есть. Распечатав список
print_r($data_object_list);

Смотрите также:
Комментарии (16) Добавить комментарий
  • Юрий
    Юрий
    04 Июля 2011, 21:04
     ↑  +5  ↓     ответ

    Почему код проверки соединения с базой данных выдает ошибку, хотя джумла работает нормально.....

    • smet.denis
      smet.denis (админ)
      04 Июля 2011, 23:21
       ↑  -14  ↓     ответ

      А зачем вам проверять состояние подключения?

    • Сергей
      Сергей
      22 Ноября 2012, 05:23
       ↑  0  ↓     ответ

      В проверке ошибка, перевожу на русский данное условие:

      $db =& JFactory::getDBO();

      if ($db->connected()) { // если соединение установлено то

      echo "Нет соединения с сервером баз данных"; //выводим это, хотя на самом деле наоборот

      jexit(); // и выходим

      } else { // иначе

      echo "Все отлично, мы можем выполнять важные действия с базой данных"; // выводим это, хотя на самом деле наоборот

      }

      • InFoS
        InFoS
        26 Мая 2015, 04:32
         ↑  0  ↓     ответ

        Вы забыли отрицание в условии (которое есть в примере)

        if (!$db->connected())

  • Юрий
    Юрий
    05 Июля 2011, 19:28
     ↑  +10  ↓     ответ

    у меня не работает команды обращения к базе данных, я проверил на самом простом примере (проверка связи) и это не работает. У меня вопрос в чем может быть проблема, если не одна команда не выполняется?

  • Павел
    Павел
    29 Июня 2013, 03:50
     ↑  0  ↓     ответ

    У меня при вставки новой записи пишет

    DATABASE_ERROR_FUNCTION_FAILED

  • Андрей
    Андрей
    03 Октября 2013, 19:46
     ↑  0  ↓     ответ

    А мне помогло, спасибо!

  • Сергей
    Сергей
    22 Января 2014, 05:26
     ↑  0  ↓     ответ

    Ребята прошу помощи

    как мне сделать несколько запросов к разным таблицам базы данных?

    Мне нужно получить 1е значение с 1й таблицы, а затем вторым запросом подставить полученное значение в виде переменной во втором запросе?

  • Александр
    Александр
    11 Декабря 2014, 21:07
     ↑  0  ↓     ответ

    Как запустить цикл? У меня сейчас выводит одну и туже картинку или просто "i"

    $q ="SELECT vm.`file_url_thumb`

    FROM `#__virtuemart_medias` vm

    LEFT JOIN `#__virtuemart_product_medias` vpm ON vpm.`virtuemart_media_id` = vm.`virtuemart_media_id`

    WHERE vpm.`virtuemart_product_id`='".$product->virtuemart_product_id."'

    AND vm.`file_mimetype` LIKE 'image/%'

    ORDER BY vm.`file_is_product_image` DESC ";

    $db->setQuery($q); //3. Установим этот запрос в экземпляр класса работы с базами данных

    $db->query(); //4. Выполним запрос

    echo ' '.$db->getAffectedRows ().''; //5. Посмотрим сколько было задействовано строк

    $thumburl = $db->loadResult();

    if(!$thumburl)

    $thumburl = 'components/com_virtuemart/assets/images/vmgeneral/'.VmConfig::get('no_image_set');

    echo '<div class="browsecellwidth">';

    echo $product->virtuemart_vendor_id;

    echo '<div class="compaign-name"><h6><a href="'.$product_url.'" >'.ucfirst($product->product_name).'</a></h6></div>';

    echo '<div class="holder-compaign-avatar"><div class="slider"><div class="slides">';

    $count_images = $db->getAffectedRows ();

    echo $count_images;

    if ($count_images = 10) {

    for ($i = 1; $i < 10; $i++)

    {

    $img = $thumburl[$i];

    echo '<div class="slide"><a href="'.$juri.$img.'" alt="'.ucfirst($product->product_name).'" data-lightbox="roadtrip['.ucfirst($product->product_name).']" tite="'.ucfirst($product->product_s_desc).'" data-title="'.ucfirst($product->product_s_desc).'"><img src="'.$juri.$img.'" class="compaign-avatar"></a></div>';

    }

    } else {

    for ($i = 0; $i < $count_images; $i++)

    {

    $img = $thumburl[$i];

    echo '<div class="slide"><a href="'.$juri.$img.'" alt="'.ucfirst($product->product_name).'" data-lightbox="roadtrip['.ucfirst($product->product_name).']" tite="'.ucfirst($product->product_s_desc).'" data-title="'.ucfirst($product->product_s_desc).'"><img src="'.$juri.$img.'" class="compaign-avatar"></a></div>';

  • Александр
    Александр
    16 Декабря 2014, 15:46
     ↑  0  ↓     ответ

    У себя в джумле пишу вот такой код в материале, редактор выключен в настройках:

    $db =& JFactory::getDBO();

    $q = SELECT * FROM #__1db;

    $db->setQuery($q);

    $db->explain();

    Перехожу на страницу сайта, и вижу вот такую картину:

    setQuery($q); $db->explain(); ?>

    Нажимаю просмотр кода и мне показывает:

    <!--?php

    $db =& JFactory::getDBO();

    $q = SELECT * FROM #__1db;

    $db--->

    "setQuery($q);

    $db->explain();

    ?>

    "

    Из за чего данная ошибка??? Как решить? Уже пробовал разные варианты запросов, и всё равно не работает.

  • Мурад
    Мурад
    04 Марта 2015, 19:43
     ↑  +2  ↓     ответ

    queryBatch() в joomla 3.0 работает? почему то он у меня вообще ни на что не реагирует

    • Павел
      Павел
      11 Января 2016, 21:49
       ↑  0  ↓     ответ

      queryBatch() - этот метод по ходу убрали из джумла 3. Но я его добавил назад)

      Открываем libraries\joomla\database\database.php

      Вставляем после

      public function query()

      {

      JLog::add('JDatabase::query() is deprecated, use JDatabaseDriver::execute() instead.', JLog::WARNING, 'deprecated');

      return $this->execute();

      }

      Это

      abstract public function queryBatch($abortOnError = true, $transactionSafe = false);

      Открываем libraries\joomla\database\driver\mysql.php

      Вставляем после метода

      public function execute()

      {

      ....

      return $this->cursor;

      }

      Код

      public function queryBatch($abortOnError = true, $transactionSafe = false)

      {

      // Deprecation warning.

      JLog::add('JDatabaseMySQL::queryBatch() is deprecated.', JLog::WARNING, 'deprecated');

      $sql = $this->replacePrefix((string) $this->sql);

      $this->errorNum = 0;

      $this->errorMsg = '';

      // If the batch is meant to be transaction safe then we need to wrap it in a transaction.

      if ($transactionSafe)

      {

      $sql = 'START TRANSACTION;' . rtrim($sql, "; \t\r\n\0") . '; COMMIT;';

      }

      $queries = $this->splitSql($sql);

      $error = 0;

      foreach ($queries as $query)

      {

      $query = trim($query);

      if ($query != '')

      {

      $this->cursor = mysql_query($query, $this->connection);

      if ($this->debug)

      {

      $this->count++;

      $this->log[] = $query;

      }

      if (!$this->cursor)

      {

      $error = 1;

      $this->errorNum .= mysql_errno($this->connection) . ' ';

      $this->errorMsg .= mysql_error($this->connection) . " SQL=$query <br />";

      if ($abortOnError)

      {

      return $this->cursor;

      }

      }

      }

      }

      return $error ? false : true;

      }

      Открываем libraries\joomla\database\driver\mysqli.php

      Вставляем после метода

      private function hasProfiling()

      {

      ...

      }

      Код

      public function queryBatch($abortOnError = true, $transactionSafe = false)

      {

      // Deprecation warning.

      JLog::add('JDatabaseMySQLi::queryBatch() is deprecated.', JLog::WARNING, 'deprecated');

      $sql = $this->replacePrefix((string) $this->sql);

      $this->errorNum = 0;

      $this->errorMsg = '';

      // If the batch is meant to be transaction safe then we need to wrap it in a transaction.

      if ($transactionSafe)

      {

      $sql = 'START TRANSACTION;' . rtrim($sql, "; \t\r\n\0") . '; COMMIT;';

      }

      $queries = $this->splitSql($sql);

      $error = 0;

      foreach ($queries as $query)

      {

      $query = trim($query);

      if ($query != '')

      {

      $this->cursor = mysqli_query($this->connection, $query);

      if ($this->debug)

      {

      $this->count++;

      $this->log[] = $query;

      }

      if (!$this->cursor)

      {

      $error = 1;

      $this->errorNum .= mysqli_errno($this->connection) . ' ';

      $this->errorMsg .= mysqli_error($this->connection) . " SQL=$query <br />";

      if ($abortOnError)

      {

      return $this->cursor;

      }

      }

      }

      }

      return $error ? false : true;

      }

      После этого у меня все завелось. Вуаля..))

  • Дана
    Дана
    20 Апреля 2015, 18:55
     ↑  0  ↓     ответ

    Здравствуйте, у меня такой вопрос, при попытке увидеть сайт в готовом виде , на экране появилась ошибка(не правильный запрос к базе в шаблоне joomla), вопрос, можно ли мне вручную исправить запрос, и самое главное в каком примерно файле находятся строки запросов))?

  • Svyatoslav
    Svyatoslav
    05 Сентября 2015, 19:25
     ↑  0  ↓     ответ

    Все привет! У меня трабл, не знаю в чем дело даже, хочу записать данные в БД и ничего не получается использую этот код что есть сдесь

    <?

    $db =& JFactory::getDBO();

    $sql = " INSERT INTO `jos_content` (`title`, `introtext`) VALUES ('Тест', 'test') ";

    $db->setQuery($sql);

    if(!$db->query()) {

    echo __LINE__.$db->stderr();

    }

    ?>

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

    • C@H
      C@H
      09 Сентября 2015, 20:04
       ↑  0  ↓     ответ

      Svyatoslav, попробуйте так

      $db =JFactory::getDBO();

      $sql = " INSERT INTO `#__content` (`title`, `introtext`) VALUES ('Тест', 'test') ";

  • Виктор Б
    Виктор Б
    07 Октября 2015, 03:13
     ↑  0  ↓     ответ

    Я "переворачиваю" интернет!

    Я перенес сайт на Joomle, на новый домен

    скажите - какой запрос мне сделать в БД если я хочу везде и в текстах и полностью на сайте поменять адрес ссылки (адрес) старый на новый?

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.