система тегов

Не о CI, но о PHP, интерфейсах и веб-проограммировании

система тегов

Сообщение noo » 17 янв 2010, 23:20

Друзья, подскажите запрос к бд на добавление тегов.
Написал вот такой:
Код: Выделить всё

$tags 
explode(','$tag);
foreach (
$tags as $tag)
{
  
$tag trim($tag);
  
$q4 mysql_query("INSERT INTO `tags` (`tag`) VALUES ('".$tag."')");
 if (
$q4) echo 'все хокей'
 else echo 
'Чото с тегами не то. Жопа какая-то ';

 

но не работает
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение radioheaded » 18 янв 2010, 09:58

Вы же понимаете, что то, что это теги, здесь не принципиально; по сути обычная вставка в таблицу. Уточните, как именно не работает? Пишет «все хокей», а в таблице данные не появляются?

Пока могу дать лишь такой совет: INSERT в MySQL поддерживает вставку множественных данных, используйте ее. То есть, вместо нескольких запросов INSERT в цикле составьте строку VALUES (например, ('tag1'), ('tag2'), ('tag3') ), а затем выполните один запрос.
radioheaded
 

Re: система тегов

Сообщение noo » 19 янв 2010, 14:30

Я прошу прощения. Глюк был на моем Localhost, поставил на хостинг - все заработало.

Я второй день на CodeIgniter, перевел запросы на более простую структуру, продолжил писать вбивание тегов и теперь у меня еще 2 вопроса. Чтобы было понятно, для начала рубану структуру бд, авось кому пригодится:

таблица tags (id, tag)
таблица связи tags_data (tag_id, post_id)
post_id = id записи

В общем код получился такой:
Код: Выделить всё
         $tags=$_POST['tags'];
    
$tags str_replace(', '','$this->input->post('tags'));
                
$tags str_replace('_'' '$tags);
                
$tags explode(','$tags);
                
                foreach (
$tags as $tag) {
                    
                    
$tag trim($tag);
                    
                    if (!empty(
$tag))
                    {
                        
$this->db->where('tag'$tag);
                        
$query $this->db->get('tags',1);
                    
                        if ( 
$query->num_rows() == )
                        {
                            
$row $query->row_array();
                            
$tag_id $row['id'];
                        }
                        else
                        {
                            
$tag_data = array('tag' => $tag);
                            
$this->db->insert('tags'$tag_data);
                        
                            
$tag_id $this->db->insert_id();
                        }
                    
                        
$tag_assoc_data =    array(
                                                
'tag_id' => $tag_id,
                                                
'post_id' => $post_id
                                            
);
                    
                        
$this->db->insert('tags_data'$tag_assoc_data);
                    }
                    
                } 


Вопросы:
1) как сделать, чтобы таблица связи (tags_data) имела структуру вида:
post_id | tag_id
1 5 6 9 23

вместо того, что получается сейчас:

post_id | tag_id
1 5
1 6
1 9
1 23

2) как проще всего узнавать текущий post_id ?
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение radioheaded » 19 янв 2010, 15:17

noo писал(а):Вопросы:
1) как сделать, чтобы таблица связи (tags_data) имела структуру вида:
post_id | tag_id
1 5 6 9 23

вместо того, что получается сейчас:

post_id | tag_id
1 5
1 6
1 9
1 23

2) как проще всего узнавать текущий post_id ?


Прежде всего, хочется посоветовать почитать мануал к функции str_replace, писать сразу станет проще. Продолжая придираться: проще и надежнее, на мой взгляд, доставать теги из строки регулярным выражением; тогда ни replace, ни trim не понадобятся. Ну и по существу )

1) если действительно есть желание так сделать — записывайте в tag_id сериализованный массив значений id тегов. Только замучаетесь потом, если нужно будет выбрать все статьи с указанным тегом. Ведь именно для этого такая структура и используется. И вообще, вам зачем именно так? Чем не устраивает то хранение, которое используется сейчас?

2) а что такое текущий post_id? Это вам виднее. Если у вас структура URI, например, /post/view/5 , то post_id — параметр функции view в контроллере post. Поясните, откуда post_id у вас вообще берется, тогда может быть напишу что-то действительно полезное =)
radioheaded
 

Re: система тегов

Сообщение noo » 19 янв 2010, 17:40

radioheaded, спасибо за ответ.

Да, я уже передумал использовать вариант со склеиными айди тегов.

2) как проще всего узнавать текущий post_id ?

post_id - это id текущей записи.

При добавлении записи вначале у меня идут поля: название, текст записи, теги.
Т.е. название и текст сразу попадают в таблицу data.
Оттуда же надо сразу получить id только что добавленных данных для вставки в таблицу связи с тегами tags_data.
post_id = id только что добавленных данных в таблицу data.
Вот и удивительно, что самый простой вариант узнать этот айди мне не лезет в голову.
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение aktuba » 19 янв 2010, 20:09

$this -> db -> insert_id();

Может так? ;) Вообще, стоит почитать доки по CI. ;)
aktuba
 
Сообщения: 48
Зарегистрирован: 03 фев 2009, 21:19

