軽量高速なPHPフレームワーク。動作条件がCodeIgniter3ならPHP5.6、CodeIgniter4ならPHP7.3なので少し前のサーバ環境でも問題なく動作します。
No.1945
01/18 18:06

edit

CodeIgniter で 一時的にメンテナンスモードにする

● CodeIgniter で 一時的にメンテナンスモードにする

*1. フックを有効にする

application/config/config.php でフックを有効にする

$config['enable_hooks'] = TRUE; // フック機能を有効にする

*2. フックを設定する

codeigniter/application/config/hooks.php に以下を追加

$hook['pre_system'][] = array(
  'class'     => 'Maintenance',
  'function'  => 'view_maintenance',
  'filename'  => 'Maintenance.php',
  'filepath'  => 'controllers/hooks' , 
);

*3. メンテナンス中表示クラスを作成する

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;
    }
}
No.1723
03/23 13:48

edit

CodeIgniterで DBからランダムでデータを取り出す

$this->db->order_by('rand()');
No.1623
11/16 22:19

edit

CodeIgniterでメール送信する

● CodeIgniterでメール送信する

$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();
No.1586
09/07 20:55

edit

PHPフレームワーク CodeIgniterに .env を導入する

RubyonRails や Laravelの .env をCodeIgniterにも導入します。
これによって WEBアプリの設定が .env に集約されるので、 .gitignore しておけば余計な情報が リポジトリに上がることはありません。

● vlucas/phpdotenv のインストール

codeigniter/application 以下にインストールします。

cd codeigniter/application
composer require vlucas/phpdotenv

● config/config.php の composer_autoload を TRUE にする

エディタで下記の行を TRUE に設定します。

$config['composer_autoload'] = TRUE;

● config/config.php の enable_hooks を有効にする

エディタで下記の行を TRUE に設定します。

$config['enable_hooks'] = TRUE;

● codeigniter/config/hooks.php に .env ファイル読み込み部分を追加

エディタで 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;
    }
};

● .env ファイルを用意する

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 ファイルから .env を参照する

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 ファイルをブラウザから見えないようにする

.env ファイルが codeigniterの application フォルダに入っている場合は、外から見えることはありません。
別の場所に移動させたい場合は .htaccess を次の内容で作成します。

require valid-user
<Files ~ "^.(htpasswd|htaccess|digest|env)$">
    deny from all
</Files>

引用元 : https://github.com/jagroop/codeigniter-artisan

No.1197
01/20 14:36

edit

CodeIgniter
composer

CodeIgniterのファイルキャッシュ

$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);
No.1192
01/27 23:29

edit

CodeIgniter

codeIgniter で ファイルを変更せずにテスト環境と本番環境を切り替える

● config/config.php 内の記述を「本番環境」「テスト環境」で切り替える

例)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');
}

● .htaccess の mod_rewrite の rewrite_base を「本番環境」「テスト環境」で切り替える

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]
No.1190
01/16 20:56

edit

CodeIgniter

CodeIgniterでcontrollerを継承させる

CodeIgniterでコントローラーを継承させるには次のようにします

● 1. 継承元となるクラスを作成する

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 は変更することができないようです)

● 2. コントローラーから継承する

コントローラーから継承するには簡単です。
通常下記のようなコードになっているところを

class Mm_login extends CI_Controller {}

下記のように変更するだけです

class Mm_login extends MY_Controller {}
No.1150
02/27 17:55

edit

CodeIgniter

community-auth-for-codeigniter-3のインストール

● codeigniter用の認証ライブラリー community-auth-for-codeigniter-3

codeigniter用の認証ライブラリーは ion-Auth が有名ですが、community-auth-for-codeigniter-3 をインストールして使用してみます

● 1. git clone してファイルを取得

git clone https://bitbucket.org/skunkbad/community-auth-for-codeigniter-3.git

community_auth/ ディレクトリが作成されその中に一式ファイルがコピーされます

● 2. 自分の環境にコピー

community_auth/ ディレクトリを
自分のサーバーのcodeigniter/application/third_party
にアップロードします

● 3. インストールスクリプトを実行する

./third_party/community_auth/sh/.install.sh実行します。

