https://github.com/kenjis/codeigniter-doctrine
https://stackoverflow.com/questions/33209930/how-to-install-doctrine-in-codeigniter-3
application/config/config.php でフックを有効にする
$config['enable_hooks'] = TRUE; // フック機能を有効にする
codeigniter/application/config/hooks.php に以下を追加
$hook['pre_system'][] = array(
'class' => 'Maintenance',
'function' => 'view_maintenance',
'filename' => 'Maintenance.php',
'filepath' => 'controllers/hooks' ,
);
codeigniter/application/controllers/hooks/Maintenance.php を新規作成
<?php
class Maintenance
{
public function __construct()
{
}
public function view_maintenance()
{
print <<< DOC_END
<h1>サーバーメンテナンス中</h1>
<h2>ただいまサーバーメンテナンス中です</h2>
DOC_END;
die;
}
}
$this->load->library('email');
$this->email->from('your@example.com', 'Your Name');
$this->email->to('someone@example.com');
$this->email->cc('another@another-example.com');
$this->email->bcc('them@their-example.com');
$this->email->subject('Email Test');
$this->email->message('Testing the email class.');
$this->email->send();
RubyonRails や Laravelの .env をCodeIgniterにも導入します。
これによって WEBアプリの設定が .env に集約されるので、 .gitignore しておけば余計な情報が リポジトリに上がることはありません。
codeigniter/application 以下にインストールします。
cd codeigniter/application
composer require vlucas/phpdotenv
エディタで下記の行を TRUE に設定します。
$config['composer_autoload'] = TRUE;
エディタで下記の行を TRUE に設定します。
$config['enable_hooks'] = TRUE;
エディタで hooks.php の一番下に下記の行を 追記します。
codeigniter/config/hooks.php
$hook['pre_system'] = function() {
try {
$dotenv = Dotenv\Dotenv::createImmutable(APPPATH);
// $dotenv = Dotenv\Dotenv::create(APPPATH); // こちらは Dotenv の古いバージョンのやり方です
$dotenv->load();
} catch (Exception $e) {
//
}
function env($variable, $default = null) {
$value = getenv($variable);
return ($value) ? $value : $default;
}
};
codeigniter/application/.env を新規作成し、以下の内容を適宜書き換えて保存します。
APP_NAME="My-Application"
APP_URL="http://localhost:8000/"
DB_DRIVER="mysqli"
DB_HOST="localhost"
DB_USER="root"
DB_PASS="root"
DB_NAME="ci"
MAIL_DRIVER="smtp"
MAIL_HOST="YOUR.SERVER"
MAIL_PORT=25
MAIL_USERNAME=""
MAIL_PASSWORD=""
MAIL_ENCRYPTION="tls"
MAIL_FROM_ADDRESS="YOUR@ADDRESS"
MAIL_FROM_NAME="YourName"
STRIPE_SECRET_KEY=""
STRIPE_PUBLIC_KEY=""
あとは好きなところから コントローラーから
print_r( env('APP_NAME') );
として使用します。
config/database.php の次の行を
'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => '',
'dbdriver' => 'mysqli',
↓ このように書き換えます
'hostname' => env('DB_HOST'),
'username' => env('DB_USER'),
'password' => env('DB_PASS'),
'database' => env('DB_NAME'),
'dbdriver' => env('DB_DRIVER'),
.env ファイルが codeigniterの application フォルダに入っている場合は、外から見えることはありません。
別の場所に移動させたい場合は .htaccess を次の内容で作成します。
require valid-user
<Files ~ "^.(htpasswd|htaccess|digest|env)$">
deny from all
</Files>
$this->load->driver('cache', array('adapter' => 'file'));
$cache_id = hash('sha256', $_SERVER['REQUEST_URI']);
if ( $html = $this->cache->get($cache_id) ){
echo $html;
echo "\n<!-- cached --> \n";
return;
}
// html 生成処理
$html = '..................';
// キャッシュを保存 60*60*24*7(sec) = 7日
$this->cache->save($cache_id, $html, 60*60*24*7);
例)config.php 内の base_url を
「本番環境」hogehoge.com/ 「テスト環境」devsite.com/test/preview01/ で切り替えます。
同様に database.php も書き換えます
if ( preg_match("/hogehoge\.com/", $_SERVER['HTTP_HOST']) ){
$config['base_url'] = 'https://hogehoge.com/';
} elseif ( preg_match("/devsite\.com//", $_SERVER['HTTP_HOST']) ){
$config['base_url'] = 'https://devsite.com/test/preview01/';
} else {
die('error [base_url] in config.php');
}
RewriteBase の 代わりに環境変数 REWRITE_BASE をセットして使用します .htaccess を以下のようにします。
RewriteEngine On
# 環境変数 REWRITE_BASE を振り分ける(本番環境 https://hogehoge.com/ )
SetEnvIf Host ^hogehoge.com$ REWRITE_BASE=/
# 環境変数 REWRITE_BASE を振り分ける(テスト環境 https://devsite.com/test/preview01/ )
SetEnvIf Host ^devsite.com$ REWRITE_BASE=/test/preview01/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ %{ENV:REWRITE_BASE}/index.php?/$1 [L]
CodeIgniterでコントローラーを継承させるには次のようにします
application/core/MY_Controller.php を作成します
例 : コアクラス Front_Controller() と Admin_Controller() を作る
class Front_Controller extends CI_Controller {
{
function __construct()
{
parent::__construct();
}
}
class Admin_Controller extends CI_Controller {
{
function __construct()
{
parent::__construct();
}
}
この時のファイル名 MY_Controller.php は決まっています。 変更すると読み込みエラーとなります。
どうしても変更したい場合は
ファイル application/config/config.php の 117行目あたり
$config['subclass_prefix'] = 'MY_';
を変更すると、MY_ の部分は好きなを文字列に変換することができます。 (後ろの Controller は変更することができないようです)
コントローラーから継承するには簡単です。
通常下記のようなコードになっているところを
class Mm_login extends CI_Controller {}
下記のように変更するだけです
class Mm_login extends MY_Controller {}
codeigniter用の認証ライブラリーは ion-Auth が有名ですが、community-auth-for-codeigniter-3 をインストールして使用してみます
git clone https://bitbucket.org/skunkbad/community-auth-for-codeigniter-3.git
community_auth/ ディレクトリが作成されその中に一式ファイルがコピーされます
community_auth/ ディレクトリを
自分のサーバーのcodeigniter/application/third_party
にアップロードします
./third_party/community_auth/sh/.install.sh実行します。
・bashのパスを適宜書き換えること
・.install.sh に実行権限を与えること
config/config.php の以下の行を TRUE に変更
$config['enable_hooks'] = TRUE;
config/routes.php に以下の行を追加
$route[LOGIN_PAGE] = 'examples/login';
config/hooks.php に以下の行を追加
$hook['pre_system'] = array(
'function' => 'auth_constants',
'filename' => 'auth_constants.php',
'filepath' => 'hooks'
);
$hook['post_system'] = array(
'function' => 'auth_sess_check',
'filename' => 'auth_sess_check.php',
'filepath' => 'hooks'
);
MySQLから新しいデータベースを作成し、そのデータベース内で third_party/community_auth/sql/install.sql を実行する
*config.database.php データベースへのアクセス方法を記述しておく
key_creator コントローラーを実行して暗号化方式を決定し、暗号キーを作成する
http://あなたのサーバー名/key_creator
次のような画像のような画面になるので暗号化方式を選択する
ここでは Blowfish (448 bit) を選択する
$config['encryption_key'] = hex2bin('103b81f7020bd1945e9c34e4b0432dc303570e492608afe212bfc7e47ab15520daedff6f05142713ba32a687a24b6489de29769578b3aed8');
選択すると↑のような文字列が表示されるので、コピーして
config/config.phpの328行目あたり に記述します。
また config/config.phpの391行目あたり の sess_save_path を設定します
$config['sess_save_path'] = 'セッション保存パス';
といった感じで導入までは完了です。 ざっと使った感想としてはionauth の方が良さそうです。
codeigniterのフックポイントを使用するには
$config['enable_hooks'] = TRUE;
$hook['post_controller_constructor'][] = array(
'class' => 'Cachecontrol',
'function' => 'set_cache_on',
'filename' => 'Cachecontrol.php',
'filepath' => 'controllers/hooks' , // application からの相対パス。(デフォルトは hooks。他者に見落とされないよう controllers/hooks に置くのもありです)
);
<?php
class Cachecontrol
{
public function __construct()
{
$this->CI = &get_instance();
}
public function set_cache_on()
{
echo'Hook Test !!!';
}
}
フックポイント | 説明 |
---|---|
pre_system | システム実行中の非常に早い段階で呼び出されます。ベンチマーククラスと フッククラスだけがこの時点でロードされています。ルーティングや 他のプロセスは実行されていません。 |
pre_controller | いずれかのコントローラが呼び出される直前に呼び出されます。 すべての基本クラス、ルーティング、およびセキュリティチェックは実行済みです。 |
post_controller_constructor | コントローラがインスタンス化された直後に、 しかしメソッド呼び出しをする前に呼び出されます。 |
post_controller | コントローラの実行が完全に終わった直後に呼び出されます。 |
display_override _display() | メソッドをオーバーライドします。システム実行の最後で ウェブブラウザに確定ページを送信するために使用されるものです。これにより 独自の方法による表示が可能になります。 CI スーパーオブジェクトへの参照が $this->CI =& get_instance() により必要となること、 そして確定データは $this->CI->output->get_output() を呼び出すことによって利用できるようになることを覚えておいてください。 |
cache_override | 出力ライブラリの _display_cache() メソッドのかわりに独自のメソッドを呼び出すことができます。これにより、 独自のキャッシュ表示機構を使用できるようになります。 |
post_system | 最終的にレンダリングされるページがブラウザに送られた後、 つまりブラウザに確定データが送信されシステム実行が終了する時に 呼び出されます。 |
https://www.codeigniter.com/download
アップロードしたディレクトリ内にあるindex.php を好きな位置に移動させる
RewriteBase / のところをインストールするディレクトリに書き換えます。
ファイル名を .htaccess として index.php と同じディレクトリにアップロード
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/system.*
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{REQUEST_URI} ^/application.*
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
index.phpの下記を index.php から見た system/ディレクトリ application/ ディレクトリに書き換える
// 100行目あたり
$system_path = 'system';
// 117行目あたり
$application_folder = 'application';
// URL を指定する
$config['base_url'] = 'http://aaa.bbb.ccc.com/dddd/';
// index.php を削除する
$config['index_page'] = '';
codeigniterでCSRFプロテクション機能の概要は以下の通りです
codeigniter/application/config/config.php の以下の行を変更する
$config['csrf_protection'] = TRUE;
コントローラ test/index → test/confirm 画面遷移でCSRFprotectionが有効なことを確認します
codeigniter/application/cotrollers/Test.php に以下のメソッドを追加します
public function index() {
$data = array();
$data['csrf_token_name'] = $this->security->get_csrf_token_name();
$data['csrf_token_hash'] = $this->security->get_csrf_hash();
$html = $this->twig->render('form.html', $data);
echo $html;
}
public function confirm(){
echo 'ok';
}
twig テンプレートファイル form.html は以下のように作成しておきます
<html>
<body>
<form action="/test/confirm" method="post">
<input type="hidden" name="{{csrf_token_name}}" value="{{csrf_token_hash}}">
<input type="submit">
</form>
</body>
</html>
この状態でコントローラー test/index にアクセスすると formの hidden
<input type="hidden" name="csrf_test_name" value="7c195574347b1a4888d7f3bf4bd6331d">
がセットされているはずです。これがCSRF対策のトークンとなります。
ここの値をchromeなどで書き換えて送信するとエラーとなることが確認できます。
こちらからAPIキーを発行します(追加方法は割愛します。) https://apps.twitter.com/
composerからインストールします。
CodeIgniterで利用する場合は application ディレクトリに移動してから次のコマンドを実行します。
ターミナルから以下を実行
composer require abraham/twitteroauth
PHPから以下のように読み込みます
require "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
または codeigniter の codeigniter/application/config/config.php の下記項目を TRUE にします。
$config['composer_autoload'] = TRUE;
codeigniterの controllers に Oauth.php を以下のように作成します
codeigniter/application/controllers/Oauth.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');
use Abraham\TwitterOAuth\TwitterOAuth;
class Oauth extends CI_Controller
{
public function __construct(){
parent::__construct();
$this->load->library('session');
$this->load->helper('url');
define('CONSUMER_KEY', 'XXXXX');
define('CONSUMER_SECRET', 'YYYYY');
define('OAUTH_CALLBACK', 'http://zzz.zzz.zzz/oauth/twitter_callback');
}
public function twitter()
{
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
$request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));
$this->session->set_userdata('oauth_token', $request_token['oauth_token']);
$this->session->set_userdata('oauth_token_secret', $request_token['oauth_token_secret']);
$url = $connection->url('oauth/authenticate', array('oauth_token' => $request_token['oauth_token']));
redirect($url);
}
public function twitter_callback()
{
$session = $this->session->userdata();
$q = $this->input->get(null, true);
$request_token = array();
$request_token['oauth_token'] = $session['oauth_token'];
$request_token['oauth_token_secret'] = $session['oauth_token_secret'];
if (isset($_REQUEST['oauth_token']) && $request_token['oauth_token'] !== $_REQUEST['oauth_token']) {
die('Error!');
}
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $request_token['oauth_token'], $request_token['oauth_token_secret']);
$access_token = $connection->oauth("oauth/access_token", array("oauth_verifier" => $q['oauth_verifier']));
$this->session->set_userdata('access_token', $access_token);
session_regenerate_id();
redirect('mypage');
}
}
http://zzz.zzz.zzz/oauth/twitter/ へアクセスします
Twitterのサイトで認証が終わると http://zzz.zzz.zzz/oauth/twitter_callback/ へ戻ってきます。
アクセストークンを セッション変数 $_SESSION['access_token'] に保存した後、
http://zzz.zzz.zzz/mypage/ へリダイレクトします。
codeigniterの controllers に Mypage.php を以下のように作成します
codeigniter/application/controllers/Mypage.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');
use Abraham\TwitterOAuth\TwitterOAuth;
class Mypage extends MY_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library('session');
$this->load->helper('url');
define('CONSUMER_KEY', 'XXXXXXXXXXXXXXX');
define('CONSUMER_SECRET', 'YYYYYYYYYYYYYYYYYYYY');
}
public function index()
{
//twitter認証
$consumerKey = CONSUMER_KEY;
$consumerSecret = CONSUMER_SECRET;
$accessToken = $_SESSION['access_token']['oauth_token'];
$accessTokenSecret = $_SESSION['access_token']['oauth_token_secret'];
//TwitterOAuth認証
// require_once 'twitteroauth/twitterOAuth.php';
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
// ・自身の情報取得
$account_settings = $connection->get("account/settings");
print_r( $account_settings );
}
}
参考リンク :
https://twitteroauth.com/
https://developer.twitter.com/en/docs/api-reference-index
https://syncer.jp/Web/API/Twitter/REST_API/
$this->load->database();
$insert_hash = array(
'user_name' => '山田 太郎' ,
);
$this->db->insert('my_table', $insert_hash);
$inserted_id = $this->db->insert_id();
$last_sql = $this->db->last_query();
検索条件 : delete_flg = 0
ソート順 : customer_idが小さい順
$this->load->database();
// 設定
$page = 1;
$limit = 20;
$order = 'customer_id ASC';
$hash = array(
'delete_flg' => 0 ,
);
$table_name = 'my_table';
// 件数を取得
$this->db->where($hash);
$total_rows = $this->db->count_all_results($table_name);
// データを取得
$start = $limit * ($page - 1);
$this->db->order_by($order);
$query = $this->db->get_where($table_name, $hash, $limit, $start);
$loop = @$query->result_array();
条件(data_id = 1)
$this->load->database();
$query = $this->db->get_where('my_table', array(
'data_id' => 1 ,
), 1, 0);
$hash = @$query->result_array()[0];
$this->db->where('id', $id);
$this->db->delete('my_table');
例
$this->load->database();
$sql = 'DROP TABLE IF EXISTS my_table';
$query = $this->db->query($sql);
echo $query->result_array();
$array = array('name' => 'hoge');
$this->db->where($array);
$array = array('title' => 'fuga');
$this->db->where($array);
生成されるSQL
WHERE name = 'hoge' AND title = 'fuga'
$array = array('name' => 'hoge');
$this->db->where($array);
$array = array('title' => 'fuga');
$this->db->or_where($array);
生成されるSQL
WHERE name = 'hoge' OR title = 'fuga'
$where = "user_code_name = " . 'BINARY '.$this->db->escape($user_code_name);
$query = $this->db->get_where('my_table', $where, 1, 0);
実行されるSQL
SELECT * FROM `my_table` WHERE user_code_name = BINARY 'H123546789abc' LIMIT 1
$like = array( 'title_name' => 'mail' );
$this->db->like($like);
$like = array( 'content_name' => 'mail' );
$this->db->or_like($like);
生成されるSQL
WHERE "title_name" LIKE '%mail%' ESCAPE '!'
OR "content_name" LIKE '%mail%' ESCAPE '!'
$v = '%%%';
$v = $this->db->escape_like_str($v);
$where = "(title_name like '%{$v}%' OR content_name like '%{$v}%' )";
$this->db->where($where);
生成されるSQL
WHERE ("title_name" like '%!%!%!%%' OR "content_name" like '%!%!%!%%' )
$this->db->like('title', 'match', 'before'); // 次を生成: WHERE `title` LIKE '%match' ESCAPE '!'
$this->db->like('title', 'match', 'after'); // 次を生成: WHERE `title` LIKE 'match%' ESCAPE '!'
$this->db->like('title', 'match', 'both'); // 次を生成: WHERE `title` LIKE '%match%' ESCAPE '!'
$this->db->order_by('title DESC, name ASC');
$this->db->select("item_dt.*, category_dt.category_name as C_category_name");
$this->db->join('category_dt', 'category_dt.category_id = item_dt.category_id', 'left');
$query = $this->db->get_where("item_dt", array('item_dt.data_id' => 123456 ));
$update_hash = array();
$this->db->where('admin_id', $admin_hash['admin_id'] );
$this->db->update('my_table', $update_hash);
$this->db->hostname
$this->db->username
$this->db->password
$this->db->database
$sql = "select count(*) AS COUNT from `information_schema`.`tables` where `table_schema` = '" . $this->db->database . "'";
$query = $this->db->query($sql);
$hash = $query->result_array()[0];
$rows = $this->db->affected_rows()
echo $rows;
$last_sql = $this->db->last_query();
echo $last_sql;
https://github.com/benedmunds/CodeIgniter-Ion-Auth
codeigniter用シンプルな認証ライブラリーです。
viewファイルもついてくるのでインストールするだけですぐ使えます。
シンプルな作りになっているので sqlite でも使用することができます
ターミナルから以下のようにしてインストールします
cd codeigniter/application/third_party
mkdir benedmunds
cd benedmunds
git clone https://github.com/benedmunds/CodeIgniter-Ion-Auth.git
apprication/config/autoload.php 42行目あたり を以下のように変更する。
$autoload['packages'] = array(APPPATH.'third_party/benedmunds/CodeIgniter-Ion-Auth');
codeigniter/application/third_party/benedmunds/CodeIgniter-Ion-Auth/sql/ の中にデータベース作成SQLがあるので
実行してテーブルを作成します
実行が完了すると以下のテーブルができます
・groups
・users
・users_groups
・login_attempts
テーブル名の先頭に接頭辞「 ion_ 」をつけたい場合はこちらのsqlファイルをダウンロードして実行します。
https://pgmemo.tokyo/data/filedir/1075_1.zip
接頭辞を変更したい場合はダウンロード後「 ion_ 」を適宜書き換えてください
codeigniter/application/third_party/benedmunds/CodeIgniter-Ion-Auth/config/ion_auth.php のテーブル名も変更します
次の3項目の値を確認する。
$config['base_url'] = 'http://xxx.yyy.zzz/aaaa/';
$config['sess_save_path'] = APPPATH.'session/';
$config['language'] = 'japanese';
また、もし可能なら `
application/session`
ディレクトリの権限を「0700」に設定しておく
ここからインストールします
https://github.com/NEKOGET/ci_language
config/database.php にデータベースの設定を記述する
codeigniter/application/third_party/benedmunds/CodeIgniter-Ion-Auth/controllers/Auth.phpを
codeigniter/application/controllers/ ディレクトリにコピーして動作させてみる
http://あなたのサーバー/auth/
で起動する
ログイン id ,pass はデフォルトで
Username: admin@admin.com
Password: password
となっているので、こちらを利用してログインを確認します。
こちらのライブラリを使用します。
https://www.phpclasses.org/package/10041-PHP-Manage-the-access-of-CodeIgniter-users-using-ACL.html
application/config/routes.php で エラー時の
routes.php 内に以下を記述
$route['404_override'] = 'mycon/error_404';
Mycon.php 内に以下を記述(例)
function error_404() {
$this->output->set_status_header('404');
$html = $this->twig->render('404.html');
echo $html;
}
CodeIgniterで INSERT, UPDATE時に 現在時刻を指定するやり方
$this->db->set('my_date', 'NOW()', FALSE);
$this->db->update('my_table');
$this->load->helper('date');
$update_data = array();
$update_data['my_date'] = unix_to_human( now(), TRUE, 'eu' );
$this->db->update('my_table', $update_data);
PHPのフレームワークCodeIgniterで出力画面(ウェブページ)キャッシュを使用する方法とTips。
// 分数で指定します
$this->output->cache( 60*24 ); // 60 * 24 = 1日
標準のビューを使用している場合はこれだけで出力画面のキャッシュが生成されます。 キャッシュの生存時間を過ぎると自動的に消去されます。
テンプレートエンジンを使用している場合は、テンプレートの出力を $html に保存しておき、
$this->output->set_output($html);
$this->output->cache(60*24*3);
でOKです。
config.phpの以下の項目を設定します (設定例)
$config['cache_path'] = FCPATH.'cache_codeigniter/'; // index.php と同じ階層の cache_codeigniter ディレクトリに保存する。
$config['cache_query_string'] = FALSE; // ? 以降のクエリー文字を無視する
ウェブページキャッシュが存在する場合はコントローラーのメソッドを通る前にキャッシュを表示して終了する、のでキャッシュを削除するには別メソッドから行うほうが使い勝手がいいと思われます。
// /foo/bar のキャッシュを削除する
$this->output->delete_cache('/foo/bar');
ログの設定は config.php で以下のパラメータ指定になっています
0 = Disables logging, Error logging TURNED OFF
1 = Error Messages (including PHP errors)
2 = Debug Messages
3 = Informational Messages
4 = All Messages
ここではログスレッショルドに「2」を設定します。
$config['log_threshold'] = 2;
すると、ファイルキャッシュ生成時に `
codeigniter/application/logs/log-XXXXX.php`
に以下のようなログが記録されます
DEBUG - 2016-05-17 20:20:46 --> Cache file written: cache_codeigniter/1821935daa9207253aa5d75940e22e16
確認が終わったらログスレッショルドを戻しておきましょう。
// ページURI, キャッシュID(ファイル名のみ), キャッシュファイル名(フルパス)
list($uri, $cache_id, $cache_path) = $this->_get_cache_path();
private function _get_cache_path(){
$CI =& get_instance();
$path = $CI->config->item('cache_path');
$cache_path = ($path === '') ? APPPATH.'cache/' : $path;
$uri = $CI->config->item('base_url').$CI->config->item('index_page').$CI->uri->uri_string();
if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])){
if (is_array($cache_query_string)){
$uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string)));
}
else{
$uri .= '?'.$_SERVER['QUERY_STRING'];
}
}
$cache_id = md5($uri);
$cache_path .= $cache_id;
return array($uri, $cache_id, $cache_path);
}
$this->load->helper('url');
echo site_url();
echo base_url();
http://あなたのサーバ名/PATH/TO/DIR/index.hphp
http://あなたのサーバ名/PATH/TO/DIR/
base_url は config/config.php で設定した値が返る
http://xxx.yyy.zzz/test/ にアクセスした時
$now_class_method = $this->router->fetch_class().'/'.$this->router->fetch_method(); // test/index が入ります
$now_class_method = uri_string(); // test が入ります
http://xxx.yyy.zzz/test/mymethod にアクセスした時
$now_class_method = $this->router->fetch_class().'/'.$this->router->fetch_method(); // test/mymethod が入ります
$now_class_method = uri_string(); // test/mymethod が入ります
BASEPATH APPPATH SELF FCPATH(フロントコントローラーパス) です。
echo('BASEPATH : ' . BASEPATH."\n");
echo('APPPATH : ' . APPPATH."\n");
echo('SELF : ' . SELF."\n");
echo('FCPATH : ' . FCPATH."\n");
BASEPATH : /home/my_project/codeigniter/system/
APPPATH : /home/my_project/codeigniter/application/
SELF : index.php
FCPATH : /home/my_project/
です。( my_project にインストールされている場合)
CodeIgniterで開発中にあるクラスだけパスワード認証をかけたい、または簡易なログイン画面を付けたい場合があります。
その時は以下のライブラリ【Minimal_auth.php】を用意するといいでしょう。
CodeIgniterのセッションを利用して超簡易パスワード認証をつけることができます。
SHA-256でハッシュしていますので、Basic認証、Digest認証の代わりにどうぞ。
またロボット対策として動的にhiddenを生成して送っています。
application/libraries``` にファイル名
Minimal_auth.php`
として保存<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Minimal_auth {
private $CI;
private $_login_flag = false;
public function __construct(){
$this->CI =& get_instance();
$this->CI->config->load('minimal_auth');
$this->CI->load->library('session');
}
public function view_login($flag=''){
$sess = $this->CI->session->all_userdata();
$err_mess = '';
if (strcmp($flag,'error')==0){
$err_mess = 'ログインエラーです。';
}
print <<< DOC_END
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/sha256.js"></script>
<script>
function make_hidden(e,n,d){var m=document.createElement("input");m.type="hidden",m.name=e,m.value=n,d?document.forms[d].appendChild(m):document.forms[0].appendChild(m)}
</script>
<style type="text/css">
*{
font-size:12px;
font-family: serif;
}
</style>
</head>
<body>
{$err_mess}
<form method="post" action="{$sess['login_url']}" onsubmit="return false;" >
<h1>パスワードを入力してください。</h1>
<input type="password" id="in_text" name="in_text">
<input type="button" value="送信" onclick="var v = document.getElementById('in_text').value; v = CryptoJS.SHA256(v); make_hidden('apb',v); document.getElementById('in_text').value=''; this.form.submit();">
</form>
</body>
</html>
DOC_END;
}
public function login_submit(){
$password_sha256 = hash( 'sha256', $this->CI->config->item('admin_password') );
if (strcmp($password_sha256, $this->CI->input->post('apb') )==0 && ( strcmp($this->CI->input->post('apb'),'') != 0 ) ){
$sess = $this->CI->session->all_userdata();
$session['_login_flag'] = true;
$this->CI->session->set_userdata($session);
redirect( $sess['jump_to'] );
exit();
}
else{
$this->view_login('error');
exit();
}
}
public function login( $login_url, $jump_to ){
$sess = $this->CI->session->all_userdata();
if ( @$sess['_login_flag'] == true ){
return;
}
elseif ( preg_match('/login_submit/', uri_string() ) ){
$this->login_submit();
}
else{
$session['login_url'] = $login_url;
$session['jump_to'] = $jump_to;
$session['_login_flag'] = false;
$this->CI->session->set_userdata($session);
$this->view_login($login_url);
exit();
}
}
}
application/config``` にファイル名
minimal_auth.php`
として保存<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['admin_password'] = 'hogehoge';// パスワード(適宜変更すること)
`
application/controllers/Admin.php`
) に以下を追加 public function __construct(){
// コンストラクタに以下の2行を追加
$this->load->library('minimal_auth');
$this->minimal_auth->login( site_url("admin/login_submit"), (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] );
}
// 以下のメソッドを追加(中身は空でいいです。 クラス名やメソッド名を変更した場合は上の「admin/login_submit」も変更すること)
public function login_submit(){
}
以上で /index.php/admin/ 以下の任意のメソッドにパスワード認証がつきます。
なおパスワード有効期間はセッション有効期間ですので
```
$config['sess_expiration'] = 60*60*24; // セッションを終了させたい秒(例:24時間)。
$config['sess_save_path'] = APPPATH.'session'; // セッション保存ディレクトリ(例:application/session/)。
$config['sess_match_ip'] = TRUE; // セッションのIPアドレス照合(例:照合する)。
$config['sess_time_to_update'] = 60*5; // セッションID更新秒(例:5分)。
```
PHPフレームワーク【CodeIgniter3】とテンプレートエンジン【Twig】でサイトを多言語化する方法を考えてみます。
日本語版と英語版を作るとして、サイトのURLは一番上のパスで「ja」「en」というふうに分ける
http://foo.bar/ja/class/method/arg1/
http://foo.bar/en/class/method/arg1/
といった構成にしてみます。
application/config/routes.php
内に以下のように記述
$route['([a-z]{2,3})/(.+)/(.+)/(.+)'] = "$2/$3/$4/$1";
(正規表現が使えます。便宜上 .+ としていますが、使用するクラス,メソッド名の命名法則にそって狭めた([a-z]+ など)ほうがいいと思います。)
こうすることで
/ja/myclass/mymethod/aaa
↓
/myclass/mymethod/aaa/ja // 【myclass】クラスの【mymethod】メソッドに引数【('aaa’, 'ja')】でアクセス
に変更されます。
英語の言語ファイル `
application/language/english/mycode_lang.php`
を以下のように作成する
<?php
$lang['helo'] = "Hello ! World !!!";
日本語の言語ファイル `
application/language/japanese/mycode_lang.php`
を以下のように作成する
<?php
$lang['helo'] = "ようこそ! 世界 !!!";
コントローラーのメッソッドの第2引数に「ja」または「en」が渡ってきますのでそこで処理します。
public function mymethod($arg, $lang_flag='ja'){
// 言語データを受け取る
$lang = $this->_set_lang($lang_flag);
print $data['helo'];
}
private function _set_lang($lang_flag='ja'){
if ( strcmp($lang_flag, 'ja')==0 ){
$lang = $this->lang->load('mycode', 'japanese', TRUE);
}
elseif ( strcmp($lang_flag, 'en')==0 ){
$lang = $this->lang->load('mycode', 'english', TRUE);
}
else{
die("_set_lang error : unknown language -> {$lang_flag}");
}
return $lang;
}
これで 「ja」のときは「ようこそ! 世界 !!!」 「en」のときは「Hello ! World !!!」 と表示されるようになります。
参考 : http://goo.gl/ly9JhY
CodeIgniterでActiveRecordを使ってSQLite3へ現在時刻をINSERTするには以下のようにします。
$data = array(
'user_name' => ’ユーザー名’ ,
);
$this->load->database();
$this->db->set('modified_date', "datetime('now', 'localtime')", FALSE);
$this->db->insert('my_table', $data);
CodeIgniterはPHPフレームワークの中でも比較的シンプルでフレームワーク初学者にはCakePHPよりおすすめします。 動作も高速です。
composer.json
contributing.md
license.txt
readme.rst
user_guide(フォルダ)
サーバの任意のディレクトリ(この場合では ~/php_composer/ )へcomposerをインストールします。
cd ~/php_composer/
curl -sS https://getcomposer.org/installer | php
(インストール後に composer.phar のパスが表示されます。これがcomposerコマンドの場所です。)
.bash_profileなどにパスを追加 vi などで下記の行を追加します。
PATH="$PATH":~/php_composer/
bach を再起動したら「CodeIgniter Composer Installer」を使ってCodeIgniterをインストールします。
■ CodeIgniter Composer Installer https://github.com/kenjis/codeigniter-composer-installer
CodeIgniterをインストールしたディレクトリから以下を実行
composer.phar create-project kenjis/codeigniter-composer-installer codeigniter
$route['default_controller'] = 'welcome';
この行の 'welcome' を 'top' に変更します。
$route['default_controller'] = 'top'; // welcome → top に変更
ファイル名は「Top.php」(先頭は大文字)でなければいけません。
中身は以下のようにします。(クラス名「Top」先頭は大文字でなければいけません)
<?php
class Top extends CI_Controller {
public function index()
{
$this->load->view('topview');
}
}
とします。
拡張子は .php ですが 中身はHTMLファイルなので以下の様な内容にします。
<html>
<body>
<h1>test</h1>
</body>
</html>
ここで
http://localhost/codeigniter/index.php/Top
にアクセスしてテンプレートが表示されることを確認します。
今回 データベースにはsqlite3 を使用してみます。
$active_group = 'default';
$query_builder = TRUE;
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => APPPATH.'sqlite3/test.sqlite3',
'dbdriver' => 'sqlite3',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
$config['migration_enabled'] = TRUE; // FALSE → TRUE に変更
$config['migration_type'] = 'sequential'; // マイグレーション管理を「日付」→「連番」に変更
$config['migration_version'] = 1; // 現在のバージョン
<?php
class Migration_Create_table extends CI_Migration {
public function __construct(){
parent::__construct();
}
public function up(){
$this->dbforge->add_field(array(
'data_id' => array(
'type' => 'INT',
'unsigned' => TRUE,
'auto_increment' => TRUE
),
'user_name' => array(
'type' => 'VARCHAR',
),
'modified_date' => array(
'type' => 'TEXT',
),
));
$this->dbforge->add_key('data_id', true);
$this->dbforge->create_table('user_dt');
}
public function down(){
$this->dbforge->drop_table('user_dt');
}
}
↑このファイルはSQL文で言うところの
CREATE TABLE mandolin_chord_dt (
data_id integer PRIMARY KEY NOT NULL,
user_name varchar NOT NULL,
modified_date text
);
になります。
<?php
class Migrate extends CI_Controller
{
public function index(){
$this->load->library('migration');
if ($this->migration->current() === FALSE){
show_error($this->migration->error_string());
}
}
}
codeigniter/application/sqlite3/test.sqlite3 が作成されていることを確認します
またテーブルも正しく作成されているかどうか確認します
codeigniterはデータベースへのアクセスクラスを持っています。 使い方は以下のとおり( test_dt から全件取得し表示する例。)
$this->load->database();
$this->db->from('test_dt');
$this->db->select('*');
$query = $this->db->get();
$data_loop = $query->result_array();
print_r($data_loop);
system/core/CodeIgniter.php
にバージョン記述があります。
CodeIgniter 3.0でPHPUnitを使う post http://blog.a-way-out.net/blog/2015/05/19/ci-phpunit-test/