Re: система тегов

Сообщение noo » 19 янв 2010, 20:19

aktuba писал(а):$this -> db -> insert_id();

Может так? ;) Вообще, стоит почитать доки по CI. ;)

its absolutely greatness!
наверное стоит :D но вообще это мой загон был, я ведь для других случаев так и делал)
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение radioheaded » 20 янв 2010, 13:48

noo писал(а):
aktuba писал(а):$this -> db -> insert_id();

Может так? ;) Вообще, стоит почитать доки по CI. ;)

its absolutely greatness!
наверное стоит :D но вообще это мой загон был, я ведь для других случаев так и делал)


Я предполагал, что вы об этом, но увидев в вашем коде использование insert_id(), решил уточнить )
radioheaded
 

Re: система тегов

Сообщение noo » 20 янв 2010, 18:10

продолжайте наставлять малограмотного))

делаю выборку к тегов к конкретной записи:
Код: Выделить всё
$id=$this->       uri->      segment(3);        
$this->db->select('tag');
$this->db->from('tags');
$this->db->join('tags_data''tags_data.tag_id=tags.id');
$this->db->join('data''data.id=tags_data.post_id');
$this->db->where('data.id'$id);

$tags=$this->db->get() ->   result_array();
   foreach(
$tags as $tag
  { 
     echo 
$tag[tag]." <br><br />";}
return 
$tags[0]; 


результат конечно выводится, но вместе с циклической ошибкой:
Message: Use of undefined constant tag - assumed 'tag'

ну и вообще по коду покритикуйте)
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение radioheaded » 20 янв 2010, 19:58

noo писал(а):продолжайте наставлять малограмотного))

делаю выборку к тегов к конкретной записи:
Код: Выделить всё
$id=$this->       uri->      segment(3);        
$this
->db->select('tag');
$this->db->from('tags');
$this->db->join('tags_data', 'tags_data.tag_id=tags.id');
$this->db->join('data', 'data.id=tags_data.post_id');
$this->db->where('data.id', $id);

$tags=$this->db->get() ->   result_array();
   foreach($tags as $tag) 
  
{ 
     echo $tag
[tag]." <br><br />";}
return $tags[0]; 


результат конечно выводится, но вместе с циклической ошибкой:
Message: Use of undefined constant tag - assumed 'tag'

ну и вообще по коду покритикуйте)


Ну давайте попорядку )

Мне лично не нравится конструкция $this->uri->segment(3), я предпочитаю передавать параметры из контроллера в модель (это ведь код из модели?). Но это кому как нравится.

Вы используете PHP4? Если нет, то это пятиэтажное строение можно переписать так:
Код: Выделить всё
$tags = $this->db->select('tag')->from('tags')->join('tags_data', 'tags_data.tag_id=tags.id')->join('data', 'data.id=tags_data.post_id')->where('data.id', $id)->get()->result_array(); 


А ругается PHP на вас из-за вот этого —  echo $tag[tag]. tag это же не константа, а строковый индекс, так заключим же его в кавычки, аминь:  echo $tag['tag']. PHP в данном случае лоялен и интерпретирует такие вещи как строки (поэтому лишь message, а не error), но надо быть аккуратнее.

Ну еще br незакрытый, не XHTML-но это )
radioheaded
 

Re: система тегов

Сообщение noo » 20 янв 2010, 20:12

radioheaded писал(а):
noo писал(а):продолжайте наставлять малограмотного))

делаю выборку к тегов к конкретной записи:
Код: Выделить всё
$id=$this->       uri->      segment(3);        
$this
->db->select('tag');
$this->db->from('tags');
$this->db->join('tags_data', 'tags_data.tag_id=tags.id');
$this->db->join('data', 'data.id=tags_data.post_id');
$this->db->where('data.id', $id);

$tags=$this->db->get() ->   result_array();
   foreach($tags as $tag) 
  
{ 
     echo $tag
[tag]." <br><br />";}
return $tags[0]; 


результат конечно выводится, но вместе с циклической ошибкой:
Message: Use of undefined constant tag - assumed 'tag'

ну и вообще по коду покритикуйте)


Ну давайте попорядку )

Мне лично не нравится конструкция $this->uri->segment(3), я предпочитаю передавать параметры из контроллера в модель (это ведь код из модели?). Но это кому как нравится.

Вы используете PHP4? Если нет, то это пятиэтажное строение можно переписать так:
Код: Выделить всё
$tags = $this->db->select('tag')->from('tags')->join('tags_data', 'tags_data.tag_id=tags.id')->join('data', 'data.id=tags_data.post_id')->where('data.id', $id)->get()->result_array(); 


А ругается PHP на вас из-за вот этого —  echo $tag[tag]. tag это же не константа, а строковый индекс, так заключим же его в кавычки, аминь:  echo $tag['tag']. PHP в данном случае лоялен и интерпретирует такие вещи как строки (поэтому лишь message, а не error), но надо быть аккуратнее.

Ну еще br незакрытый, не XHTML-но это )

о круто, спасибо? так и до edit'a скоро доберусь :D !
Код: Выделить всё
$id=$this->       uri->      segment(3);   

