Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

Дизайн и модификация Invision Community

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

SQL код в html

Вопрос к программистам sql

 

каким образом преобразовать sql запрос к БД:

 

 

        if( count($data['topic_data']) )
       {
           $reps = array();
           $tids = array_keys( $data['topic_data'] );

           $this->DB->build( array(
               'select'   => 'rc.rep_points',
               'from'     => array('reputation_cache' => 'rc'),
               'add_join' => array(
                   0 => array(
                       'select' => 'p.topic_id',
                       'from'   => array('posts' => 'p'),
                       'where'  => 'rc.type_id=p.pid',
                       'type'   => 'inner',
                   ),
               ),
               'where'    => 'p.topic_id IN ('.implode(',', $tids).') AND rc.app="forums"',
               'group'    => 'p.topic_id',
               'order'    => 'p.pid ASC',
           ) );

           $this->DB->execute();

           while( $row = $this->DB->fetch() )
           {
               $reps[ $row['topic_id'] ] = $row['rep_points'];
           }

           foreach( $tids as $v )
           {
               $data['topic_data'][$v]['rep_firstpost'] = ( $reps[$v] ) ? $reps[$v] : 0;
           }
       }

 

 

(благодарность за код siv1987)

 

в вариант для вставки в html (шаблон страницы IP.Content) По примеру кода-запроса к БД

 

 

 

<if test="intval($record['record_topicid'])">
<if test="($forum = $this->DB->buildAndFetch( array('select' => 'f.id, f.name, f.name_seo', 'from' => array('forums' => 'f'), 'where' => 'f.id=t.forum_id', 'add_join' => array( array('from' => array('topics' => 't'), 'where' => 't.tid='.$record['record_topicid'])))))!==FALSE">
{$forum['name']}
</if>
</if>

 

Рекомендованные сообщения

<php>
$forum = $this->DB->buildAndFetch( array('select' => 'f.id, f.name, f.name_seo', 'from' => array('forums' => 'f'), 'where' => 'f.id=t.forum_id', 'add_join' => array( array('from' => array('topics' => 't'), 'where' => 't.tid='.$record['record_topicid']))));
</php>
....
<if test="$forum['id']">
  {$forum['name']}
</if>

  • Автор

Видимо неправильно поняли, или я так объяснил. Вы написали запрос на вывод названия форума. А мне нужен вариант по первому коду (под первым спойлером). Под вторым спойлером пример...

Чем первый вариант не устраивает?

  • Автор

Чем первый вариант не устраивает?

 

 

Первый выриант для форума, а мне нужно вывести на главную ИП.Контента. sql запросы понимаю, а в общую картину сложить не могу...

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

