再びタグクラウド。 今だけが結論ではなく、入力です!

基本的にどこでもneteにタグクラウド出力の例があります。 データベースにタグ自体を保存する方法と、一般的なタグの動作を示したいと思います。

先ほど言ったように、タグ自体が保存されているテーブルがあります

CREATE TABLE `users_tags`(
`id` int (11)unsigned NOT NULL auto_increment、
`text` varchar (255) 文字 セット utf8 NOT NULL
キー ( `id`)、
一意の キー `txt`(` text`)
)エンジン= MyISAM デフォルト CHARSET = utf8 COLLATE = utf8_general_ci;


タンブリカ通信タグ

CREATE TABLE `users_fun_photos_tags_data`(
`photo_id` int (11)符号なしNOT NULL
`tag_id` int (11)符号なしデフォルト NULL
KEY `tag_id`(` tag_id`)、
KEY `photo_id`(` photo_id`)
)エンジン= MyISAM デフォルト CHARSET = utf8 COLLATE = utf8_general_ci;


写真が保存されるテーブル

CREATE TABLE `users_fun_photos`(
`id` int (11)unsigned NOT NULL auto_increment、
`title` varchar (255) デフォルト NULL
`tags` varchar (255) デフォルト NULL 、/ *ここで、タグはtag1、tag2、tag3の形式の文字列として保存されます* /
`cat_id` int (11)符号なしNOT NULL デフォルト '1'
` file` varchar (30) デフォルト NULL
`dir` varchar (3) デフォルト NULL
`user_id` int (11)符号なしデフォルト '1'
` date` datetime NOT NULL デフォルト '0000-00-00 00:00:00'
`date_last_comment` datetime default NULL
`comments` int (11)符号なしNOT NULL デフォルト '0'
`views` int (11) NOT NULL デフォルト '0'
`points` int (11) デフォルト '0'
キー ( `id`)、
KEY `views`(` views`)、
KEY `user_id`(` user_id`)、
キー 「コメント」(「コメント」)、
KEY `cat_id`(` cat_id`)、
KEY `title`(` title`)、
KEY `tags`(` tags`)、
KEY ` date` (` date` )、
KEY `date_last_comment`(` date_last_comment`)、
KEY `ポイント`( `ポイント`)
)エンジン= MyISAM デフォルト CHARSET = utf8 COLLATE = utf8_general_ci;


COLLATE = utf8_general_ciに注意してください -これは、テキストフィールドの比較で大文字と小文字が区別されないことを意味します。

これでコード自体。 写真をサーバーにアップロードする場所に移動します。

/ *ユーザーがフィールド<input type = "text" value = "php、mysql、html、css" name = "tags">に入力したものを取得します* /
$ photo_tags = $ cms-> ValidatePostVar( 'tags' );