- это у меня в контроллере вставлено, просто в модель сунул, чтоб был понятен смысл $id
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение noo » 20 янв 2010, 20:55

Опа, столкнулся с новой непоняткой.

Скажем у меня такой вьювер:
Код: Выделить всё
<h1>{name}</h1> <br
{
text}</div>  <br><br>      
{
dop}</a> <br><br>  
 {
tags

И {name}, {text}, {dop} прекрасно выводятся, а вот {tags} так и остаются {tags}.
Как их подшаманить?
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение radioheaded » 21 янв 2010, 15:50

Вы используете template parser? Честно говоря, не работал с ним, но думаю, что проблема от этого не зависит. Киньте кусок, где вы передаете параметры во view. Скорее всего, вы не передаете tags, либо у вас там опечатка, либо tags — массив.
radioheaded
 

Re: система тегов

Сообщение noo » 21 янв 2010, 17:28

ну tags массив, но я ж его расциклевываю :))

вот из контроллер через модель (blogdata) во вьювер (код вьювера был выше):
Код: Выделить всё
  function view()
                {
                    $id=$this->       uri->      segment(3);
                    $this->  parser->  parse('one.php',$this->   blogdata-> getone($id)); 

функция getone из модели выглядит так:
Код: Выделить всё
 function getone($id)
    {
        $query = $this->          db->          getwhere('data', array('id' =>   $id))->   result_array();
         return $query[0];
$tags = $this->db->select('tag')->from('tags')->join('tags_data', 'tags_data.tag_id=tags.id')->join('data', 'data.id=tags_data.post_id')->where('data.id', $id)->get()->result_array(); 
 foreach
($tags as $tag) 
  
{ 
     echo $tag
['tag']." <br><br />";}
return $tags[0];

}
     
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение radioheaded » 22 янв 2010, 11:22

Так это был полный view? Я думал это кусок. У вас же там от div и a только закрывающие части, а tags не расцикливается, как вы говорите. Расцикливать его надо так:
Код: Выделить всё
{tags}
...
{/
tags}
 
radioheaded
 

Re: система тегов

Сообщение noo » 22 янв 2010, 11:36

Код: Выделить всё
{tags}
...
{/
tags} 

Почему-то не помогло. теперь {tags}{/tags} выводит.
И вот тут:
Код: Выделить всё
 $query = $this->          db->          getwhere('data', array('id' =>   $id))->   result_array(); 
мы тоже вроде получаем массив (name, text, dop) и их почему-то нормально выводит. В чем же загадка? :)
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение radioheaded » 22 янв 2010, 13:24

Повнимательнее посмотрел на то, какие данные вы возвращаете из модели. Откуда вы надеетесь получить tags во view? Все остальные поля потому и выводятся, что они существуют, а tags попросту нет в $tags[0], который вы возвращаете из getone.
radioheaded
 

Re: система тегов

Сообщение noo » 22 янв 2010, 20:06

не, не, не, вы не заметили, что тут тоже:
Код: Выделить всё
 $query $this->          db->          getwhere('data', array('id' =>   $id))->   result_array();
         return 
$query[0]; 
идет ретёрн.

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

Поэтому я сделал 2 разные функции (в моделе). Пазделил вышенаписанную (getone) и добавил функцию getonetag конкретно для $tags.

Теперь такой вопрос, как мне в контроллере обратиться, чтобы в один вьювер шли 2е функции из моей модели (blogdata) ???

нужно что-то вроде этого:
Код: Выделить всё
$this->  parser->  parse('one.php',$this->   blogdata-> getone($id) & (?) $this-> blogdata-> getonetag($id)); 

только с правильным синтаксисом
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

Re: система тегов

Сообщение radioheaded » 22 янв 2010, 22:09

Действительно, я не заметил, что функция у вас более чем странная. Вы, конечно же, знаете, что return — это точка выхода из функции? Ну то есть ваша функция
Код: Выделить всё

function getone
($id)
    {
        $query = $this->          db->          getwhere('data', array('id' =>   $id))->   result_array();
         return $query[0];
        
        $tags 
= $this->db->select('tag')->from('tags')->join('tags_data', 'tags_data.tag_id=tags.id')->join('data', 'data.id=tags_data.post_id')->where('data.id', $id)->get()->result_array(); 
        foreach
($tags as $tag) 
        
{ 
            echo $tag
['tag']." <br><br />";
        }
        return $tags[0];
}
     
 

возвращает результат $query[0] и дальше не выполняется. Может вы функцию скопировали неверно? Или вам стоит подучить самые основы?

Во view вам нужно не две функции, а правильный массив данных.
radioheaded
 

Re: система тегов

Сообщение noo » 22 янв 2010, 22:20

про ретёрн знаю, конечно.

понимаете, если я во вьювер вставляю код вызова тегов, все прекрасно работает, но я считаю что лучше работать через модель.
А тут такое расстройство((
работаю тут | веду это
noo
 
Сообщения: 12
Зарегистрирован: 17 янв 2010, 23:16

След.

Вернуться в Общие вопросы по PHP и веб-программированию

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0