Russian TYPO3 community Форум больше не используется. Присоединяйтесь к каналу #community-ru в Slack for TYPO3 community  

Вернуться   Russian TYPO3 community > Обсуждение общих технических вопросов > Общие вопросы

Ответ
 
Опции темы Опции просмотра
Старый 04.12.2012, 17:23   #1
Ивано
Guest
 
Сообщений: n/a
По умолчанию Работа с БД на основе API

В чем отличие

$query = $GLOBALS['TYPO3_DB']->SELECTquery(
от
$res = mysql(TYPO3_db, 'SELECT * FROM mytable WHERE uid=123 AND title LIKE "%blabla%" ORDER BY title LIMIT 5');

И когда что лучше использовать?
  Ответить с цитированием
Старый 05.12.2012, 13:34   #2
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

1. Логика работы с БД скрыта - это плюс. Используя $GLOBALS['TYPO3_DB'] вы точно уверены, что обращаетесь к нужной базе. А эта база не обязательно может быть MySQL. http://xavier.perseguers.ch/en/tutor...ing-typo3.html

2. Всякие функции вроде SELECTquery() упрощают конструирование запросов и уменьшают вероятность неправильно что-то сделать - забыть эскейпить параметры и т.п. Также в select обычно автоматом добавляются условия видимости записей, которые заданы в TCA (чаще всего это deleted=0 AND hidden=0 + starttime / endtime).

3. Единая точка выполнения запросов к БД тоже бывает полезна. Например для отладки можно допилить эту одну функцию в $GLOBALS['TYPO3_DB'] для подсчета числа запросов к БД на одну страницу, логировать "медленные" (по времени выполнения) или все запросы.

В $GLOBALS['TYPO3_DB'] есть и простые функции вроде sql_query() - обертка над mysql_query(). Я обычно использую их для запросов со сложной логикой подзапросов.

PS: Для упрощения работы используйте средства IDE! Добавьте в класс переменную:
Код:
/**
* @var t3lib_DB
*/
private $db = null;
А в конструкторе/main() класса объявите:
Код:
$this->db = &$GLOBALS['TYPO3_DB'];
Все же получать подсказки к методам $this->db-> удобней чем вслепую кодить $GLOBALS['TYPO3_DB']->
dmartynenko вне форума   Ответить с цитированием
Старый 05.12.2012, 16:07   #3
Ивано
Guest
 
Сообщений: n/a
По умолчанию

Понял.
Спасибо.
  Ответить с цитированием
Старый 05.12.2012, 17:39   #4
Ивано
Guest
 
Сообщений: n/a
По умолчанию

И чисто технический вопрос про выборку.

Вот есть к примеру таблица tt_content - где 40 колонок.
Есть ли в принципе существенная разница в скорости работы между

SELECT * FROM tt_content
и
SELECT uid, title FROM tt_content

Или это одно и тоже?
  Ответить с цитированием
Старый 05.12.2012, 17:44   #5
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

Есть существенная разница в объеме возвращаемых данных от mysql в php.
Особенно с учетом того, что в tt_content есть как минимум одно поле BLOB/TEXT - XML содержание FlexForm.

Но если у вас небольшая посещаемость (мало запросов в секунду), а в tt_content всего пара тысяч записей - то вряд ли разница будет хоть как-то заметна и измеряема.
dmartynenko вне форума   Ответить с цитированием
Старый 26.12.2012, 15:21   #6
Ивано
Guest
 
Сообщений: n/a
По умолчанию

Вот почему то у меня часто в разных кодах не работает

$res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT * FROM pages'...

именно $GLOBALS['TYPO3_DB']->sql

выдает ошибку сервера...
В то время как

$GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $table, $where)
работает всегда и везде

что делаю не правильно?

Спасибо.
  Ответить с цитированием
Старый 26.12.2012, 19:21   #7
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

Могу предположить что в TYPO3_db что-то нет.

А какую именно ошибку выдает?
dmartynenko вне форума   Ответить с цитированием
Старый 26.12.2012, 20:12   #8
Ивано
Guest
 
Сообщений: n/a
По умолчанию

По-моему 500.
Где - то у меня этот кусок кода работает, а где-то нет...
Не пойму почему?
  Ответить с цитированием
Старый 26.12.2012, 20:18   #9
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

Ну раз "HTTP 500 — Внутренняя ошибка сервера", то это не ошибка работы с MySQL. Смотрите логи апача, вполне возможно что вы обращаетесь к объекту, который не инициализирован, или что-то вроде этого.
dmartynenko вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB code is Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
API ядра TYPO3 - перевод официального руководства Андрей Аксенов Мастер-класс 6 26.04.2016 07:45
API TYPO3 для стороннего индексатора razawa Разработка расширений / TYPO3 extension development 5 24.11.2009 16:12
New API Docs package RSS Bot Новости TYPO3 (на английском) 0 25.06.2008 19:20
DB API Dutchak Vitaly Общие вопросы 3 05.10.2005 14:59


Часовой пояс GMT +4, время: 18:05.


Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot

Хостинг и техническая поддержка: TYPO3 Лаборатория