・bashのパスを適宜書き換えること
・.install.sh に実行権限を与えること

● 4. config を変更します

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'
);

● 5. データベースを作成する

MySQLから新しいデータベースを作成し、そのデータベース内で third_party/community_auth/sql/install.sql を実行する

● 6. コードイグナイターからデータベースを使用できるように設定する

*config.database.php データベースへのアクセス方法を記述しておく

● 7. 暗号化方式を決定する

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'] = 'セッション保存パス';

● 8 サンプルページへアクセスする

http://あなたのサーバー名/examples

といった感じで導入までは完了です。 ざっと使った感想としてはionauth の方が良さそうです。

添付ファイル1
No.1148
06/02 15:17

edit

添付ファイル

CodeIgniter

codeigniterのフックポイント

● codeigniterのフックポイント

codeigniterのフックポイントを使用するには

1. ファイル application/config/config.phpenable_hooksを有効にします。

$config['enable_hooks'] = TRUE;

2. application/config/hooks.phpに記述します

$hook['post_controller_constructor'][] = array(
  'class'     => 'Cachecontrol',
  'function'  => 'set_cache_on',
  'filename'  => 'Cachecontrol.php',
  'filepath'  => 'controllers/hooks' ,        // application からの相対パス。(デフォルトは hooks。他者に見落とされないよう controllers/hooks に置くのもありです)
);

3. 以下のようにクラスを作成します。

<?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最終的にレンダリングされるページがブラウザに送られた後、 つまりブラウザに確定データが送信されシステム実行が終了する時に 呼び出されます。
No.1147
11/24 13:24

edit

CodeIgniter

codeigniterのインストールからhello world までの手順

● 1. CodeIgniterをダウンロードしディレクトリを丸ごとアップロードする

https://www.codeigniter.com/download

● 2. index.php を移動させる

アップロードしたディレクトリ内にあるindex.php を好きな位置に移動させる

● 3. .htaccessをアップロードしURLに 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]

● 4. index.php 内のパスを書き換える

index.phpの下記を index.php から見た system/ディレクトリ application/ ディレクトリに書き換える

// 100行目あたり
	$system_path = 'system';

// 117行目あたり
	$application_folder = 'application';

● 5. config/config.php を設定する

// URL を指定する
$config['base_url'] = 'http://aaa.bbb.ccc.com/dddd/';

// index.php を削除する
$config['index_page'] = '';

● 6. URLへアクセスして Hello World を表示させる

http://aaa.bbb.ccc.com/dddd/

No.1102
01/16 14:20

edit

CodeIgniter

codeigniterでCSRF対策(CSRFプロテクション)機能を使う

● codeigniterでCSRFプロテクション機能を使う

codeigniterでCSRFプロテクション機能の概要は以下の通りです

  • POSTメソッドでフォームを送信する時にCSRFプロテクション機能が有効になる
  • コンフィグファイルのcsrf_protection を TRUE にするだけでアプリケーション全体で有効
  • コントローラ/メソッド ごとの on/off は出来ない(システムのソースを書き換えると可能)

● codeigniterでCSRFプロテクション機能を有効にする

codeigniter/application/config/config.php の以下の行を変更する

$config['csrf_protection'] = TRUE;

● codeigniterでCSRFプロテクション機能を使ってみる

コントローラ test/indextest/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などで書き換えて送信するとエラーとなることが確認できます。

No.1088
10/21 11:44

edit

CodeIgniter

codeigniterでTwitterログインを実現する

● codeigniterでTwitter,Facebookログインを実現する

● Twitter APIキーを発行する

こちらからAPIキーを発行します(追加方法は割愛します。) https://apps.twitter.com/

● Twiter Oauthモジュールのインストール

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のコントローラ「Oauth.php」の作成

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のコントローラ「Mypage.php」の作成

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/  



No.1087
02/27 16:31

edit

CodeIgniter
Twitter

CodeIgniter の DB操作

● CodeIgniter の DB操作

● INSERT文(テーブル : my_table へデータを INSERT する)

・ INSERT後に insert_id() で挿入した ID 番号、 last_query()で実行したSQL文 を取得しています。

$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();

