「Codeigniter」トラックバック受信処理について使い方とサンプル
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Codeigniterトラックバック受信処理について使い方とサンプルをメモしました。
データベース作成
データベースを作成します。
手順
Mysqlにログインし、使用するデータベースへ移動します。
Mysqlにログイン
terminalmysql -u root -p
DBを選択
terminaluse test_db;
上記のデータベース(test_db)はサンプルです。
###テーブルを作成
トラックバックテーブルを作成します。
terminal
create table trackback (
id int(10) unsigned not null auto_increment,
entry_id int(10) unsigned not null default 0,
url varchar(200) not null,
title varchar(100) not null,
excerpt text not null,
blog_name varchar(100) not null,
state enum('info','checked') default 'info',
ip_address varchar(16) not null,
created datetime,
modified datetime,
primary key `id` (`id`),
key `entry_id` (`entry_id`)
);
テーブルの構造
カラム名 | 概要 |
---|---|
id | テーブルのidです。 |
entry_id | トラックバックを受信するページのidです。 |
url | トラックバック送信側のページのURLです。 |
title | トラックバック送信側のページのタイトルです。 |
excert | トラックバック送信側のページの記事の内容 |
blog_name | トラックバック送信側のページの名前です。 |
state | 「info」は確認前、「checed」は確認のような形のフラグです。 |
ip_address | トラックバック送信側のipaddresを保存します。 |
created | 新規登録時点の時間を保存します。 |
modified | 更新時の時間を保存します。 |
モデルの処理
モデルがないとコントローラー側でエラーになるので
先にモデルを作成します。
application/model/trackback_model.php<?php
class Trackback_model extends CI_Model{
function __construct(){
parent::__construct();
$this->load->database();
}
//idチェック関数
Public function id_check($id){
$query = $this->db->get_where('trackback',array('id' => $id),1);
if($query->num_rows > 0){
return true;
}else{
return false;
}
}
//DB保存
Public function insert($data){
$this->db->set($data);
return $this->db->insert('trackback', $this);
}
//trackback取得
Public function get_trackback (){
$query = $this->db->get('trackback');
if($query->num_rows > 0){
return $query->result_array();
}else{
return false;
}
}
}
?>
idチェック関数
get_where
のpost
は今回作成はしていませんが記事ページのデータベースになります。
記事の「d
が存在するかのチェックをしています。
DB保存
insert
の$data
はコントローラー側で加工しています。
$data
の配列を、先ほど作成したtrackback
DBへ保存しています。
trackback取得
get_trackback
ではtrackback
DBから保存してあるデータを取得します。
コントローラーの処理
コントローラーでは「Codeigniter」のトラックバッククラスを使用します。
今回のサンプルでは以下の形でトラックバックを受信します。
受信するパス
bash(ドメイン)/trackback/receive/(記事のid)
コントローラーの作成
application/controller/trackback.php<?php
class Trackback extends CI_Controller {
public function __construct() {
parent::__construct();
//モデルを読み込みます。
//application/models/trackback_model.php
$this->load->model('trackback_model');
$this->load->library('trackback');
}
public function receive ($id = null){
if(is_null($id) || $this->trackback_model->id_check($id)){
//もしページのidが存在しなかったらエラーを返します。
$this->trackback->send_error('エラーです。');
}
if ( ! $this->trackback->receive()){
$this->trackback->send_error("トラックバックデータに不正なデータが含まれます");
}
//エラーがなければDBに登録
$data = array(
'entry_id' => (int) $id,
'url' => urldecode ($this->trackback->data('url')),
'title' => urldecode ($this->trackback->data('title')),
'excerpt' => urldecode ($this->trackback->data('excerpt')),
'blog_name' => urldecode ($this->trackback->data('blog_name')),
'state' => 'info',
'ip_address' => $this->input->ip_address(),
'created' => date('Y-m-d H:i:s'),
'modified' => date('Y-m-d H:i:s')
);
$res = $this->trackback_model->insert($data);
if($res){
$this->trackback->send_success();
}else{
$this->trackback->send_error('登録できませんでした。');
}
}
//トラックバック表示ページ
public function info () {
$res = $this->trackback_model->get_trackback();
if($res){
echo '<table>';
foreach ($res as $lists){
echo '<tr>';
foreach ($lists as $list) {
echo '<td>'.htmlspecialchars($list, ENT_QUOTES, 'UTF-8', FALSE).'</td>';
}
echo '</tr>';
}
echo '</table>';
}else{
echo 'データがありません。';
}
}
}
?>
処理の解説
トラックバッククラスの読み込み
以下のコードでトラックバッククラスを読み込みます。
php$this->load->library('trackback');
エラーを返す
引数はメッセージです。
php$this->trackback->send_error('エラーです。');
トラックバックのチェック
正しい形式で送られてきたかチェックします。
php$this->trackback->receive();
トラックバックの成功を返す
トラックバック送信側に成功したメッセージを返します。
php$this->trackback->send_success();
トラックバックの表示
「info」メソッドではトラックバックが「trackback」DBに保存されていたら表示します。
表示するURL
bash(ドメイン)/trackback/info
コードはサンプルですので、「View」などを使用して任意に装飾してください。
最後に
今回のサンプルコードではトラックバック受信が実装する最低限のコードです。
最近では海外などから、不正に送信されるケースが多いため
実際に使用する際はipaddress
からの受信時の時間制限や、スパム登録の機能など
セキュリティー上考慮した上で実装してください。
参考文献
記事Article
もっと見る- article
Dockerの利用していないゴミを掃除しディスクスペースを解放するいくつかのやり方を紹介
- article
Next.js のバンドルサイズを可視化する@next/bundle-analyzer の紹介
- article
VSCodeでTypescriptファイルのimport補完で相対パスではなくエイリアスするための設定
- article
UUIDより短いユニークなIDを生成できるnpmライブラリnanoidの使い方
- article
【解決方法】TypeScript発生したTS2564 エラーの対処
- article
express で IP を取得する際などに利用する req.connection 非推奨(deprecated)の対処