/ *次(私にとって)は、ダウンロードした画像に関する情報をデータベースに追加するコードです-ユーザーが入力した文字列としてタグが追加されるタグフィールドにのみ関心があります(許可された文字などを確認します。
sql_query( "INSERT INTO" 。$ prefix。 "_users_fun_photos(id、title、tags、cat_id、file、user_id、date、comments、views)VALUES(NULL、 '" 。$ photo_title。 "'、 '" 。$ photo_tags。 "'、1、'" 。$ Obj-> GetNewFileName()。 "'、'" 。$ Cms-> user_id。 "'、NOW()、0、0)" 、$ dbi);


/ *アップロードされた画像の投稿IDを取得します* /
$ generated_id = mysql_insert_id();


/ *そして、必要なパラメーターを使用して、ユーザーが入力したタグの処理関数を呼び出します* /
$ fun-> TagsDataInsert($ photo_tags、$ generated_id);


そしてここに魔法の関数自体があります:

関数TagsDataInsert($ photo_tags、$ photo_id)
{
グローバル$プレフィックス、$ dbi、$ section_folder、$ cms;

/ *画像へのタグの古いリンクを削除します-画像データの編集時に使用します。つまり、この関数は、編集した画像のタグの変更の保存処理にも使用されます* /
sql_query( "DELETE FROM„ 。$プレフィックス。 “ _users_fun_photos_tags_data WHERE photo_id = '" 。$ photo_id。 "'" 、$ dbi);

#ユーザーがタグを入力した場合-続行
if ($ photo_tags)
{
/ *入力されたタグの配列を作成* /
$ tags_array = explode( '、' 、$ photo_tags);
/ *スペースを削除します* /
array_walk($ tags_array、array($ this'trim_value' ));
/ *配列を調べて、タグテーブルにタグを追加します-そのようなタグが既に存在する場合-テキストフィールドを更新するだけです* /
foreach ($タグとしての $ tags_array)
{
sql_query( “ INSERT INTO„ 。$ prefix。 “ _users_tags(id、text)VALUES(NULL、 '” .adsl($ value )。 "')ON DUPLICATE KEY UPDATE text = '" .adsl($ value )。 "' ' " 、$ dbi);
/ * mysql_insert_id関数は、新しく作成されたキーだけでなく、更新されたキーのIDも返すという点で優れています* /
$ generated_tag_id = mysql_insert_id();
/ *リンクのテーブルにデータを書き込みます* /
sql_query( "INSERT INTO" 。$プレフィックス。 "_users_fun_photos_tags_data(photo_id、tag_id)VALUES( '" 。$ photo_id。 "'、 '" 。$ generated_tag_id。 "')" 、$ dbi);
}
}
}


フィールドからタグを追加しましょう
< 入力 タイプ =「テキスト」 =「php、mysql、html、css」 name =「タグ」 >


その結果、 user_tagsテーブルタグ自体とそのIDが含まれます



通信テーブルusers_fun_photos_tags_dataにはデータがあります



タグフィールドのusers_fun_photosテーブルには、文字列php、mysql、html、cssの形式のタグがあります



それでは、 タグフィールドのusers_fun_photosテーブルにデータを文字列として保存する理由について-
php、mysql、html、css


1-誰かがこれは正しくないと言うだろう-そしてある程度は正しいだろう-しかし、テーブルを結合する際に問題なく、このような画像を表示するときにタグを後で表示する方が簡単です:

if (!empty($ photo_tags))$ photo_tags = explode( '、' 、$ photo_tags);
$ smarty-> assign( 'photo_tags' 、$ photo_tags);

<div class = "tags" style = "color:#777777;" >タグ→{ foreach from = $ photo_tags item = item} <a title = "{$ item}" href = "index.php?section = Fun&file =検索とタグ= {$ item}» > {$ item} </a>、{/ foreach } </ div>


2.パラグラフ1からわかるように、タグ付きのレコードの検索は、 tag_idではなくタグのテキストによって実行されます 。 何のために? タグで画像を検索するスクリプトでは、タグクラウドのタグをクリックしたときにtag_idだけでなく、ユーザーが入力フィールドに目的のタグを入力したときにタグのテキストでも検索できます

/ *ここでは、データとタグIDを入力するか、テキストのみを取得します* /
$ tag = urldecode($ cms-> ValidateGetVar( 'tag' ));
$ get_tag_id =( int )$ cms-> ValidateGetVar( 'tag_id' );

/ *ここに入力内容のチェックがあります-最後に、IDではなくテキストが入力された場合はタグのIDを取得します。逆も同様です。
if ($タグ&&!$ get_tag_id)
{
$ res = sql_query( "SELECT id FROM„ 。$ prefix。 “ text = '" .adsl($タグ)。 "'" 、$ dbi);
リスト($ get_tag_id)= sql_fetch_row($ res);
}
else if (!$ tag && $ get_tag_id)
{
$ res = sql_query( "SELECT text FROM„ 。$ prefix。 “ _users_tags where id = '" 。$ get_tag_id。 "'" 、$ dbi);
リスト($タグ)= sql_fetch_row($ res);
}

/ *最終的には、とにかく、目的のタグを持つ画像の出力はtag_idによって行われます* /
$ res = sql_query( "SELECT SQL_CALC_FOUND_ROWS a.user_id、a.user_nick、b.id、b.title、b.tags、b.cat_id、b.file、b.dir、DATE_FORMAT(b.date、 '%d。 %m。%Y?%H:%i:%s ')、b.comments、b.views、b.points FROM„ 。$ prefix。 “ _users a、„ 。$ prefix。 “ _users_fun_photos b、„ 。$ prefix。 “ _users_fun_photos_tags_data c where b.id = c.photo_idおよびa.user_id = b.user_idおよびc.tag_id = '” 。$ get_tag_id。 "' order by b.id DESC limit" 。$ offset。 "、" 。 $ on_page。 "" 、$ dbi);


一般に、ポイント2とタグフィールドに文字列としてデータを保存することについては、:)

Source: https://habr.com/ru/post/J30799/


All Articles