● 複数件あるデータを SELECT(テーブル : my_table から1ページあたり20件に設定して1ページ目をSELECTする。)

検索条件 : 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();

● データを1件 SELECT(テーブル : my_table からデータを1件 SELECT する)

条件(data_id = 1)

$this->load->database();
$query = $this->db->get_where('my_table', array(
	'data_id' => 1 ,
), 1, 0);
$hash = @$query->result_array()[0];

● データのDELTE

$this->db->where('id', $id);
$this->db->delete('my_table');

● SQL直接実行

$this->load->database();
$sql = 'DROP TABLE IF EXISTS my_table';
$query = $this->db->query($sql);
echo $query->result_array();

● WHERE句( AND WHERE )

$array = array('name' => 'hoge');
$this->db->where($array); 
$array = array('title' => 'fuga');
$this->db->where($array); 

生成されるSQL

WHERE name = 'hoge' AND title = 'fuga'

● WHERE句( OR WHERE )

$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句( BINARY )大文字小文字を区別して検索する

$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文( AND LIKE , OR LIKE )

$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 '!'

● LIKE文(SQL文を記述)

$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 '%!%!%!%%' )

● 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 '!'

● ORDER BY

$this->db->order_by('title DESC, name ASC');

● LEFT JOIN (OUTER JOIN)

$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文 ( テーブル my_table を UPDATE する )

$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

● いま接続しているデータベースのテーブル数を取得する( MySQL )

$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];

● クエリヘルパーメソッド

● 書き込み」タイプのクエリ(insert、update、など) が実行されたとき、処理された行の数を取得

$rows = $this->db->affected_rows()
echo $rows;

● DBへの操作実行後に実行したSQL文を取得する(最後に実行されたクエリを取得)

$last_sql = $this->db->last_query();
echo $last_sql;
No.1077
10/26 19:17

edit

CodeIgniter

CodeIgniterの Auth パッケージ ion auth を使用する

● benedmunds/CodeIgniter-Ion-Auth

https://github.com/benedmunds/CodeIgniter-Ion-Auth

codeigniter用シンプルな認証ライブラリーです。
viewファイルもついてくるのでインストールするだけですぐ使えます。
シンプルな作りになっているので sqlite でも使用することができます

● 1. インストール

ターミナルから以下のようにしてインストールします

cd codeigniter/application/third_party
mkdir benedmunds
cd benedmunds
git clone https://github.com/benedmunds/CodeIgniter-Ion-Auth.git

● 2. autoload.phpの設定

apprication/config/autoload.php 42行目あたり を以下のように変更する。

$autoload['packages'] = array(APPPATH.'third_party/benedmunds/CodeIgniter-Ion-Auth');

● 3. 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 のテーブル名も変更します

※ SQLite3用にSQL文を変換するには

http://flatsystems.net/js_mysql_to_sqlite.html
を利用する。

● 4. config/config.php の設定を確認する

次の3項目の値を確認する。

$config['base_url'] = 'http://xxx.yyy.zzz/aaaa/';
$config['sess_save_path'] = APPPATH.'session/';
$config['language']	= 'japanese';

また、もし可能なら `application/session` ディレクトリの権限を「0700」に設定しておく

● 5. codeigniter の日本語パッケージをインストールする

ここからインストールします
https://github.com/NEKOGET/ci_language

● 6. データベースの設定を記述する

config/database.php にデータベースの設定を記述する

● 7. Authを使用してみる

codeigniter/application/third_party/benedmunds/CodeIgniter-Ion-Auth/controllers/Auth.php
codeigniter/application/controllers/ ディレクトリにコピーして動作させてみる

http://あなたのサーバー/auth/ 
で起動する
ログイン id ,pass はデフォルトで

Username: admin@admin.com
Password: password

となっているので、こちらを利用してログインを確認します。

● さらにユーザーごとのACL(アクセス制御リスト)を利用するには

こちらのライブラリを使用します。
https://www.phpclasses.org/package/10041-PHP-Manage-the-access-of-CodeIgniter-users-using-ACL.html

添付ファイル1
No.1075
06/02 16:42

edit

添付ファイル

CodeIgniter

codeIgniterで404エラーページをカスタマイズする

● 1.application/config/routes.php で エラー発生時のルーティングを設定する