't.tid='.$record['record_topicid'

и вывод из reputation_cache rep_points согласно...все запутался... в общем вывод репутации первого сообщения, насколько понимаю в ИП.Контенте можно сравнивать только по $record['record_topicid', больше пока не нашел

Если речь о IP.Content тогда хз...

  • Автор

Но запрос то остается запросом... единственный важный момент из IP.Content - с чем сравнивать запрос. Как должен выглядеть запрос в таком случае, если сначала сравнивается ID топика с .$record['record_topicid']? - .$record['record_topicid'] из IP.Content - это и есть id топика в ip.board

 

если словами, то по типу:

если

't.tid='.$record['record_topicid']

то t.tid сравниваем с чем то (еще не понял как вы вытягиваете id первого сообщения, наверно функцией foreach)

получаем репутацию этого t.tid и выводим результат...

 

ужасно звучит... понимаю

еще не понял как вы вытягиваете id первого сообщения, наверно функцией foreach

При помощью GROUP BY topic_id ORDER BY pid ASC

foreach служит там совсем для другого, он добавляет в массив topic_data полученные данные.

  • Автор

да...догадался...

 

но по логике должна работать такая комбинация

 

 

        if( count($data['topic_data']) )
       {
           $reps = array();
           $tids = array_keys( $data['topic_data'] );

           $this->DB->build( array(
               'select'   => 'rc.rep_points',
               'from'     => array('reputation_cache' => 'rc'),
               'add_join' => array(
                   0 => array(
                       'select' => 'p.topic_id',
                       'from'   => array('posts' => 'p'),
                       'where'  => 'rc.type_id=p.pid',
                       'type'   => 'inner',
                   ),
               ),
               'where'    => 'p.topic_id IN ('.implode(',', $tids).') AND rc.app="forums"',
               'group'    => 'p.topic_id',
               'order'    => 'p.pid ASC',
           ) );

           $this->DB->execute();

           while( $row = $this->DB->fetch() )
           {
               $reps[ $row['topic_id'] ] = $record['record_topicid'];
           }

           foreach( $tids as $v )
           {
               $data['topic_data'][$v]['rep_firstpost'] = ( $reps[$v] ) ? $reps[$v] : 0;
           }
       }

 

где

$reps[ $row['topic_id'] ] = $record['record_topicid'];

сравнение

 

и в шаблон

 

{$data['rep_firstpost']}

 

только нефига не работает...

но по логике должна работать такая комбинация

Ну эта комбинация была написана для конкретного файла, я не уверен что в таком виде она будет работать в другом месте.

 

где

$reps[ $row['topic_id'] ] = $record['record_topicid'];

сравнение

Это совсем не сравнение, а присвоение. Сравнение так может быть только в sql запросе, а здесь уже php.

 

Напишите какие данные в этом шаблоне есть (имена переменных)

и какие данные нужно вытащить (имена таблиц и полей)

  • Автор

Запросом print_r( $variable ); в шаблоне сделать?

  • Автор

Ничего не выходит...

 

<if test="intval($record['record_topicid'])">
<if test="(
$record['record_topicid'] = $this->DB->buildAndFetch( 
array(
'select' => 'p.topic_id', 
'from' => array('posts' => 'p'), 
'where' => 			{
			$row['topic_id'] = $row['pid'];
		}
'add_join' => array( 
array(
'select' => 'rep_points',
'from' => array('reputation_cache' => 'rc'), 
'where' => {
			$row['type_id'] = $row['rep_points'];
		}

))))!==FALSE">
</if>
</if>

 

Совсем не в ту степь?

Жесть. Как вы думаете что вернет if( intval( '1" SQL' ) ) - true или false?

 

Я уже десять раз писал, не используйте запросы к бд в if test="". Для этого есть спец теги .

Запрос составлен неверно. Правильно он будет примерно таким

 

<php>
$_data = $this->DB->buildAndFetch( array(
'select' => 'p.topic_id',
'from'   => array('posts' => 'p'), 
'where'  => 'p.topic_id='.$record['record_topicid'].' AND rc.type="pid"',
'add_join' => array( 
	array(
		'select' => 'rc.rep_points',
		'from'   => array('reputation_cache' => 'rc'), 
		'where'  => 'rc.type_id=p.pid',
	)
)
) );
</php>

а ниже в шаблоне

 

<if test="$_data['topic_id']">
   Мега репа: {$_data['rep_points']}
</if>

  • Автор

Почему в if нельзя использовать запросы к бд?! оО с выводом названия форума работает же =)

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

Программирование для битардов.

 

<php>$a = func($c)</php> ===> <?php $a = func($c); ?>

<if test="$a = func($c)"></if> ===> <php if($a = func($c)) { ?><?php } ?>

 

Если вам нужно выполнить "$a = func($c);", зачем вам лишняя операция if и пара десятков лишних конструкций в итоговом коде шаблона? Ресурсов сервера больно до*уя?

  • Автор

Ресурсов сервера больно до*уя?

 

... И времени... и знаний. Если нет других вариантов, пытаюсь решить задачу на рабочем примере, от того и вопросы такие.

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.