439  1

#joomla[faq] :: як коректно отримати дані (select) з бази даних

Розглянемо в цій статті, як можна спростити запис запиту до бази даних в порівнянні з офіційною документацією.

#joomla[faq] :: як коректно отримати дані (select) з бази даних

Офіційна документація по роботі з базою даних знаходиться тут. Але… Як показує досвід, можна, і на мій погляд навіть потрібно, застосовувати більш короткий запис в запитах типу SELECT в базі даних CMS Joomla!.

loadResult()

Отже. Офіційний алгоритм простого запиту loadResult() до БД виглядає наступним чином.

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('name');
$query->from($db->quoteName('#__my_table'));
$query->where($db->quoteName('id')." = ".$db->quote($some_value));

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

У цьому запиті ми отримуємо ім'я користувача (name) з таблиці:

id name email username
1 John Smith Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. johnsmith
2 Magda Hellman Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. magdah
3 Yvonne de Gaulle Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. ydegaulle

Це ж значення можна отримати використовуючи більш короткий, і, на мій погляд, більш логічний, запис (де змінна $some_value = 1):

$db = JFactory::getDbo();
$db->setQuery('SELECT name FROM #__my_table WHERE id = ' . $some_value);
$valueStr = $db->loadResult();

В результаті отримуємо в змінну $valueStr значення відповідної комірки таблиці John Smith.

loadRow()

Для отримання в масиві цілого рядка з таблиці використовуємо запит loadRow().

id name email username
1 John Smith Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. johnsmith
2 Magda Hellman Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. magdah
3 Yvonne de Gaulle Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. ydegaulle

$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id = ' . $some_value);
$valueArr = $db->loadRow();

В результаті в змінну $valueArr отримуємо масив у вигляді:

Array ([0]=>1, [1]=>John Smith, [2]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [3]=>johnsmith)

Використовуючи запит:

$value = $valueArr[0];

…отримуємо id рядка запису. Далі змінюючи замість "0" ключі масиву, отримуємо ті значення рядка таблиці, які нам потрібні.

loadAssoc()

Рядок ми також можемо отримати у вигляді асоціативного масиву, де ключами виступають імена колонок таблиці. Використовуючи запит:

$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id = ' . $some_value);
$valueArr = $db->loadAssoc();

…отримуємо асоціативний масив у вигляді:

Array ([id]=>1, [name]=>John Smith, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>johnsmith)

Відповідно, щоб отримати, наприклад, email користувача, потрібно звернутися до асоціативного масиву в змінній $valueArr з ключем email:

$value = $valueArr['email'];

loadObject()

Також дані рядки з таблиці бази даних в CMS Joomla! можна отримати у вигляді об'єкта, і працювати надалі з цими даними відповідним способом.

$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id = ' . $some_value);
$valueArr = $db->loadObject();

В результаті виконання такого запиту, ми отримуємо об'єкт, який містить наступні дані:

stdClass Object ([id]=>1, [name]=>John Smith, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>johnsmith)

Відповідно, щоб отримати дані логіна користувача з цього об'єкта, потрібно звернутися до нього з наступним запитом:

$value = $valueArr->username;

loadColumn()

id name email username
1 John Smith Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. johnsmith
2 Magda Hellman Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. magdah
3 Yvonne de Gaulle Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. ydegaulle

Використовуючи запит до БД у вигляді:

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT name FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadColumn();

…ми отримуємо в масиві дані з колонки name, де id рядків відповідають значенням "1", "2" і "3".

Array ([0]=>John Smith, [1]=>Magda Hellman, [2]=>Yvonne de Gaulle)

loadRowList()

Щоб мати можливість оперувати даними відразу з багатьох колонок таблиці, застосовуємо запит loadRowList().

id name email username
1 John Smith Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. johnsmith
2 Magda Hellman Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. magdah
3 Yvonne de Gaulle Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її. ydegaulle

У вигляді коду PHP запит може виглядати наступним чином:

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadRowList();

В результаті отримуємо масиви в масиві:

Array (
[0]=>Array ([0]=>1, [1]=>John Smith, [2]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [3]=>johnsmith),
[1]=>Array ([0]=>2, [1]=>Magda Hellman, [2]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [3]=>magdah),
[2]=>Array ([0]=>3, [1]=>Yvonne de Gaulle, [2]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [3]=>ydegaulle)
)

Відповідно, щоб отримати певний запис з певної комірки, потрібно використовувати код наступного типу:

$value = $valueArr[2][3];

Таким чином, ми отримуємо значення логіна користувача (username) з третього рядка (рахунок в масиві починається з нуля), і четвертого стовпця, що в нашому випадку, відповідає значенню ydegaulle.

loadAssocList()

Але… У більшості випадків подібний вид масиву складно використовувати в практичних цілях, тому, існує ще один метод отримання даних з БД CMS Joomla! вже в вигляді асоціативного масиву, де ключами масиву є назви полів таблиці. Наприклад:

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadAssocList();

В цьому випадку ми отримуємо вже асоціативний масив у вигляді:

Array (
[0]=>Array ([id]=>1, [name]=>John Smith, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>johnsmith),
[1]=>Array ([id]=>2, [name]=>Magda Hellman, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>magdah),
[2]=>Array ([id]=>3, [name]=>Yvonne de Gaulle, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>ydegaulle)
)

Цей вид масиву зручно застосовувати, зокрема, в циклі for, коли нам в одному місці потрібно використовувати одне значення в залежності від іншого значення з тієї ж таблиці. Наприклад, для отримання запису імені користувача в циклі "$i = 1", ми використовуємо код:

$i = 1;
	
$value = $valueArr[$i]['name'];

В результаті отримуємо Magda Hellman.

loadAssocList($key)

У більшості ж випадків найбільш зручно використовувати дані масиву в прив'язці до певного унікального ключа. Наприклад, id користувача, статті, email користувача і т.д. Для подібних випадків в системі управління контентом (CMS) Joomla! існує ще один спосіб формування асоціативного масиву з декількох стовпців однієї таблиці бази даних – loadAssocList($key). Як приклад в наведеному нижче коді ми використовуємо прив'язку до унікального ключа id користувача.

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadAssocList('id');

В результаті отримуємо масив:

Array (
[1]=>Array ([id]=>1, [name]=>John Smith, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>johnsmith),
[2]=>Array ([id]=>2, [name]=>Magda Hellman, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>magdah),
[3]=>Array ([id]=>3, [name]=>Yvonne de Gaulle, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>ydegaulle)
)

loadAssocList($key, $column)

Часто буває потрібно, уникнувши зайвих даних у змінній, отримати пов'язані значення з масиву. Таким чином, змінній $key присвоюємо значення унікального ключа, і в якості змінної $column вказуємо ім'я поля, яке буде представлено в зв'язці з відповідним ключем.

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadAssocList($id, $name);

…в результаті отримуємо у змінній масив:

Array (
[1]=>John Smith,
[2]=>Magda Hellman,
[3]=>Yvonne de Gaulle,
)

…де ключами масиву є id рядка, а значенням – ім'я користувача (name).

loadObjectList()

В якості альтернативи простому асоціативному масиву CMS Joomla! пропонує ще один формат даних, у вигляді об'єкта, який користувач може отримувати з бази даних і використовувати в своїх скриптах.

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadObjectList();

В результаті отримуємо масив з об'єктів у вигляді:

Array (
[0]=>stdClass Object ([id]=>1, [name]=>John Smith, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>johnsmith),
[1]=>stdClass Object ([id]=>2, [name]=>Magda Hellman, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>magdah),
[2]=>stdClass Object ([id]=>3, [name]=>Yvonne de Gaulle, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>ydegaulle)
)

У цьому випадку, щоб отримати значення з певної комірки якого-небудь рядка, потрібно застосувати код такого типу:

$value = $valueArr[1]->username;

…який нам повертає логін користувача з вищенаведеної таблиці використовуючи рядок з ключем "1" і ключем вкладеного масиву "username". В даному конкретному випадку, даний код нам повертає значення magdah.

Ну і наостанок…

loadObjectList($key)

Аналог loadObjectList(), але вже в якості асоціативного масиву об'єктів з ключем по одному з полів з унікальними значеннями. Наприклад:

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadObjectList('username');

В даному випадку ми отримуємо асоціатівний масив з об'єктів з наступним змістом:

Array (
[johnsmith]=>stdClass Object ([id]=>1, [name]=>John Smith, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>johnsmith),
[magdah]=>stdClass Object ([id]=>2, [name]=>Magda Hellman, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>magdah),
[ydegaulle]=>stdClass Object ([id]=>3, [name]=>Yvonne de Gaulle, [email]=>Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її., [username]=>ydegaulle)
)

Щоб отримати, наприклад, ім'я користувача, використовуючи його логін, можна використовувати наступний код:

$value = $valueArr['johnsmith']->name;

В результаті отримуємо значення змінної $value = John Smith.

Підписуйтесь. Коментуйте. Діліться відео і статтями – зробимо разом нашу роботу простішою і цікавішою!

Удачі, Миру і Добра!

Igor KRUK

переклад з російської

Створення landing page, сайтів-візиток, корпоративних сайтів, веб-порталів та інтернет-магазинів на різних платформах у розумні строки і…
за розумні гроші.

Якщо ви вже зареєстровані на цьому сайті, або вже залишали тут свої коментарі, відгуки, заявки на участь в акціях, щоб додати ще один коментар – авторизуйтесь

Додати коментар

Коментарі


«ArtInWeb.biz»
  • #26

UA :: У коментарях ви можете щось додати або уточнити, у т.ч. поділитися вашим кодом.


RU :: В комментариях вы можете что-то добавить или уточнить, в т.ч. поделиться вашим кодом.


EN :: In comments you can add or clarify something, including share your code.


© «ArtInWeb.biz» – веб-розробка повного циклу

В останнє редагувалось: 15/06/2019