application/config/routes.php で エラー時の

  • コントローラを「mycon」
  • メソッド名を「error_404」 に設定する

routes.php 内に以下を記述

$route['404_override'] = 'mycon/error_404';

● 2.application/controllers/Mycon.php に error_404 メソッドを作成する

Mycon.php 内に以下を記述(例)

	function error_404() {
		$this->output->set_status_header('404');
		$html = $this->twig->render('404.html');
		echo $html;
	}
No.1074
06/02 11:50

edit

CodeIgniter
エラー対処

CodeIgniterで DB(MySQL)に 現在時刻 を insertする

CodeIgniterで INSERT, UPDATE時に 現在時刻を指定するやり方

カラム「my_date」に現在時刻をセットする

●方法その1. set() に FALSE を指定してエスケープを解除する

$this->db->set('my_date', 'NOW()', FALSE); 
$this->db->update('my_table');

●方法その2. 日付けヘルパーを読み込んで現在時刻をセットする

$this->load->helper('date');
$update_data = array();
$update_data['my_date'] = unix_to_human( now(), TRUE, 'eu' );
$this->db->update('my_table', $update_data);
No.1049
08/08 13:54

edit

CodeIgniter
日付

フレームワークCodeIgniterで出力画面のファイルキャッシュを使用する

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');

● ウェブページキャッシュファイル名を確認する

1. ログファイルでキャッシュファイル名を確認する。(config.php でキャッシュ生成時のログを出力するように設定し確認する)

ログの設定は 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

確認が終わったらログスレッショルドを戻しておきましょう。

2. キャッシュファイル名を確認するメソッドでコントローラー内でログファイル名を確認する

● ウェブページキャッシュファイル名を取得するメソッド _get_cache_path()

// ページ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);
}
No.1034
12/25 14:57

edit

CodeIgniter

CodeIgniterの(クラス/メソッド)とパス、URLの設定

● CodeIgniterで現在URLを知る方法

$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 で設定した値が返る

● CodeIgniterで現在の(クラス/メソッド)を知る方法

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 が入ります

● CodeIgniterのパスの設定は index.php に記述されています。

● 定義されている定数は

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 にインストールされている場合)

No.1024
04/01 14:14

edit

CodeIgniter

CodeIgniterの簡易パスワード認証ライブラリ Minimal_auth.php

CodeIgniterで開発中にあるクラスだけパスワード認証をかけたい、または簡易なログイン画面を付けたい場合があります。
その時は以下のライブラリ【Minimal_auth.php】を用意するといいでしょう。
CodeIgniterのセッションを利用して超簡易パスワード認証をつけることができます。
SHA-256でハッシュしていますので、Basic認証、Digest認証の代わりにどうぞ。
またロボット対策として動的にhiddenを生成して送っています。

1. 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();
    }
  }

}

2. application/config``` にファイル名minimal_auth.php` として保存

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['admin_password'] = 'hogehoge';// パスワード(適宜変更すること)

3. 認証を付けたいコントローラー(例: `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分)。
```
No.958
10/16 17:12

edit

CodeIgniter
セッション

フレームワークCodeIgniter + Twigでサイトを多言語化する

PHPフレームワーク【CodeIgniter3】とテンプレートエンジン【Twig】でサイトを多言語化する方法を考えてみます。

1. URL設計

日本語版と英語版を作るとして、サイトのURLは一番上のパスで「ja」「en」というふうに分ける

http://foo.bar/ja/class/method/arg1/
http://foo.bar/en/class/method/arg1/

といった構成にしてみます。

2. CodeIgniterのルーティングの設定( routes.php )

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')】でアクセス

に変更されます。

3. 言語ファイル(英語・日本語)の作成

英語の言語ファイル `application/language/english/mycode_lang.php` を以下のように作成する

<?php
$lang['helo'] = "Hello ! World !!!";

日本語の言語ファイル `application/language/japanese/mycode_lang.php` を以下のように作成する

<?php
$lang['helo'] = "ようこそ! 世界 !!!";

4. 言語ファイルの読み込みと表示

コントローラーのメッソッドの第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

No.956
07/06 19:46

edit

CodeIgniter

CodeIgniterでSQLite3へ現在時刻をINSERTする

CodeIgniterでActiveRecordを使ってSQLite3へ現在時刻をINSERTするには以下のようにします。

テーブル「my_table」に『user_name』『modified_date』カラムに値を入れてINSERTする。

$data = array(
	'user_name' => ’ユーザー名’ ,
);
$this->load->database();
$this->db->set('modified_date', "datetime('now', 'localtime')", FALSE);
$this->db->insert('my_table', $data);
No.953
06/23 20:09

edit

CodeIgniter
日付

PHPフレームワークCodeIgniterの導入とサンプル

CodeIgniterはPHPフレームワークの中でも比較的シンプルでフレームワーク初学者にはCakePHPよりおすすめします。 動作も高速です。

●0-A.インストール(公式サイトからダウンロードする方法)

  • http://www.codeigniter.com/download からダウンロード
  • 解凍してできたフォルダ「CodeIgniter-3.1.3」を「codeigniter」にリネームする
  • フォルダ 「codeigniter」直下の以下のファイルとフォルダは不要なので削除する
    composer.json
    contributing.md
    license.txt
    readme.rst
    user_guide(フォルダ)
    
  • フォルダ「codeigniter」をサーバの一番上(もしくは任意の場所)の階層にアップロード

●0-B.インストール(composerを使用する方法)

サーバの任意のディレクトリ(この場合では ~/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

1. 【設定ファイルの変更】

codeigniter/application/config/routes.php を編集

$route['default_controller'] = 'welcome';

この行の 'welcome' を 'top' に変更します。

$route['default_controller'] = 'top'; // welcome → top に変更

2. 【コントローラーファイルの作成】

codeigniter/application/controllers/Welcome.php を コピーしてファイル名「Top.php」に変更する

ファイル名は「Top.php」(先頭は大文字)でなければいけません。

codeigniter/application/controllers/Top.php を編集

中身は以下のようにします。(クラス名「Top」先頭は大文字でなければいけません)

<?php
class Top extends CI_Controller {
	public function index()
	{
		$this->load->view('topview');
	}
}

とします。

3. 【ビューファイル(HTMLテンプレート)の作成】

codeigniter/application/views/welcome_message.php を コピーしてファイル名「topview.php」に変更する

codeigniter/application/views/topview.php を編集

拡張子は .php ですが 中身はHTMLファイルなので以下の様な内容にします。

<html>
<body>
<h1>test</h1>
</body>
</html>

ここで
http://localhost/codeigniter/index.php/Top
にアクセスしてテンプレートが表示されることを確認します。

4. 【データベースの作成】

今回 データベースにはsqlite3 を使用してみます。

codeigniter/application/config/database.php を編集します

$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
);

フォルダcodeigniter/application/sqlite3/ を作成する。

設定ファイル/codeigniter/application/config/migration.php の編集

$config['migration_enabled'] = TRUE;  		// FALSE → TRUE に変更
$config['migration_type'] = 'sequential';	// マイグレーション管理を「日付」→「連番」に変更
$config['migration_version'] = 1;					// 現在のバージョン

フォルダcodeigniter/application/migrations/ を作成する。

フォルダ migrations の中にファイル 001_create_table.php を作成し以下の内容で保存

<?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
);

になります。

マイグレーションを実行するコントローラ codeigniter/application/controllers/Migrate.php を作成し以下の内容で保存

<?php
class Migrate extends CI_Controller
{
	public function index(){
	        $this->load->library('migration');
	        if ($this->migration->current() === FALSE){
	                show_error($this->migration->error_string());
	        }
	}
}

http://localhost/codeigniter/index.php/migrate/ を実行してデータベースを作成。

codeigniter/application/sqlite3/test.sqlite3 が作成されていることを確認します
またテーブルも正しく作成されているかどうか確認します

5. データベースへのアクセス

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);

6. Codeigniterのバージョンの調べ方

system/core/CodeIgniter.php

にバージョン記述があります。

CodeIgniter 3.0でPHPUnitを使う post http://blog.a-way-out.net/blog/2015/05/19/ci-phpunit-test/

No.950
07/08 00:18

edit

CodeIgniter
composer