PHPプログラムに関する各種メモ書き

PHPでテストデータを作成する Faker

● Faker

https://github.com/fzaninotto/Faker

● Faker使い方(基本)

http://www.tam-tam.co.jp/tipsnote/program/post10791.html

● Fakerで生成できる日本語データの種類

https://github.com/fzaninotto/Faker/tree/master/src/Faker/Provider/ja_JP

● 主要PHPフレームワークでのインテグレーション

Laravel5 https://laravel.com/docs/5.4/seeding

CodeIgniter4 https://bcit-ci.github.io/CodeIgniter4/database/seeds.html

No.1133
04/22 17:13

edit

CodeIgniter
Laravel

PEAR run-tests を使ったPHPのユニットテスト

phpでユニットテストを行うときはPHPUnitがお勧めですが, PEARの run-tests( .phpt ) というのもあるので紹介しておきます。

● インストール

PEARがインストールされていれば使えます。

● テストするコード

例 : m.php

<?php
function implode_recursive($glue, array $pieces) {
    $result = array();
    array_walk_recursive($pieces, function($value) use(&$result) {
        $result[] = $value;
    });
    return implode($glue, $result);
}

● テストファイル( .phpt )の作成

テストファイルをディレクトリ tests/ 以下に作成します。ファイル名は 001.phpt とします。
例 : 001.php

--TEST--
test 001
--FILE--
<?php
require __DIR__ . '/../m.php';

$test = array(
    "hoge",
    "fuga",
    array(
        array(
            1,
            2,
        ),
        "foo",
        "bar",
        array(),
        "qux",
    ),
    "piyo",
);

var_dump(implode_recursive(",", array()));
var_dump(implode_recursive(",", $test));
var_dump(implode_recursive("",  $test));
?>
--EXPECT--
string(0) ""
string(30) "hoge,fuga,1,2,foo,bar,qux,piyo"
string(23) "hogefuga12foobarquxpiyo"

● テストの実行

コマンドラインから以下のように実行します

cd tests/
pear run-tests

これだけで フォルダ内の全ての .phpt ファイルを読み込んでテストを実行します。

● テスト結果を見やすくする

以下のようにするとテストが失敗した時に色がついて表示されるのでオススメです

pear run-tests | grep --color=auto -i -e 'fail' -e'$'

● エイリアスを作成する

以下のようにエイリアスを作成しておくと phpt と入力するだけでテストが走るので便利です

vi ~/.bash_profile
alias phpt="pear run-tests | grep --color=auto -i -e 'fail' -e'$'"

引用 : http://qiita.com/arai-ta/items/450dd84964ad628e287b

No.1123
04/11 17:05

edit

PEAR
エラー対処

php7で変数の型宣言が厳格なコーディングを行う

php7から変数の型宣言が厳格なコーディングが可能になっていますのでぜひ使いましょう。

● 変数の型を確認する

echo gettype( $val );
var_dump( $val );

● 変数の型指定を厳格にする

declare(strict_types=1);

● 変数の型指定を厳格にしたときのエラー例

<?php
declare(strict_types=1);
function my_func(int $v){
    echo $v."\n";
}
my_func('999');
PHP Fatal error:  Uncaught TypeError: Argument 1 passed to my_func() must be of the type integer, string given, called in /test.php on line 6 and defined in /test.php:3
Stack trace:
#0 /test.php(3): my_func('999')
#1 {main}
  thrown in /test.php on line 7

こちらもあわせて使用すると非常に有効です。
PHPで列挙型(enum)を作る
http://bit.ly/2oTfrz7

No.1122
04/11 15:15

edit

PHP7
エラー対処

phpcs , phpcbf で phpコードを(チェック / 整形)する

多人数が関わるプロジェクトでは phpコードの書式を統一するのが難しくなります。
そこでプログラマー個人にコーディングルールを覚えさせるよりプログラムで自動判別させます。
下記の phpcs がとても便利です。

● squizlabs/PHP_CodeSniffer ( phpcs )

https://github.com/squizlabs/PHP_CodeSniffer/wiki

1. composer コマンドからインストールします

composer global require "squizlabs/php_codesniffer=*"

2. シェルが bash の場合は次のコマンドでパスを追加しておきます

echo 'export PATH=$HOME/.composer/vendor/bin:$PATH' >> .bash_profile
source .bash_profile

● インストールの確認

phpcs --version

● php ソースコードのチェック (phpcs コマンド)

PSR2準拠のソースフォーマットチェックを行います。

phpcs  --report=source  --standard=PSR2  [phpファイル名  または ディレクトリ名 ] 

オプション --standard=PSR2 を付け忘れないようにしましょう。
(オプションをつけないとPEAR準拠のソースフォーマットチェックとなります)

--reportオプションは

--report=source
--report=summary

があります。

● チェックできるコーディングルール一覧を表示する

phpcs -i

The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend

● php ソースコードの整形 (phpcbf コマンド)

指定したコーディング規約に沿うようphpソースコードを自動で整形してくれます
例)PSR2準拠に自動整形します

phpcbf  --standard=PSR2  [phpファイル名] 
No.1121
04/11 23:22

edit

エラー対処

PHPMD で PHPソースのチェックを行う

● PHPMDとは?

バグにつながりそうな怪しい ソースコードをチェックして教えてくれる php md。
コーディング時に必ず使うようにしておくとミスやバグが減るので是非使いましょう

● PHPMDのインストール

1. composer コマンドからインストールします

composer global require phpmd/phpmd

2. シェルが bash の場合は次のコマンドでパスを追加しておきます

echo 'export PATH=$HOME/.composer/vendor/bin:$PATH' >> .bash_profile
source .bash_profile

3. phpmd コマンドを入力してパスが通ってるか確認します

phpmd

● PHPMDで phpソースコードのチェックを行う

(ソースファイル myfile.php チェックしテキストデータで結果を受け取る。チェックする項目は codesize,controversial,design,naming,unusedcode)

phpmd  myfile.php  text  codesize,controversial,design,naming,unusedcode

オプションの意味

codesize	コードが大きすぎないかチェック
controversial	命名規則など議論の余地がある部分を検出するチェック
design	設計上の関連のチェック
naming	変数名など名前関連のチェック
unusedcode	使われていない変数のチェック
cleancode	綺麗なコードかチェック

書式は以下の通りです

phpmd (phpファイル名) ( text または xml または html ) (オプションをカンマで区切る)

引用 : https://simple-it-life.com/?p=761

No.1120
04/11 11:14

edit

エラー対処
composer

phpでパスワード等の可逆暗号を行う

● phpで可逆暗号を行う

phpで可逆暗号を行うには, mcrypt , OpenSSL , PEAR::Crypt_Blowfish などがありますが、
mcrypt は近い将来 php 7.2で削除されますし、PEAR::Crypt_Blowfishも古いライブラリーなので OpenSSL から共通鍵暗号を使用します。

※ PHP 7.1.x で推奨されなくなる機能

http://php.net/manual/ja/migration71.deprecated.php

mcrypt 拡張モジュールは十年近くにわたって放置されており、極めて使いづらいものです。 
そこで、この拡張モジュールを非推奨にしました。
かわりに OpenSSL を使いましょう。 mcryptは PHP 7.2 でコアから削除されて、PECL に移る予定です。

● PHPのopenssl_encrypt()を使って AES 256 CBC で暗号化・復号化する例

$data     = 'あいうえおかきくけこさしすせそ';
$password = 'my_password';

// 利用可能な暗号メソッド一覧
$ciphers = openssl_get_cipher_methods();
print_r($ciphers);

// 暗号化方式
$method = 'AES-256-CBC';

// IV(初期化ベクトル)に必要な長さを取得
$iv_length = openssl_cipher_iv_length($method);

// IV(初期化ベクトル)をランダム生成
$iv = openssl_random_pseudo_bytes($iv_length);

// OPENSSL_RAW_DATA と OPENSSL_ZERO_PADDING を指定可
$options = 0;

// 暗号化
$encrypted = openssl_encrypt($data, $method, $password, $options, $iv);
echo "暗号文:" .$encrypted . "\n";

// 復号
$decrypted = openssl_decrypt($encrypted, $method, $password, $options, $iv);
echo "平文:" .$decrypted ."\n";

引用 : http://php-archive.net/?p=977

No.1118
04/05 19:31

edit

PHPで日付を扱う(Datetimeまたは DateTimeImmutable )クラス

● PHPで日付を扱うにはDatetime(または DateTimeImmutable )クラスを使用します。

$dt = new DateTime();
echo $dt->format('Y-m-d H:i:s');

戻り値

2017-04-03 01:42:06

年月日等をバラバラに取り出すときは次のようにします

$dt = new DateTime();
$year = $dt->format('Y'); // 2017
$month = $dt->format('m'); // 04
$day = $dt->format('d'); // 03

● 前の月や次の月など相対的な日付をセットする

$dt->modify('-1 months');	// 1ヶ月 前
$dt->modify('+1 months');	// 1ヶ月 後

$dt->modify('−12 hours');	//12時間 前
$dt->modify('+12 hours');	//12時間 後

$dt->modify('-30 minutes');	//30分 前
$dt->modify('+30 minutes');	//30分 後

$dt->modify('-1 weeks');	//1週間 前
$dt->modify('+1 weeks');	//1週間 後

$dt->modify('first day of this months');	// その月の最初の日
$dt->modify('last day of this months');		// その月の最後の日

$dt->modify('first day of last months');	// 前月の最初の日
$dt->modify('last day of last months');		// 前月の最後の日

$dt->modify('first day of next months');	// 次の月の最初の日
$dt->modify('last day of next months');		// 次の月の最後の日

● php のDatetimeオブジェクトは2種類ある

状況によって使い分けると良いでしょう

● PHP DateTime クラス (ミュータブルなオブジェクト)

http://php.net/manual/ja/class.datetime.php

● PHP DateTimeImmutable クラス (イミュータブルなオブジェクト)

http://php.net/manual/ja/class.datetime.php クラスの説明

このクラスの挙動は DateTime とほぼ同じですが、 自分自身は変更せずに新しいオブジェクトを返すという点だけが異なります。

です

No.1113
04/05 19:30

edit

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

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

https://www.codeigniter.com/download

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

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

● 3. .htaccessをアップロードする

ファイル名を **.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'] = '';
```
No.1102
03/09 22:40

edit

CodeIgniter

Smartyで小数点以下を2桁にまとめ、最後がゼロの場合は表示しないようにする

{ assign var="total" value=123.45 }
{ $total | number_format:2 | floatval }
<br>
{ assign var="total" value=123.00 }
{ $total | number_format:2 | floatval }

結果

123.45
123
No.1095
03/03 19:44

edit

Smarty

apacheの mod_rewrite エンコードされたURLに %2Fや%5Cが含まれると404エラーになる場合の回避法

● httpd.confを触れる環境下では httpd.confに以下を追加する

AllowEncodedSlashes On

※ 注意 .htaccessには記述できません。

● PHPやJavaScriptのコーディングで(/)→(%2f)→(%252f)変換することで対応する

・phpでエンコード

// スラッシュだけを変換する
$q = preg_replace("{/}","%2f",$q);
// この後クエリ全体を urldecode します

・phpでデコード

$q = preg_replace("{%252f}","%2f",$q);
No.1094
03/01 13:42

edit

PHPでSafariの「リーダー表示」のように記事を抜き出す

● PHPでSafariの「リーダー表示」のように記事を抜き出す

https://packagist.org/search/?q=Readability

● j0k3r/php-readability

https://packagist.org/packages/j0k3r/php-readability

composer require j0k3r/php-readability
use Readability\Readability;

$url = 'http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/729-thatcher.html';

// you can use whatever you want to retrieve the html content (Guzzle, Buzz, cURL ...)
$html = file_get_contents($url);

$readability = new Readability($html, $url);
// or without Tidy
// $readability = new Readability($html, $url, 'libxml', false);
$result = $readability->init();

if ($result) {
    // display the title of the page
    echo $readability->getTitle()->textContent;
    // display the *readability* content
    echo $readability->getContent()->textContent;
} else {
    echo 'Looks like we couldn\'t find the content. :(';
}
No.1093
02/23 09:08

edit

ソースコードがPHP7に対応しているかチェックする php7cc

● composerのインストール

ターミナルから次のように入力する

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

インストールは次の A. B. の方法があります。

●A. php7ccのインストール( Composer からインストール)

composer global require sstalle/php7cc

●B. php7ccのインストール( 実行ファイルを直接ダウンロード )

ページ
https://github.com/sstalle/php7cc/releases
にダウンロードリンクがあるので wget コマンドでダウンロードします。

cd ~
wget https://github.com/sstalle/php7cc/releases/download/1.1.0/php7cc.phar
chmod 0755 php7cc.phar

.bash_profile にエイリアスを書いておきます

alias php7cc='~/php7cc.phar'

● php7ccの実行

php7cc 「フォルダ名」

● php7で置き換えなければいけない関数

・mysql関連の関数

mysql 関連の関数は全て mysqli のメソッドに置き換える必要があります。
またその際に mysql への接続情報を渡す必要があります。
例 :

$q = mysql_escape_string( $q );
      ↓
$mysqli = new mysqli('サーバ名', 'ユーザー名','パスワード', 'DB名');
$q      = $mysqli->real_escape_string( $q );

・set_magic_quotes_runtime()

これは削除(コメントアウト可)すればOKです。
例 :

set_magic_quotes_runtime(true);
      ↓
// set_magic_quotes_runtime(true);
No.1091
03/08 11:26

edit

Strict Standards: Only variables should be passed by reference エラーへの対応

PHP5.6以降では配列関係の参照渡しの関数にデータを渡す時は一度変数に入れる必要があります。

● エラーとなる例

$new_array = end( array_keys($array) );

● このように変更します

$ar_key = array_keys($array);
$new_array = end( $ar_key );
No.1089
02/08 18:30

edit

配列
エラー対処

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

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

codeigniterで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
02/07 14:51

edit

CodeIgniter

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

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

● Twitter,Facebook APIキーを発行する

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

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

composerからインストールします。
ターミナルから以下を実行

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のコントローラの作成

codeigniterの controllers に Oauth.php を以下のように作成します

public function twitter() {
    define('CONSUMER_KEY', 'XXXXXXXX');
    define('CONSUMER_SECRET', 'YYYYYYYY');
    define('OAUTH_CALLBACK', 'http://zzz.zzz.zzz/oauth/twitter_callback/');
    $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('oauth/mypage');
}

● ログインの実行

http://zzz.zzz.zzz/oauth/twitter/ へアクセスします

No.1087
02/07 13:50

edit

CodeIgniter
Twitter

PHPのcomposer使い方

● composerのインストール

ターミナルから次のように入力する

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

● composerのバージョンの確認

composer -v

● composerを使ってPHPパッケージをインストールする

composer require 『パッケージ名』

● composerを使ってPHPパッケージをアンインストールする

composer remove --update-with-dependencies 『パッケージ名』

● codeigniterで autoload を使用する

ファイル application/config/config.php に設定があるので以下のように変更します

$config['composer_autoload'] = TRUE;

● composer の autoloader を高速化する

composer --optimize-autoloader update

ファイル `vendor/composer/autoload_classmap.php` の中身がフルパスを記述したものに書き換わりファイルを探しに行く時間が短縮されるので高速になります。

No.1086
03/16 17:12

edit

Twigのバージョンを表示する

Twigのバージョンを表示するには

<p>twigのバージョンは : {{ constant('Twig_Environment::VERSION') }}</p>

とします。

なお Twigのバージョン2 を利用するには PHP7以上が必要です。

No.1079
01/20 17:19

edit

Twig

CodeIgniter の DB操作

● SQL直接実行

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

● DBへの操作実行後に実行したSQL文を取得する

$last_sql = $this->db->last_query();
echo $last_sql;

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

● ORDER BY

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

● データベースの設定情報にアクセスする

$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];
No.1077
03/14 11:26

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 を以下のように変更する。

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

● 3. Auth用テーブルを作成する

codeigniter/application/third_party/benedmunds/CodeIgniter-Ion-Auth/sql/ の中にデータベース作成SQLがあるので 実行してテーブルを作成する
SQLite3用にSQL文を変換するには
http://flatsystems.net/js_mysql_to_sqlite.html
を利用する。

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

次の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. Authを使用してみる

codeigniter/application/third_party/benedmunds/CodeIgniter-Ion-Auth/controllers/Auth.php
を自分の 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

No.1075
04/05 17:22

edit

CodeIgniter

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

● 1.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
01/05 14:22

edit

CodeIgniter
エラー対処

PHPの true / false を目に見える形で表示する。

true / false 値をデバッグする時に目に見える形で表示したい時があります。
そんなときは `var_export()` を使って

var $my_flag = true;
print ( var_export( my_flag ) );

とします。

No.1066
12/16 15:13

edit

ApacheのPHP実行ユーザー名を確認する

ApacheのPHP実行ユーザー名を確認する

1. ApacheのPHP実行ユーザー名を確認するには phpinfo() の次の項目を確認します。

2. PHPプログラム内からApacheのPHP実行ユーザー名を確認するには以下のコードを記述します。

print "<pre>";
$d = posix_getpwuid(posix_geteuid());
print_r($d);
print "</pre>";

Array
(
    [name] => apache
    [passwd] => x
    [uid] => 48
    [gid] => 48
    [gecos] => Apache
    [dir] => /var/www
    [shell] => /sbin/nologin
)

ApacheのPHP実行ユーザーを変更する

ApacheのPHP実行ユーザーは `/etc/httpd/conf/httpd.conf` に記述してあります

User apache
Group apache

これを変更して apache を再起動すれば変更されます

添付ファイル1
No.1065
02/03 17:28

edit

添付ファイル

Apache

PHPでXpathでスクレイピングできるモジュール

● PHPでXpathでスクレイピングできるモジュール

● querypath をインストールしWEBサイトのタイトルとdescriptionを取得する

・1. querypath をインストール

インストールするディレクトリ(CodeIgniterの場合は /codeigniter/application/)に移動しターミナルから

composer require querypath/querypath

でインストール。

・2. querypath を読み込み

CodeIgniterを使用している場合は `config/config.php`

$config['composer_autoload'] = TRUE;

で自動的に読み込まれます。
フレームワークを使用していない場合は

require_once "vendor/autoload.php";

・3. querypath でWEBページの情報を取得する(例:YahooトップページのタイトルとDescriptionを表示します)

require_once "vendor/autoload.php";
$url = 'http://yahoo.co.jp/';
$html = file_get_contents($url);
$qp = html5qp($html);
print qp($html, 'title')->text();
print qp($html, 'meta[name=description]')->attr("content");
No.1055
01/28 22:39

edit

Xpath
CodeIgniter

PHPが「WEBブラウザから起動されたぁ?」「コマンドラインから起動されたか?」を判別する

PHPが「WEBブラウザから起動されたぁ?」「コマンドラインから起動されたか?」を判別するには以下のようにします。

$cli = false;
if ( defined('STDIN') ) {
    $cli = true;
}
if ($cli){
echo 'コマンドからの起動です。';
}
No.1053
08/22 18:26

edit

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
日付

PHPで受信したHTMLメールやマルチパートメールを解析する

PHPで受信したHTMLメールを解析するには php-mime-mail-parser を使用すると便利です https://packagist.org/packages/php-mime-mail-parser/php-mime-mail-parser

● 1. php-mime-mail-parser をインストール

a. composer.json からインストール

composer.json を以下のようにセット

{
    "require": {
        "php-mime-mail-parser/php-mime-mail-parser": "^2.4"
    }
}

b. composerコマンドからインストール

composer  require php-mime-mail-parser/php-mime-mail-parser

● 2. php-mime-mail-parser で受信したHTMLメールを解析する

require_once __DIR__ . '/../vendor/autoload.php';
$Parser = new PhpMimeMailParser\Parser();
$mail_src = file_get_contents('mail.txt');
$Parser->setText($mail_src);
$to            = $Parser->getHeader('to'); // "test" <test@example.com>, "test2" <test2@example.com>
$addressesTo   = $Parser->getAddresses('to'); //Return an array : [[test, test@example.com, false],[test2, test2@example.com, false]]
$from          = $Parser->getHeader('from'); // "test" <test@example.com>
$addressesFrom = $Parser->getAddresses('from'); //Return an array : test, test@example.com, false
$subject       = $Parser->getHeader('subject');
$text          = $Parser->getMessageBody('text');
$html          = $Parser->getMessageBody('html');
print_r($html);
No.1048
08/01 13:41

edit

メール

さくらのレンタルサーバへPHP のPECL拡張をインストールする

さくらのレンタルサーバへPECL拡張をインストールするには

  1. 使用しているPHPバージョンに対応するpecl拡張のソースをダウンロード・展開
  2. phpize , configure , make
  3. 任意の場所に【xxxxx.so】ファイルを移動
  4. php.iniに `extension = xxxxx.so` を記述

でできます。

例としてPECL拡張 `mailparse` をインストールしてみます。

1. 使用しているPHPバージョンに対応するpecl拡張のソースをダウンロード・展開する

https://pecl.php.net/
から使用したいpecl拡張をダウンロードします。 (この際対応しているPHPのバージョンを確認すること) 例 : mailparse バージョン 2.1.6 をダウンロードします

wget https://pecl.php.net/get/mailparse-2.1.6.tgz
tar zvxf mailparse-2.1.6.tgz
cd mailparse-2.1.6

2. phpize , configure , make します

ターミナルから以下のコマンドを実行します。

phpize
./configure
make
make test

3. 任意のフォルダにファイルをコピー

ここでは ホームディレクトリ直下の php_modules ディレクトリにコピーします

mkdir cd ~/php_modules/
cp ./modules/mailparse.so   ~/php_modules/

4. さくらレンタルサーバの管理画面から PHP設定の編集 を押して php.iniに設定を記述します

extension_dir =  /home/『ユーザー名』/php_modules/
extension = mailparse.so

phpinfo() で項目が表示されていれば正しくインストールされています。

5. コマンドラインからも使えるようにエイリアスを設定する

● .bash_profileに以下を追加

alias php='php -c/home/『ユーザー名』/www/php.ini'

● .cshrc に以下を追加

alias php	php -c /home/『ユーザー名』/www/php.ini

追加後にコマンドラインから

php -m

で該当モジュール(mailparse)が表示されていれば正しくインストールされています 

6. PECL拡張をインストールしたPHPを使用してcomposerを使う

composer requie hogehoge/hogehoge

とするかわりに

php /PATH/TO/COMPOSER/composer.phar   require   hogehoge/hogehoge

とすればいいでしょう。

No.1047
10/13 10:22

edit

メール

さくらのレンタルサーバへPHPのPECL拡張(ソケット拡張、FTP拡張等)をインストールする

さくらのレンタルサーバ「スタンダード」へPHPの FTP拡張(ftp.so)ソケット拡張(socket.so)をインストールする方法。

1. PHPのバージョンを確認する

PHPのソースから

phpinfo();

でバージョンを確認します。

2. 同じバージョンのPHPソースを取得してきて、さくらサーバ上で展開する

https://secure.php.net/releases/
例(バージョン 5.6.21)の場合はPHP 5.6.21 (tar.gz) をダウンロードして展開するとフォルダ `php-5.6.21` ができます。

3. 拡張の共有ライブラリをmakeする

cd ./php-5.6.21/ext/sockets
phpize
./configure
make
````
成功すると ```modules/sockets.so``` ファイルができます。

###4.任意のディレクトリに sockets.so をコピーする
例( 【ホームディレクトリ】/php_modules)の場合

mkdir ~/php_modules cp modules/sockets.so ~/php_modules/


###5.さくらレンタルサーバのコンパネ →『 PHP設定の編集』に以下を追加して保存する。
php.ini に以下を追加します

extension_dir = /home/『ユーザー名』/php_modules/ extension = sockets.so


###6.phpinfo() で確認する
成功すると
<img src="/data/filedir/1041_1.png" style="width:100%;">
と表示されます。

同様に 3〜5 の手順で ftp拡張をインストールするすることもできます。


###6. コマンドラインからも使えるようにエイリアスを設定する
● .bash_profileに以下を追加

alias php='php -c/home/『ユーザー名』/www/php.ini'


● .cshrc に以下を追加

alias php php -c /home/『ユーザー名』/www/php.ini


追加後にコマンドラインから

php -m

で該当モジュール(mailparse)が表示されていれば正しくインストールされています


###7. PECL拡張をインストールしたPHPを使用してcomposerを使う

composer requie hogehoge/hogehoge

とするかわりに

php /PATH/TO/COMPOSER/composer.phar require hogehoge/hogehoge

とすればいいでしょう。






引用 : http://tti.matrix.jp/blog/?p=344
添付ファイル1
No.1041
10/13 10:22

edit

添付ファイル

フレームワーク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
08/08 13:47

edit

CodeIgniter

フレームワークCodeIgniterの(クラス/メソッド)とパスの設定

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

```
$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
03/10 16:22

edit

CodeIgniter

phpでx日経過したファイルやディレクトリを削除する

テンポラリファイルなど、何日か前のファイルを削除したい時があると思います。

●PHPでファイル、ディレクトリ一覧を取得する

例:my_folder 以下のファイル、ディレクトリ一覧を取得します。

$dir = dirname(__FILE__) . '/my_folder/';  
$list = get_file_dir_list($dir);  
// get_file_dir_list
function get_file_dir_list($dir=''){
  if ( !$dir || !is_dir($dir) ){ die('dirを正しく設定してください。');}
  $iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(
      $dir,
      FilesystemIterator::SKIP_DOTS
      |FilesystemIterator::KEY_AS_PATHNAME
      |FilesystemIterator::CURRENT_AS_FILEINFO
    ), RecursiveIteratorIterator::CHILD_FIRST
  );
  $list = array();
  foreach($iterator as $pathname => $info){
    $list[] = $pathname;
  }
  return $list;
}

●X日経過したファイル、ディレクトリを削除する

例:my_folder 以下のファイル、ディレクトリから1ヶ月以上前のものは削除します。

$list = get_file_dir_list($dir);  
print_r($list);  
del_file_dir($list, '-1 month');  
// del_file_dir
function del_file_dir( $list=array(), $expire_date_str='-1 month' ){
  //削除期限
  date_default_timezone_set('Asia/Tokyo');
  $expire_timestamp = 0;
  if (($expire_timestamp = strtotime($expire_date_str)) === false) { die("The expire string : ({$expire_date_str}) is bogus"); }

  foreach ($list as $file_path) {
    $mod = filemtime( $file_path );
    if($mod < $expire_timestamp){
      if (is_dir($file_path)){
        echo 'ディレクトリ削除します : '. $file_path.date("Y-m-d H:i:s", $mod)."\n";
        rmdir($file_path) or die("can not delete directory:({$file_path})");
      }
      if (is_file($file_path)){
        echo 'ファイル削除します : '. $file_path.date("Y-m-d H:i:s", $mod)."\n";
        unlink($file_path) or die("can not delete file:({$file_path})");
      }
    }
  }
}
No.1022
01/30 19:41

edit

PHPで配列の重複した値を取り除く

● 重複した値を持つ配列を重複値を綺麗に取り除く

AAA
BBB
DDD
DDD
FFF

 ↓

AAA
BBB
DDD
FFF

PHPコードは

$my_ar = array(
  'AAA' ,
  'BBB' ,
  'DDD' ,
  'DDD' ,
  'FFF' ,
);
print_r($my_ar);
$my_ar = array_merge(array_unique($my_ar));
print_r($my_ar);

です。

● 配列に重複があるかどうかチェックする 関数

重複がある時に true を返します

function array_same_values($array) {
    return array_unique($array) !== $array;
}

です。 引用 : http://bit.ly/1MRi1fr

No.1021
04/06 13:59

edit

配列

PHPの正規表現検索 preg_match で変数を使う

preg_match で変数を使うにはpreg_quoteを使用します。

string preg_quote ( string $str [, string $delimiter = NULL ] )
$file = 'my_file_123456789';
$needle = 'my_file_'

$pattern = '/' . preg_quote($needle, '/') . '[0-9]+/';
if ( preg_match($pattern, $file) ){
	echo 'マッチします。';
}
No.1017
02/23 19:10

edit

正規表現

PHP5.6 iconv_set_encoding Deprecated エラーの対処

PHP5.6以上では

iconv_set_encoding('output_encoding', 'UTF-8');

は下記のようなエラーとなります

Deprecated: iconv_set_encoding(): Use of iconv.internal_encoding is deprecated in xxxxx.php on line 99

● 対処方法

とりあえずエラーを消したい場合は以下のように一括で置換するといいでしょう

iconv_set_encoding('output_encoding', 'UTF-8');

if ( (float)phpversion() < 5.6 ){ iconv_set_encoding('output_encoding', 'UTF-8'); }
No.1013
03/30 14:24

edit

エラー対処

PHPでCSVを読み込み、出力(ダウンロード)させるLeague CSV】

◆ 素のPHPでCSV読み込みをする

$file = new SplFileObject($file_path);
$file->setFlags(SplFileObject::READ_CSV);
$convert_count = 0;
foreach ($file as $line) {
	print_r($line);
}

● league/csvを使用してCSVファイルを扱う (要PHP5.5以上)

https://packagist.org/packages/league/csv

● 1. インストール

composerを使用します

composer require league/csv

● 2. 読み込みまたは出力

composerを使用しているので autoload.php を読み込みます

$php_version = (float)phpversion();
if ( $php_version < 5.5 ){ die("league/csv を使用するにはPHP バージョン5.5以上が必要です");}
require APPPATH.'/vendor/autoload.php';
use League\Csv\Reader;
use League\Csv\Writer;

// CSVファイルの読み込み
$csv_reader = Reader::createFromPath('/path/to/your/csv/file.csv');
$headers = $csv_reader->fetchOne();
$res = $csv_reader->setOffset(10)->setLimit(25)->fetchAll();
print_r(res);

// ファイルの出力
$csv_writer = Writer::createFromFileObject(new SplTempFileObject());
$csv_writer->insertOne( array('カラム1','カラム2','カラム3' ) );
$csv_writer->output('users.csv');

No.1012
05/31 10:54

edit

composer
CSV

PHPでFTPファイルアップロード / ダウンロード を行う【flysystem】

PHPでFTPファイルアップロード / ダウンロード を行うには PHPのFTP関数 http://php.net/ftp を使用する方法がありますが、

■ flysystem

https://packagist.org/packages/league/flysystem

を使用するほうが早く、FTPをはじめとする次の転送方式にも同じインターフェイスで対応できます(要 追加インストール)

  • local
  • Amazon Web Services - S3 V2 / V3
  • Rackspace Cloud Files
  • Dropbox
  • OneDrive
  • Copy
  • ftp
  • Sftp
  • Zip
  • WebDAV
  • PHPCR
  • Azure Blob Storage
  • NullAdapter
  • Redis
  • Fallback
  • Memory
  • Google Cloud Storage
  • SinaAppEngine Storage

1. インストール

composer からインストールします

composer require league/flysystem

2. 読み込み(autoload.php)

autoload.php を読みこませればOK

autoloadを使いたくない場合は次のように spl_autoload_register() に無名関数を登録してオートロードを作成します。

spl_autoload_register(function($class) {
    $prefix = 'League\\Flysystem\\';
    if ( ! substr($class, 0, 17) === $prefix) {
        return;
    }
    $class = substr($class, strlen($prefix));
    $location = __DIR__ . 'path/to/flysystem/src/' . str_replace('\\', '/', $class) . '.php';
    if (is_file($location)) {
        require_once($location);
    }
});

3.ファイルシステムへの接続

(ローカル)

use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local as Adapter;
$filesystem = new Filesystem(new Adapter('/path/to/directory'));

(FTP)

use League\Flysystem\Adapter\Sftp as Adapter;
$filesystem = new Filesystem(new Adapter(array(
    'host' => 'example.com',
    'port' => 21,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
)));

4. ファイルの操作

// ファイルの存在確認
$exists = $filesystem->has('path/to/file.txt');
// ファイルを読み込む
$contents = $filesystem->read('path/to/file.txt');
// ファイルを読み込むストリームを得る
$stream = $filesystem->readStream('something/is/here.ext');
// ファイルに書き込む
$filesystem->write('path/to/file.txt', 'contents');
// ファイルに追記する
$filesystem->put('path/to/file.txt', 'contents');
// ファイルを削除する
$filesystem->delete('path/to/file.txt');
// ファイルを読み込んで削除する
$contents = $filesystem->readAndDelete('path/to/file.txt');
// ファイルをリネーム(移動)する
$filesystem->rename('filename.txt', 'newname.txt');

5. ftp_connect() 関数がありませんエラーが出る場合

Fatal error: Call to undefined function League\Flysystem\Adapter\ftp_connect() in vendor/league/flysystem/src/Adapter/Ftp.php on line 98

この場合はPHPのftp関数が使用できないサーバですので使用できません。 ソケット通信を使用したFTPクラスを使用するといいでしょう

https://gist.github.com/kobapan/97dcf3039366be1f326d

No.1009
03/04 11:57

edit

ファイル

PHPでファイルを開いて1行ずつ読み込む、ファイルへデータを書き出す。(ファイルオープン、クローズ)

■ PHPでファイルを開いて1行ずつ読み込むのサンプル

$filename = 'input.txt';
$fp = fopen($filename,'r') or die("ファイル({$filename})のオープンに失敗しました");
while ( ($line = fgets($fp,99999)) !== false ) { // 1行あたり最大99999bytes
	print "$line\n";
}
fclose($fp);

■ ファイルへの書き込みは

$filename = 'output.txt';
$data = 'テストデータです';
$tmp_filename = getmypid().'.tmp';
$fp = fopen($tmp_filename, 'w');
fwrite($fp, $data);
fclose( $fp );
rename($tmp_filename, $filename);
No.544
01/27 15:45

edit

ファイル

PHP5.6での【Deprecated: Non-static method】エラーの対応

PHP5.6ではstaticではないメソッドを直接呼び出すとエラーが出ます。

■ 例:PHP5.6では以下のコードはエラーとなる

$config = Spyc::YAMLLoad($yml_filename);

■ 対処法: 以下のようにコードを変更します。

$spyc = new Spyc();
$config = $spyc->YAMLLoad($yml_filename);

参考 : http://bit.ly/1PAKIIC

No.996
01/18 14:45

edit

エラー対処

phpのimagemagickで画像を正方形に切り抜く

画像のサムネイルを作成したい場合にphpで自動でできると便利です。 そこでimagemagickを使用します。

ディレクトリ【data】の中に入っている画像【my.jpg】を写真中央で正方形に切り抜き【th_my.jpg】で保存する

$data_dir = 'data';
$input_image  = "my.jpg";
$output_image = "th_".$input_image;

$image = file_get_contents("{$data_dir}/$input_image");
$im = new Imagick();
$im->pingImageBlob($image);
$org_width  = $im->getImageWidth();
$org_height = $im->getImageHeight();
echo 'original image size : ' . $org_width . ' x ' . $org_height ."<br>\n";

$size = $org_width;
if ( $org_width > $org_height){ $size = $org_height; }

$width  = $size;
$height = $size;
$im->readImage("{$data_dir}/$input_image");
$im->cropThumbnailImage($width, $height);
$im->writeImage("{$data_dir}/$output_image");
echo "thumbnail created : {$data_dir}/$output_image";
No.994
01/08 15:55

edit

画像

PHPでスペース区切りの文字列で検索文字をANDマッチする

いわゆるGoogleなどの検索エンジンのようにスペース区切りをANDマッチする方法

function list_and_match($data, $search_str_space_separated){
	$search_str_space_separated = mb_convert_kana($search_str_space_separated, "s");
	$search_list = array();
	$search_list = preg_split("/\s/",$search_str_space_separated);
	$flag = 1;
	foreach ($search_list as $v) {
		if ( ! preg_match("/{$v}/iu",$data) ){
			$flag = false;
			break;
		}
	}
	return $flag;
}
$text = "長い長い日本語のテストを行います。";
$search_text = "長い テスト";
if ( list_and_match($text, $search_text) ){
 echo 'マッチしました';
}
No.983
12/08 20:14

edit

日本語

PHPでPCの機種依存文字を検出し、変換(削除)する。

PHPでPCの機種依存文字を検出し、変換(削除)するには以下のようにします。

function replace_kishu_kanji( $subject='' ){
  $search  = array( '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳', 'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ', 'Ⅹ', '㍉', '㌔', '㌢', '㍍', '㌘', '㌧', '㌃', '㌶', '㍑', '㍗', '㌍', '㌦', '㌣', '㌫', '㍊', '㌻', '㎜', '㎝', '㎞', '㎎', '㎏', '㏄', '㎡', '㍻', '〝', '〟', '№', '㏍', '℡', '㊤', '㊥', '㊦', '㊧', '㊨', '㈱', '㈲', '㈹', '㍾', '㍽', '㍼', '∮', '∑', '∟', '⊿', '纊', '褜', '鍈', '銈', '蓜', '俉', '炻', '昱', '棈', '鋹', '曻', '彅', '丨', '仡', '仼', '伀', '伃', '伹', '佖', '侒', '侊', '侚', '侔', '俍', '偀', '倢', '俿', '倞', '偆', '偰', '偂', '傔', '僴', '僘', '兊', '兤', '冝', '冾', '凬', '刕', '劜', '劦', '勀', '勛', '匀', '匇', '匤', '卲', '厓', '厲', '叝', '﨎', '咜', '咊', '咩', '哿', '喆', '坙', '坥', '垬', '埈', '埇', '﨏', '塚', '增', '墲', '夋', '奓', '奛', '奝', '奣', '妤', '妺', '孖', '寀', '甯', '寘', '寬', '尞', '岦', '岺', '峵', '崧', '嵓', '﨑', '嵂', '嵭', '嶸', '嶹', '巐', '弡', '弴', '彧', '德', '忞', '恝', '悅', '悊', '惞', '惕', '愠', '惲', '愑', '愷', '愰', '憘', '戓', '抦', '揵', '摠', '撝', '擎', '敎', '昀', '昕', '昻', '昉', '昮', '昞', '昤', '晥', '晗', '晙', '晴', '晳', '暙', '暠', '暲', '暿', '曺', '朎', '朗', '杦', '枻', '桒', '柀', '栁', '桄', '棏', '﨓', '楨', '﨔', '榘', '槢', '樰', '橫', '橆', '橳', '橾', '櫢', '櫤', '毖', '氿', '汜', '沆', '汯', '泚', '洄', '涇', '浯', '涖', '涬', '淏', '淸', '淲', '淼', '渹', '湜', '渧', '渼', '溿', '澈', '澵', '濵', '瀅', '瀇', '瀨', '炅', '炫', '焏', '焄', '煜', '煆', '煇', '凞', '燁', '燾', '犱', '犾', '猤', '猪', '獷', '玽', '珉', '珖', '珣', '珒', '琇', '珵', '琦', '琪', '琩', '琮', '瑢', '璉', '璟', '甁', '畯', '皂', '皜', '皞', '皛', '皦', '益', '睆', '劯', '砡', '硎', '硤', '硺', '礰', '礼', '神', '祥', '禔', '福', '禛', '竑', '竧', '靖', '竫', '箞', '精', '絈', '絜', '綷', '綠', '緖', '繒', '罇', '羡', '羽', '茁', '荢', '荿', '菇', '菶', '葈', '蒴', '蕓', '蕙', '蕫', '﨟', '薰', '蘒', '﨡', '蠇', '裵', '訒', '訷', '詹', '誧', '誾', '諟', '諸', '諶', '譓', '譿', '賰', '賴', '贒', '赶', '﨣', '軏', '﨤', '逸', '遧', '郞', '都', '鄕', '鄧', '釚', '釗', '釞', '釭', '釮', '釤', '釥', '鈆', '鈐', '鈊', '鈺', '鉀', '鈼', '鉎', '鉙', '鉑', '鈹', '鉧', '銧', '鉷', '鉸', '鋧', '鋗', '鋙', '鋐', '﨧', '鋕', '鋠', '鋓', '錥', '錡', '鋻', '﨨', '錞', '鋿', '錝', '錂', '鍰', '鍗', '鎤', '鏆', '鏞', '鏸', '鐱', '鑅', '鑈', '閒', '隆', '﨩', '隝', '隯', '霳', '霻', '靃', '靍', '靏', '靑', '靕', '顗', '顥', '飯', '飼', '餧', '館', '馞', '驎', '髙', '髜', '魵', '魲', '鮏', '鮱', '鮻', '鰀', '鵰', '鵫', '鶴', '鸙', '黑', 'ⅰ', 'ⅱ', 'ⅲ', 'ⅳ', 'ⅴ', 'ⅵ', 'ⅶ', 'ⅷ', 'ⅸ', 'ⅹ', '¦', ''', '"' );
  $replace = array('(1)','(2)','(3)','(4)','(5)','(6)','(7)','(8)','(9)','(10)','(11)','(12)','(13)','(14)','(15)','(16)','(17)','(18)','(19)','(20)','I','II','III','IV','V','VI','VII','VIII','IX','X','ミリ','キロ','センチ','メートル','グラム','トン','アール','ヘクタール','リットル','ワット','カロリー','ドル','セント','パーセント','ミリバール','ページ','mm','cm','km','mg','kg','cc','m2','平成' );
  $result = str_replace($search, $replace, $subject);
  return $result;
}
$test = '①テスト2㍉3日本語のテストです';
$result = replace_kishu_kanji($test);
echo $test;
No.978
11/19 11:18

edit

日本語

PHPでURLの存在を確認する

PHPでURLの存在を確認するには以下のようにします。

$url = 'http://XXX.XXX.XXXXXX';
if($fp = @fopen($url, 'r')){
  fclose($fp);
  echo '存在します';
}
else{
  echo '存在しません';
}
No.977
10/14 11:22

edit

PHPから日本語フォントを使ってPDFを生成、出力する【TCPDF】

PHPから動的にPDFを生成し出力やプリントするには古くは【FPDF】を使用しましたが、現在では【TCPDF】を使用します。 TCPDFを利用するメリットは以下のとおり

・文字コード「UTF-8」が使用できる
・TTFフォントを変換しなくても使用できる(自動変換が行われる)

#1. TCPDFのダウンロードと設置 http://sourceforge.net/projects/tcpdf/files/ からダウンロードしてフォルダごとサーバにアップロード

#2. フォント(.ttf)のアップロード 【tcpdf/fonts】の中に【ttf】フォルダを作ってそこにフォントファイルをアップロードします。

#3. TCPDFを使ったPHPからのPDF出力 デフォルトで入っている「Hrlvetica」と自分でアップロードした「IPAゴシック」を使ってPDF出力する例
「IPAゴシック」のフォントファイルは http://ipafont.ipa.go.jp/old/ipafont/download.html からダウンロードし ( ./tcpdf/fonts/ttf/ipaexg.ttf )に置いておきます

require_once('tcpdf/tcpdf.php');
$pdf = new TCPDF("L", "mm", "A4", true, "UTF-8" );
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->AddPage();
$font = new TCPDF_FONTS();
// フォント:helvetica
$font_0 = $font->addTTFfont( 'フォントファイルまでのフルパス/helvetica.php');
$pdf->SetFont($font_0 , '', 32,'',true);
$pdf->Text(0, 0, "alphabetica ABCDEFG" );
// フォント:IPAゴシック
$font_1 = $font->addTTFfont('フォントファイルまでのフルパス/ipaexg.ttf');
$pdf->SetFont($font_1 , '', 32,'',true);
$pdf->Text(0, 15, "美しい日本語のフォントを表示" );
$pdf->Output("cd_cover_template.pdf", "I");
No.967
11/18 14:02

edit

pdf
日本語
画像

PHP 5.4のE_STRICTエラーに対応する

PHP 5.4からは 5.3までは出力されなかった【E_STRICTエラー】がデフォルトで出力されるようになっています。 なのでPHPのバージョンを 5.3以下から5.4以上に上げるとE_STRICTエラーが表示されることがよくあります。

1. PHP 5.4のE_STRICTエラーの対処法(ソースを修正する)

自分で書いたソースの場合はエラーの内容を調べて修正するのが一番よいでしょう。
http://goo.gl/moKrOg

2. PHP 5.4のE_STRICTエラーの対処法(エラーを表示しないようにする)

そもそもPHPのバージョンが5.3以下の場合は出力されてなかったエラーなので、そもそもエラーを表示させないという手法。 古いPEARパッケージにはこのエラーが含まれていることが多いので以下のようにエラーが出る箇所を【エラー設定】【エラー戻し】で囲むといいでしょう。

// 【エラー設定】E_STRICT , E_DEPRECATED を非表示
$old_error = error_reporting( E_ALL & ~E_STRICT & ~E_DEPRECATED);

	// PEARパッケージの処理(例)
	require_once 'XML/Unserializer.php'; // 例:PEARの XML::Unserializer は確実にE_STRICTエラーが出ます。
	// 何かしらの処理

// 【エラー戻し】
error_reporting($old_error);
No.966
07/30 22:40

edit

PEAR
XML
エラー対処

Twigテンプレートの変数の中で変数をevalするフィルタ

Twigテンプレートの変数の中で変数をevalするフィルタがとても便利なので紹介します。


```
<?php
class Twig_Extension_Evaluate extends \Twig_Extension {
    public function getFilters( ) {
        return array(
            'evaluate' => new \Twig_Filter_Method( $this, 'evaluate', array(
                'needs_environment' => true,
                'needs_context' => true,
                'is_safe' => array(
                    'evaluate' => true
                )
            ))
        );
    }
    public function evaluate( \Twig_Environment $environment, $context, $string ) {
        $loader = $environment->getLoader( );
        $parsed = $this->parseString( $environment, $context, $string );
        $environment->setLoader( $loader );
        return $parsed;
    }
    protected function parseString( \Twig_Environment $environment, $context, $string ) {
        $environment->setLoader( new \Twig_Loader_String( ) );
        return $environment->render( $string, $context );
    }
    public function getName( ) {
        return 'evaluate';
    }
}
```


#### Twig読み込み時に以下の行を追加
```
$twig->addExtension( new Twig_Extension_Evaluate() );
```

#### 以下のように変数の中の変数が展開できます
```
{% set var = 'inner variable' %}
{{'this is a string with an {{var}}'|evaluate}}
```
 ↓
```
this is a string with an inner variable
```

このような書き方もできます(ハッシュのメンバ名が変数の時に展開する)
```
$data['column_name'] = "data_id";
$data['data_hash']['data_id'] = 999;
```
```
{{data_hash[column_name]|evaluate}}
```
 ↓
```
999
```


引用 : http://goo.gl/Y1LlSz
No.959
08/05 15:42

edit

Twig

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

テンプレートエンジンTwigに自作フィルタを追加する

Twigに自作フィルタを追加するにはフィルタを定義して addFilter するだけでOKです。

例 : ファイルの存在をチェックする file_exists フィルタを追加する(PHPファイル内に以下を追加)

$filter = new Twig_SimpleFilter('file_exists', function ($filename) {
	// ディレクトリは適宜書き換えること
	return file_exists(dirname(__FILE__)."/{$filename}");
});
$twig->addFilter($filter);

使い方(HTML内で以下のように記述)

{% if "test.jpg"|file_exists  %}
	ファイルが存在します
{% else %}
	ファイルは存在しません
{% endif %}
No.955
07/02 14:18

edit

Twig
ファイル

テンプレートエンジン『Twig』と『Smarty』比較表

● テンプレートの読み込みとディレクトリのセット(PHPファイルに記述)

※ Smarty

require_once('Smarty/Smarty.class.php');
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';

※ Twig

require_once('Twig/Autoloader.php');
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem("./templates/");
$twig = new Twig_Environment($loader, array(
	'cache' => 'cache_twig',
	 'debug' => false ,
));

● 変数のアサイン(PHPファイルに記述)

※ Smarty

$smarty->assign( array("mydata" => $hoge) );

※ Twig

$twig->addGlobal( "mydata", $hoge );

● テンプレートの表示(PHPファイルに記述)

※ Smarty

$template_file = 'myfile.html';
$smarty->display( $template_file );

※ Twig

$hash = array(
'id' => 999 ,
'name' => 'hoge' ,
);
$template_file = 'myfile.html'
echo $twig->render($template_file, $hash);

● ループ処理(for 文)(HTMLファイル内に記述)

※ Smarty

{section name=i start=0 loop=10}
  {$smarty.section.i.index}回目
{/section}

※ Twig

{% for i in 0..10 %}
  {{ i }}回目
{% endfor %}

● ループ処理(foreach 文)(HTMLファイル内に記述)

※ Smarty

{ foreach from=$my_loop key="k" item="v" }
{$v.user_name}
{ /foreach }

※ Twig

{% for k,v in my_loop %}
  <h1>{{ loop.index }}番目</h1>
  {% if loop.first %}最初の要素です。
  {% elseif loop.last %}最後の要素です。
  {% else %}{{ v.user_name }}
  {% endif %}   
{% endfor %}

loop.index1 から始まります。

● ファイルのインクルード(HTMLファイル内に記述)

※ Smarty

{include file="inc/header.html"}

※ Twig

{% include 'inc/header.html' %}

● if文(HTMLファイル内に記述)

※ Smarty

{if $flag==1 and hoge == 'myname'}
     hogehoge
{else}
    fugafuga
{/if}

※ Twig

{% if flag == 1 and hoge == 'myname' %}
     hogehoge
{% else %}
    fugafuga
{% endif %}

● コメントアウト(HTMLファイル内に記述)

※ Smarty

{*
ここの間に記述したものはコメントアウトされ表示されません
*}

※ Twig

{#
ここの間に記述したものはコメントアウトされ表示されません
#}

● 文字列のエスケープ(HTMLファイル内に記述)

※ Smarty(エスケープオプションは : html, htmlall, url, urlpathinfo, quotes, hex, hexentity, javascript, mail )

<a href="{$data|escape:'url'}">クリック</a>

※ Twig(エスケープオプションは : html, js, css, url, html_attr )

<a href="{{data|escape('url') }}">クリック</a>
<a href="{{data|e('url') }}">クリック</a> {# 【e】 だけでも OK #}

● 日付の表示(HTMLファイル内に記述)

※ Smarty

{* 2015-07-30 13:04:58 みたいな表示 *}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}

※ Twig

{# 2015-07-30 13:04:58 みたいな表示 #}
{{ "now"|date("Y-m-d H:i:s") }}
{# TIMEZONE を指定することもできます #}
{{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }}

注意 データベースなどから持ってきた日付けを整形する場合はデータが存在するかどうかチェックしてから表示しないと、 データが存在しない場合現在の日付が表示されてしまいます

{% if v.added_date %}{{ v.added_date | date("Y/m/d H:i") }}{% endif %}

● ホワイトスペースと改行をなくして1行で出力する(HTMLファイル内に記述)

※ Smarty

{strip}
<table>
 <tr>
  <td>
   test
  </td>
 </tr>
</table>
{/strip}

※ Twig

{% spaceless %}
<table>
 <tr>
  <td>
   test
  </td>
 </tr>
</table>
{% endspaceless %}

● テンプレートファイル内で変数をセットする(HTMLファイル内に記述)

※ Smarty

{assign var="aaa" value="999" }

※ Twig

{% set aaa = '999' %}

※ Twig(ヒアドキュメント的)

{% set aaa %}
    <div id="pagination">
        ...
    </div>
{% endset %}

● テンプレートファイル内で配列の長さを知る(HTMLファイル内に記述)

※ Smarty

{$test_loop|@count}

※ Twig

{{ test_loop |length }}

● 長い文字列を切り詰める(truncate)(HTMLファイル内に記述)

※ Smarty

{"abcdefghijklmnopqrstuvwxyz"|truncate:10}

※ Twig

Twigで truncate を使うには `Twig-extensionsをインストールします https://github.com/twigphp/Twig-extensions からダウンロードしてExtensionsディレクトリを Twigディレクトリの下にアップロードし PHPで$twig->addExtension( new Twig_Extensions_Extension_Text() );` とします。

{{"abcdefghijklmnopqrstuvwxyz"| truncate(20)}}

Twig_Extensions_Extension_Text : http://bit.ly/2jfkzXw

● 文字列の分割(explode, split)(HTMLファイル内に記述)

※ Smarty

{assign var="new_array" value=","|explode:$str_hoge} 

※ Twig

{% set new_array = "one,two,three"|split(',') %}

● 文字列の置換(replace)(HTMLファイル内に記述)

※ Twig

{{ "my name is hogehoge" | replace({hoge':'fuga'}) }}

● 文字列を逆にする(HTMLファイル内に記述)

※ Twig

{{ '1234'|reverse }}
{# outputs 4321 #}

● 文字列を切り出す(HTMLファイル内に記述)

※ Twig

{{ 123456 | slice(0, 2) }}

● 文字列の連結(HTMLファイル内に記述)

※ Smarty

{ 'sugoude'|cat:'DJ'|cat:'Master Key'}

※ Twig

{{ 'sugoude' ~ 'DJ' ~ 'Master Key' }}

● printf(プリントフォーマット)(HTMLファイル内に記述)

※ Smarty

{ $value | string_format:"%02d" }

 Twig リファレンス : http://git.io/vneJa 

No.954
04/11 15:44

edit

Twig
Smarty

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
01/28 22:17

edit

CodeIgniter

PHPでMD5やSHA1などのハッシュ値を求める

PHPでは古くには md5() や sha1() などのハッシュを求める関数がありましたが 今のやり方では hash() 関数を使用します。

$output =  hash ( $algo , $data , $raw_output );
$algo
選択したアルゴリズムの名前 (すなわち "md5"、"sha256"、"haval160,4" など…)。

$data
ハッシュするメッセージ。

$raw_output
TRUE を設定すると、生のバイナリデータを出力します。 FALSE の場合は小文字の 16 進数値となります。

この関数で md5 SHA1 SHA256 アルゴリズムなどを選択して使用することができます。 使用できるアルゴリズムは以下

md2           32bit
md4           32bit
md5           32bit
sha1          40bit
sha256        64bit
sha384        96bit
sha512       128bit
ripemd128     32bit
ripemd160     40bit
ripemd256     64bit
ripemd320     80bit
whirlpool    128bit
tiger128,3    32bit
tiger160,3    40bit
tiger192,3    48bit
tiger128,4    32bit
tiger160,4    40bit
tiger192,4    48bit
snefru        64bit
gost          64bit
adler32        8bit
crc32          8bit
crc32b         8bit
haval128,3    32bit
haval160,3    40bit
haval192,3    48bit
haval224,3    56bit
haval256,3    64bit
haval128,4    32bit
haval160,4    40bit
haval192,4    48bit
haval224,4    56bit
haval256,4    64bit
haval128,5    32bit
haval160,5    40bit
haval192,5    48bit
haval224,5    56bit
haval256,5    64bit
No.948
06/08 15:11

edit

Smartyのプラグイン(modifier)に複数の引数を渡す

modifierプラグインは

{$hoge|my_modifier}

と記述すると、プラグインを記述した関数

function smarty_modifier_my_modifier($a){

}

$a に $hoge の内容が渡ります。


■ modifierプラグインに複数の引数を渡すには

{$hoge|my_modifier:'arg1':'arg2'}

と記述します。

すると

function smarty_modifier_my_modifier($a, $b, $c){

}

$a に $hoge が

$b に 'arg1' が

$c に 'arg2' が

渡ります

No.943
05/12 12:43

edit

Smarty

PHPでファイルをダウンロードさせる

PHPでファイルをダウンロードさせるにはブラウザにダウンロードファイルを知らせるためのヘッダとファイル名を送ります

例 : test.csv というファイル名でダウンロードさせる

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=test.csv");
print 'ファイル内容';
No.932
04/20 16:24

edit

ファイル

PHPのforeachループ内で「配列の最初かどうか?」「最後かどうか?」を調べる

PHPでforeachループで回している時に、配列の先頭かどうか?最後かどうか?を調べるには次のようにします。

foreach ($hash as $k => $v) {
    if (reset(array_keys($hash)) === $k) {
        print "先頭の要素です";
    }
    if (end(array_keys($hash)) === $k) {
        print "最後の要素です";
    }
}
No.926
02/23 16:27

edit

配列

PHPでPDFを生成する【FPDF】

(こちらに記述してあるのはFPDFを使った古いやり方です。TCPDFを使った新しいやり方はこちら↓)

http://logic.moo.jp/data/archives/967.html



■FPDFのダウンロード

■ FPDF Version 1.7

http://www.fpdf.org/en/dl.php?v=17&f=zip

(ZIPファイルをダウンロードできるので解凍します。)

最新バージョンはこちらから確認して下さい。

http://www.fpdf.org/

■ FPDFのインストール

サーバ上にフォルダ 【fpdf】 を作りそこに

fpdf.php
「fontフォルダ」
「makefontフォルダ」

をアップロード

■ FPDFの実行

require_once 'fpdf/fpdf.php';
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World! FPDF Sample !!');
$pdf->Output();	

でブラウザにpdfファイルが表示されます。

No.915
07/30 22:59

edit

pdf

PHPで文字列を数値型に変換する。

PHPで文字列を数値型に変換するには intval() を使用します。

// クォーテーションで囲って文字列型の変数を生成
$str = "99";
// 文字列型を数値型に変換する
$num = intval($str);
No.910
01/25 18:22

edit

PHPで文字コードを指定したヘッダを返す

PHPで文字コードを指定したヘッダを返すには以下のようにします。

// UTF-8 の場合
header("Content-type: text/html; charset=UTF-8");
// Shift-JISの場合
header("Content-type: text/html; charset=Shift_JIS");
// euc-jp
header("Content-type: text/html; charset=euc-jp");

またPHPで明示的に文字コードを設定したい場合はもともとのPHP設定でエンコーディングが明確に指定されていない場合が多いです。

ですので以下のようにまとめて設定するといいでしょう

PHP文字コード関連をまとめて設定(PHP 5.6対応)

$encoding = 'UTF-8';
mb_internal_encoding($encoding);
$pv = floatval(phpversion());
if ($pv <= 5.5){ ini_set('mbstring.internal_encoding', $encoding); }
ini_set('mbstring.script_encoding', $encoding);
header("Content-Type: text/html; charset={$encoding}");

No.899
08/10 17:12

edit

PHPでSQLite3を扱う

PHP5.3以降からSQLite3を扱うクラスが用意されています。

これを使うとSQLiteの操作がとても簡単なのでこちらで紹介します。

■1. PHPからSQLite3のデータベース(test.db)テーブル(test_tbl)を作成する

<?php
// 作成するデータベース名
$db_name = 'test.db';
// 作成するテーブルのSQL
$sql = <<<DOC_END
CREATE TABLE test_tbl (
	test_id    INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
	test_name  TEXT
)
DOC_END;
// INSERTするデータのSQL
$sql2 = <<<DOC_END
INSERT INTO test_tbl(test_id, test_name) VALUES(1, '細野晴臣');
INSERT INTO test_tbl(test_id, test_name) VALUES(2, 'ほそのはるおみ');
INSERT INTO test_tbl(test_id, test_name) VALUES(3, 'ホソノハルオミ');
DOC_END;

try {
  $db = new SQLite3($db_name);
} catch (Exception $e) {
  print 'DB接続エラー。<br>';
  print $e->getTraceAsString();
}
$db->exec( $sql );
$db->exec( $sql2 );
$db->close();
?>

なおSQLiteでデータベースのカラムに指定できる「型」は次の5つ

TEXT
NUMERIC
INTEGER
REAL
NONE

DATEやDATETIME型は存在しないのでTEXT型で処理するのがいいでしょう。


■2. PHPでSQLite3データベースのデータを取得(SELECT)する

<?php
$encoding = 'UTF-8';
mb_internal_encoding($encoding);
ini_set('mbstring.internal_encoding', $encoding);
ini_set('mbstring.script_encoding', $encoding);
header("Content-Type: text/html; charset={$encoding}");

// 接続するデータベース名
$db_name = 'test.db';

try {
  $db = new SQLite3($db_name);
} catch (Exception $e) {
  print 'DB接続エラー。<br>';
  print $e->getTraceAsString();
}

$results = $db->query('SELECT * FROM test_tbl');
print '<pre>';
while ($row = $results->fetchArray(SQLITE3_ASSOC)) {
  print_r($row);
  print '<br>';
}
print '</pre>';

$db->close();
?>

■3. 知っておくと便利なSQLiteのSQL文

あるテーブル(test_tbl)の構造を取得する

PRAGMA table_info(test_tbl);

全てのテーブルを表示する(MySQLでいうところの show tables; )

select name from sqlite_master where type = 'table'

auto increment の値をリセットする

update sqlite_sequence set seq=1 where name='テーブル名';

■4. SQLite のSQL文を実行するプログラム(PHP)

http://logic.moo.jp/data/filedir/897_1.zip

↑ このファイルをダウンロードして自分のサーバ上にて実行してください。

SQL文入力画面が表示されます。

■5. SQLite (拡張子 .db のファイル)を直接操作するアプリ【Lita】【sqlitebrowser】

■ Lita

http://www.dehats.com/drupal/?q=node/58

■ sqlite browser

http://sourceforge.net/projects/sqlitebrowser/

データベースファイル( *.db )を直接開くと色々操作できます。とても便利。

<b>(※注意 なおWEBサービス運用中のデータベースファイルを開く時はコピーして別名で操作することをおすすめします)</b>

■6. SQLite (拡張子 .db のファイル)を直接操作するFirefoxアドオン【SQLite Manager】

https://addons.mozilla.org/ja/firefox/addon/sqlite-manager/

既存のデータを残しつつテーブル構造を変更するときはこのアドオンが便利です。

■7. MySQLのSQL文をSQLite用に変換する

http://flatsystems.net/js_mysql_to_sqlite.html

添付ファイル1

PHPからTwitter API 1.1 を使って Twitterに自動書き込みする。【tmhOAuth】

■ tmhOAuth

https://github.com/themattharris/tmhOAuth

↑ ここからダウンロードして tmhOAuth.php をサーバにアップします。

■ コーディング例(自分のアカウントに hoge hoge hoge とつぶやきます。)

require_once 'tmhOAuth.php';
$twitter = new tmhOAuth(
	array(
		'consumer_key'        => 'aaaaa' ,
		'consumer_secret'     => 'bbbbb' ,
		'token'               => 'ccccc' ,
		'secret'              => 'ddddd' ,
		'curl_ssl_verifypeer' => false ,
		'timezone'            => 'Asia/Tokyo' ,
	)
);
$r = $twitter->request('POST', $twitter->url('1.1/statuses/update'), array(
	'status' => 'hoge hoge hoge'
), true, false);
// 正常終了なら $r に 200 が返る。 
print '<pre>'; print_r($twitter); print '</pre>';

■ Twitter REST API v1.1 Resources (ツイッターAPIのリファレンス)

https://dev.twitter.com/docs/api/1.1


その他参考:

tmhOAuth を使って twitter に画像つきつぶやきを投稿するには

No.891
06/25 17:16

edit

API
Twitter

PHPでメールアドレスのチェックを【filter_var】【正規表現】で行う。

PHP5.2から filter_var というメールアドレス等をチェックする関数が追加されています。

filter_var でのメールアドレスのチェック

filter_var('bob@example.com', FILTER_VALIDATE_EMAIL);

便利なのですが昔の日本の携帯アドレスはRFC準拠していなくても使えていたみたいですし、そういったアドレスはエラーとされてしまいます。

それなら正規表現のほうがカスタマイズがきいていいような気がします。

正規表現でのメールアドレスチェッククラス【AddressValidate.php】

PHPのメジャーフレームワークの正規表現を網羅してクラス化してあります。便利!

http://d.hatena.ne.jp/m-tag/20081118/1227000201

PHPメジャーフレームワークの正規表現

CakePHP 1.2

/^[a-z0-9!#$%&'*+\/=?^_`|~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`|~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[a-z]2,4|museum|travel)$/i

CakePHP 1.3

/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[-_a-z0-9][-_a-z0-9]*\.)*(?:[a-z0-9][-a-z0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,4}|museum|travel)/i

Ethna

/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i

正規表現がチェックできるサイト

http://www.rubular.com/


Perlの場合CPANの Email::Valid を使うのがいいでしょう

http://search.cpan.org/search?query=Email%3A%3AValid&mode=all


参考

http://d.hatena.ne.jp/j0hn/20070602

http://d.hatena.ne.jp/m-tag/20081118/1227000201

添付ファイル1
No.889
08/12 10:29

edit

添付ファイル

正規表現
メール

外部SMTPサーバを利用してメールを送信する。

外部SMTPサーバを利用してメールを送信するには PEAR:Mail を利用します。

必要な PEAR パッケージ(ダウンロードしてサーバ上にアップ)

( PEAR:Mail )

( PEAR:Net:SMTP )

( PEAR:Net:Socket )

PHPコードは以下のように記述します。

『例』

送信元 : xxxxx@hoge.com

送信先 : xxxxx@fugafuga.com

使用するSMTPサーバ : mail.fugafuga.com

ユーザー名 : xxxxx@fugafuga.com

パスワード : aiueoaiueo

$to = 'xxxxx@hoge.com';
$from = 'xxxxx@fugafuga.com';
$mailtext = 'メール送信テスト';

// PEAR:Mail
require_once "Mail.php";
$params = array(
  'host' => 'mail.fugafuga.com',
  'port' => '587',
  'auth' => true,
  'username' => 'xxxxx@fugafuga.com',
  'password' => 'aiueoaiueo',
);		
$headers['From']    = $from;
$headers['To']      = $to;
$headers['Subject'] = mb_encode_mimeheader($subject);
$mailtext = mb_convert_encoding($mailtext, "ISO-2022-JP", "auto");
$objMail =& Mail::factory('smtp', $params);
$result = $objMail->send($to, $headers, $mailtext);
if (PEAR::isError($result)) {
	die($result->getMessage());
}

その他のクラスとしては

phpmailer : https://packagist.org/packages/phpmailer/phpmailer

がおすすめです

No.881
03/08 20:32

edit

メール
PEAR

ブログ更新Ping(XML RPC)受信サーバをPHPで作る

ブログ更新Ping(XML RPC)受信サーバをPHPで作る。

1. 更新Pingの受信

まずブログシステムで更新した時に飛んでくるPingを受けるには以下のようにします。

$xml = mb_convert_encoding(file_get_contents("php://input"), "UTF-8", "auto");
if (!$xml) {
	return false;
}
else{
	$data_obj = new SimpleXMLElement($xml);
	$data = (ARRAY)$data_obj;
	// ここに受信したデータの処理を記述
	・・・・・・・・・・
}

2.成功or失敗コードの出力

処理後に成功または失敗コードを返してやります。

下記コードをテンプレートとして持っておいて header ('Content-Type: text/xml'); の後に送信するのがカスタマイズも楽でいいでしょう。

成功時の戻り値の例

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
 <param>
  <value>
   <struct>
    <member>
     <name>flerror</name>
     <value>
      <boolean>0</boolean>
     </value>
    </member>
    <member>
     <name>message</name>
     <value>
      <string>OK</string>
     </value>
    </member>
   </struct>
  </value>
 </param>
</params>
</methodResponse>

失敗時の戻り値の例

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
 <params>
  <param>
   <value>
    <struct>
     <member>
      <name>flerror</name>
      <value>
       <boolean>1</boolean>
      </value>
     </member>
     <member>
      <name>message</name>
      <value>
       <string>Unable to process</string>
      </value>
     </member>
    </struct>
   </value>
  </param>
 </params>
</methodResponse>
No.880
03/18 17:35

edit

XML
API

日本語(全角文字)を指定文字数で折り返す(word wrap)Smartyプラグイン

ある文章を指定文字数折り返(強制改行)したい時があります。

そんな時に便利なのがSmartyのwordwrapプラグインがありますが、日本語や全角文字には対応していないので使用出来ません。

そこで日本語対応のSmartyプラグイン

■ modifier.unicode_wordwrap

(引用元:http://goo.gl/JmZjK にインデント機能を拡張しました。)

ファイル名 modifier.unicode_wordwrap.php で下記コードを保存し plugins フォルダに格納

<?php
function smarty_modifier_unicode_wordwrap($str, $len=80, $break="\n", $indent='' ){
	$str = str_replace( "\r", $break, str_replace( "\r", "\n", str_replace("\r\n", "\n", $str) ) );
	$str = preg_replace('/(.{'.$len.'})/u', '${1}'.$break, $str);
	if (strcmp($indent,'')==0){ return $str; }
	else{
		$ar  = preg_split("/{$break}/",$str);
		for($i=0 ; $i<count($ar); $i++){
			$ar[$i] = $indent.$ar[$i];
		}
		return join($break, $ar);
	}
}
?>

使い方

下記の例だと($my_text を日本語40文字で折り返して各業の文頭に■を追加)となります。

{$my_text|unicode_wordwrap:40:"\n":"■"}

第1引数 : 文字数(デフォルト値:80)
第2引数 : 改行コード(デフォルト値:¥n)
第3引数 : インデント(デフォルト値:ナシ)

です。

No.873
02/06 16:23

edit

Smarty
日本語

phpの実行時間を計測する

下記の方法がわかりやすくよいです。

$start_time = microtime(true);
echo "開始時間: ".format_microtime($start_time,'Y-m-d H:i:s')."<br>\n";

// ここに計測したい処理を記述

$end_time = microtime(true);
echo "終了時間: ".format_microtime($end_time,'Y-m-d H:i:s')."<br>\n";
$processing_time = $end_time - $start_time;
echo "処理時間:".format_microtime($processing_time)."秒<br>\n";
exit();

function format_microtime ( $time, $format = null ){
  if (is_string($format)) {
    $sec  = (int)$time;
    $msec = (int)(($time - $sec) * 100000);
    $formated = date($format, $sec). '.'. $msec;
  } else {
    $formated = sprintf('%0.5f', $time);
  }
  return $formated;
}

No.859
04/19 11:17

edit

高速化

Smartyテンプレート内で乱数(ランダム文字列)を発生させる

例えば管理画面で画像をキャッシュさせたくない場合など

Smartyテンプレート内で乱数(ランダムな文字列)を発生させて

<img src="test.jpg?123">

などとするといいでしょう。

そこで乱数を発生させるには

{0|rand:999}

つまり

<img src="test.jpg?{0|rand:999}">

となります。

No.845
11/01 11:43

edit

Smarty

UTF-8を使った正規表現でエラー「this version of PCRE is not compiled with PCRE_UTF8」の場合の対応

PHPで UTF-8 を使った正規表現の命令時 ( preg_match('test/u', $str); )に

以下のようなエラー

Compilation failed: this version of PCRE is not compiled with PCRE_UTF8 support

が出ることがあります。

これは「PCREがUTF-8をサポートしていないときに出るエラーです。」

PCREのサポート状況を知るにはコマンド【pcretest -C】を実行するか、

pcretest.php を以下の内容で保存してWEBブラウザから実行します。

pcretest.php

<?php
print '<pre>';
print '<h1>実行コマンド:pcretest -C</h1>';
print ( shell_exec('pcretest -C') );
print '</pre>';
?>

これでUTF-8サポートがなければ再度PCRE, PHPをコンパイルしましょう。

レンタルサーバの場合は仕方ないので preg_match などの /u オプションを取り除いたコーディングとしましょう。



No.839
03/21 22:46

edit

正規表現にマッチするかどうか判別する Smarty Plugin

正規表現にマッチするかどうか判別する Smarty Plugin。

ファイル名 modifier.ext_preg.php で以下のとおり作成

<?php
function smarty_modifier_ext_preg($string='', $preg_pattern=''){
	if (strcmp($string,'')==0 || strcmp($preg_pattern,'')==0){ return false; }
	if (preg_match($preg_pattern, $string)){
		return true;
	}
	else{
		return false;
	}
}

使い方 ( $file にファイル名が入っているものとします )

{ if $file|ext_preg:'/(mp4$)/i' }動画です
{ elseif $file|ext_preg:'/(gif$|jpg$|jpeg$|png$|bmp$)/i' }画像です
{ /if }
No.837
09/17 12:44

edit

Smarty

PHPで安全なファイルロック

PHPでファイルロック(排他制御)をするのは標準の flock 関数が簡単で有効です。

しかし flock関数はサーバーによっては正常動作しない(排他制御が出来ない、またはロックしたままプロセスが死ぬとロック解除が出来ない)ことがまれにあります。(サーバーによります。)

ですのでPHPスクリプトをアップロードする先のサーバーが flock が正常に動作するか毎回確認しないといけません。

また flock関数ではロックのトライ時間(タイムアウト時間)を自由に設定することができません。

そこで Perlメモ( http://is.gd/cKqS11 )の有名なファイルリネーム方式のファイルロックを採用します。

すでにPHPに移植されている方がいるのでそこから引用( http://is.gd/rj4aOc )

◆ ダウンロード

http://logic.moo.jp/data/filedir/834_3.zip

◆ 使い方

require_once('exfilelock.php');
$exfl = new exfilelock();
$exfl->flock() or die('ERROR : LOCK ERROR');

// ここに排他制御して実行したい何かしらの処理を記述

$exfl->unflock() or die('ERROR : UNLOCK ERROR');

ファイルロックのテストスクリプト

test_filelock.php:ロックを使ったカウンターアップのテスト

ファイルを解凍してできるディレクトリ「data」「lockdir」のパーミッションを777にして「test_filelock.php」をブラウザのタブで同時に10個実行します。

カウンターが正常に1000までいけばOK。

添付ファイル1
添付ファイル2
No.834
03/28 16:04

edit

添付ファイル

ファイル

画像ファイルの width, height を取得して挿入するSmarty Plugin

画像ファイルの width, height を取得して挿入するSmarty Plugin

ファイル名 : modifier.image_wh.php で保存

<?php
function smarty_modifier_image_wh($file_name='') {
    if (! $file_name ) { return "error:{$file_name}"; }
    if (!is_file($file_name)) { return "error:{$file_name}"; }
    list($width, $height, $type, $attr) = getimagesize($file_name);
    if ($width && $height){
        return 'width="' .$width. '" height="'.$height.'"';
    }
    else{
        return "error: can not get width height:{$file_name}";
    }
}

使い方

<img src="{$image_file}" {$image_file|image_wh} />{/if}

とすると width="100" height="200" といった情報が入ります。

なお変数に入ったディレクトリも指定する場合は

{$image_file|image_wh}
  ↓
{"`$data_dir`/`$image_file`"|image_wh}

とします。


No.833
01/05 11:43

edit

Smarty
画像
ファイル

拡張子 .html でphpを動かす

.htaccess ファイル内に以下の内容を作成して動作させたいフォルダに置きます。

php5の場合

AddHandler php5-script .php .html

php4の場合

AddHandler application/x-httpd-php .php .html

No.831
07/14 14:07

edit

.htaccess

PHPのオブジェクトを連想配列などに変換する。

PHPのオブジェクト($data_obj)を連想配列など($data_array)に変換するには。

$data_array = (ARRAY)$data_obj;

と(ARRAY)をつけると配列型にキャストされます。


No.827
11/17 17:45

edit

PHPでURLからローカルにファイルをダウンロードする

PHPでURLからローカルにファイルをダウンロードするには以下のようにします。

function file_download($url, $dir='.', $save_base_name='' ){
	if ( ! is_dir($dir) ){ die("ディレクトリ({$dir})が存在しません。");}
	$dir = preg_replace("{/$}","",$dir);
	$p = pathinfo($url);
	$local_filename = '';
	if ( $save_base_name ){ $local_filename = "{$dir}/{$save_base_name}.{$p['extension']}"; }
	else{ $local_filename = "{$dir}/{$p['filename']}.{$p['extension']}"; }
	if ( is_file( $local_filename ) ){ print "すでにファイル({$local_filename})が存在します<br>\n";}
	$tmp = file_get_contents($url);
	if (! $tmp){ die("URL({$url})からダウンロードできませんでした。");}
	$fp = fopen($local_filename, 'w');
	fwrite($fp, $tmp);
	fclose($fp);
}

実行は

// ■1. ファイル名「hogehoge.jpg」でディレクトリ「images」に保存する場合
file_download('http://www.xxx.xxx.jp/hogehoge.jpg', 'images');

// ■2. ファイル名「0001.jpg」でディレクトリ「images」に保存する場合
file_download('http://www.xxx.xxx.jp/hogehoge.jpg', 'images', '0001');
No.825
01/19 16:51

edit

ファイル

PHPで画象をトリミング・縮小し、正方形のサムネイルを作成する

PHPで画象をトリミング・縮小し、正方形のサムネイルを作成するには【GD】【ImageMagick】などのライブラリを使用するのが簡単でおすすめです。

GD(resizeimg.class.phpという便利なクラス)を使用する

http://www.oldoffice.co.jp/php_demo/gd.php

(またはこのエントリーの一番下↓でもダウンロード出来ます。)

require_once("resizeimg.class.php");
$ri = new resizeImage();
$input_image =  "images/bluehills.jpg";    //元画像ファイルパス(URLでも可)
$width = 80;
$height = 80;
$output_image = $ri->dispResizeImgPath($input_image,$width,$height);

// サイズを自動計算させるには数値の代わりに * を入れる
$output_image = $ri->dispResizeImgPath($input_image,$width,'*');

// ※指定サイズの枠内に収まるように ※第4引数に「ss」で縮小のみに指定

ImageMagickを使用する

$width = 200;
$height = 200;
//Imagick
$image = new imagick();
$image->readImage('sample.jpg');
$image->cropThumbnailImage($width, $height);
$image->writeImage('sample_imagick.jpg');

添付ファイル1
No.800
05/23 12:09

edit

添付ファイル

画像

Googleサジェスト(Yahoo, Bing, Amazon, Youtubeも)APIを使用する

Googleサジェストや他の検索エンジンやアマゾンのサジェストをPHPで使用するには下記のように記述します。

($url = ''; の定義を複数行記述していますので、使用したいAPI以外の行をコメントアウトしてください。)

$text   = 'ジャズ';
// Google
$url = 'http://suggestqueries.google.com/complete/search?hl=ja&qu='.urlencode($text);
// Youtube
$url = 'http://clients1.google.com/complete/search?hl=en&ds=yt&client=firefox&q='.urlencode($text);
// Amazon
$url = 'http://completion.amazon.co.jp/search/complete?method=completion&search-alias=aps&mkt=6&q='.urlencode($text);
// Yahoo
$url = 'http://asprov.search.yahoo.co.jp/AssistSearchService/V2/webassistSearch?output=iejson&callback=ytopAssist&p='.urlencode($text);
// Bing
$url = 'http://api.bing.net/osjson.aspx?FORM=OPERAS&Market=ja&Query='.urlencode($text);
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF8');
$data = json_decode($json,true);
print "<pre>";
print_r($data);
print "</pre>";

Bingでの使用例(「ジャズ」という単語でサジェストした結果)

Array
(
    [0] => ジャズ
    [1] => Array
        (
            [0] => ジャズドリーム
            [1] => ジャズドリーム長島
            [2] => ジャズダンス
            [3] => ジャズドリーム長島 クーポン
            [4] => ジャズピアノ
            [5] => ジャズドリーム長島 セール
            [6] => ジャズ 名曲
            [7] => ジャズマスター
        )
)

となります。

No.792
04/26 10:52

edit

API

phpのソースコードから不要なコメント、スペースを削除してきれいに整形する

phpのソースコードから不要なコメント・スペース・改行を削除するには下記のコマンドが有効です(シェルのコマンドラインやターミナルから実行)

mysource.php から不要なコメント・スペース・改行を削除

php -w mysource.php > mysource_min.php

これだけです。簡単。

改行も削除されてプチ難読化されたコードになります。

これでは読みづらい、という場合は php_beautifier を使って読みやすいコードに変換します。

■ PEAR PHP_Beautifier

http://pear.php.net/package/PHP_Beautifier/download

php_beautifier -t mysource_min.php > mysource_beautifier.php
# -t オプションを指定して タブによるインデントを加えています(デフォルトはスペース4つ)

php_beautifierコマンドがうまく動かない場合は

直接ダウンロードして

http://pear.php.net/package/PHP_Beautifier/download

解凍して出来たフォルダの「scripts」フォルダ内の「php_beautifier」を動かせば動作します

php php_beautifier 【整形したいphpソース】 >【出力ファイル名】

■ php_packer.php

下記 php_packer.php をダウンロードして

php_packer.php -i ファイル名(またはディレクトリ名)

でディレクトリごと一括で処理できます。

添付ファイル1
No.784
10/26 13:12

edit

添付ファイル

PEAR

Googleの短縮URLサービスAPI goo.gl をPHPから使用する

Googleの短縮URLサービス goo.gl をPHPから使用するには以下のようなコードで実現できます。

1. APIキー( api_key )を取得する

https://code.google.com/apis/console/

ここから取得できます

2. 以下のPHPコードで実現できます( $api_key に取得したキーをセットすること )

function get_tiny_url($long_url=''){
	$api_url = 'https://www.googleapis.com/urlshortener/v1/url';
	$api_key = 'XXXXXXXXXXX';
	$curl = curl_init("$api_url?key=$api_key");
	curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
	curl_setopt($curl, CURLOPT_POST, 1);
	curl_setopt($curl, CURLOPT_POSTFIELDS, '{"longUrl":"' . $long_url . '"}');
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	$res = curl_exec($curl);
	curl_close($curl);
	$json = json_decode($res);
	$tiny_url = $json->id;
	return $tiny_url;
}

使い方

$long_url = 'http://xxxx.xxxx.xxx.com/xxxxxxxxxxxxxx.html';
$tiny_url = get_tiny_url($long_url);

No.781
04/04 17:46

edit

API
URL

PHP(PEAR:HTTP_OAuth)でTwitter等各種サービスにOAuthログインをする。

PEARでTwitter等各種サービスにOAuthログインをする。(https SSL対応)

必要なPEARパッケージを下記からダウンロードする

面倒な方は

http://logic.moo.jp/memo.php?cmd=download&data_id=780&file=780_1.zip

をダウンロードして(lib)フォルダをそのままコピーしてください。

Twitterにアプリケーションを登録して「Consumer key」「Consumer secret」を取得する

https://twitter.com/apps

【新しいアプリケーションを追加】を押して、アプリ情報を入力して登録を完了させる。

登録完了後に表示される画面から

・Cunsumer Key
・Consumer secret
・Request token URL (フォローをリクエストしました)
・Access token URL
・Authorize URL

をメモしておく

後は下記コードにメモした情報をコピペすればOK($callback_url にはプログラムのURLをセットする。)

$path = './lib';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
include 'HTTP/OAuth/Consumer.php';
$consumer_key      = 'XXXXXXXXXX';
$consumer_secret   = 'XXXXXXXXXX';
$get_request_token = 'https://twitter.com/oauth/request_token';
$get_access_token  = 'https://twitter.com/oauth/access_token';
$get_authorize     = 'https://twitter.com/oauth/authorize';
// $get_authorize     = 'https://twitter.com/oauth/authenticate'; // 毎回出る
認証画面をskipしたい時
$callback_url      = 'XXXXXXXXXX';
$oauth = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
// ssl証明書
$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);
$oauth_request = new HTTP_OAuth_Consumer_Request;
$oauth_request->accept($http_request);
$oauth->accept($oauth_request);
$oauth_flag = false;
session_start();
if (empty($_SESSION['oauth_access_token']) && empty($_GET['oauth_verifier'])) {
	// 1. 初回呼び出し時
	$oauth->getRequestToken($get_request_token, $callback_url);
	$_SESSION['oauth_request_token'] = $oauth->getToken();
	$_SESSION['oauth_request_token_secret'] = $oauth->getTokenSecret();
	$_SESSION['oauth_state'] = "start";
	$auth_url = $oauth->getAuthorizeURL($get_authorize);
	// header("Location: $auth_url");					// A. リダイレクト
	print('<a href="'.$auth_url.'">'.$auth_url.'</a>');	// B. リンク表示
}
elseif( isset($_GET['oauth_verifier']) ){
	// 2. サービスから帰ってきたとき
	$oauth->setToken($_SESSION['oauth_request_token']);
	$oauth->setTokenSecret($_SESSION['oauth_request_token_secret']);
	$oauth->getAccessToken($get_access_token, $_GET['oauth_verifier']);
	$_SESSION['oauth_access_token'] = $oauth->getToken();
	$_SESSION['oauth_access_token_secret'] = $oauth->getTokenSecret();
	$oauth_flag = true;
}
else{
	// 3. 認証後にアクセスしたとき
	$oauth_flag = true;
}
if ( $oauth_flag ){
	// ここにやりたい事を記述
	print '<h1>OAUTH OK !</h1>';
}

サンプルコードを実行する

サンプルコードは以下のリンクからダウンロードして下さい。

添付ファイル1
No.780
04/08 18:28

edit

添付ファイル

Twitter
PEAR

PHPでumaskの設定を行う

UNIX系OSでファイルの処理を行うときに必ず気を付けないといけないのがumask。

これはファイル処理を行うときのパーミッション(権限)を指定しておくものです。

まずumaskの確認

printf ("%03o",umask());

結果

022

と帰ってくることが多いと思います。

この状態で新規ファイルを作成するとパーミッションは【644】となります。

新規に作成するファイルのパーミッションを【666】にしたければ

あらかじめ

umask(0000);

としておけばいいでしょう。

No.776
04/11 18:31

edit

ファイル

多次元配列(ハッシュの配列)を並び替える、またはランダム順にする。

データベースから取得したデータをPHP内で並べ替えたり、ランダムに並び替えたい時があります。

関数【array_multisort】を使ってタイトルでソートするには以下のようにすればOKです。

$loop = array(
    array(
        'id' => 1,
        'title' => 'あいうえお',
    ),
    array(
        'id' => 2,
        'title' => 'かきくけこ',
    ),
    array(
        'id' => 3,
        'title' => 'さしすせそ',
    ),
);
$ids = array();
foreach ($loop as $value) {
	array_push($ids,$value['title']);
}
shuffle($ids);	// ランダムにする場合はこの1行を追加
array_multisort($ids, SORT_DESC, $loop);

簡単ですね!

No.775
03/23 13:08

edit

配列

Smartyキャッシュを削除する

Smartyキャッシュを削除するには clear_cache(); を使用します。

void clear_cache(string template,
                 string cache_id,
                 string compile_id,
                 int expire_time);

Smartyを使用したサイトではSmartyキャッシュを使用することにより劇的に高速化されますが、(テストページや一時的に表示したページの)キャッシュファイルをクリアし忘れると、逆にハードディスクに負荷をかけて動作を遅くするおそれがあります。

古い不要キャッシュの削除は必ず行いましょう。

Smarty Cache時間による自動削除の例

// 7日以上古いキャッシュを削除する
$days = 7;
$time = $days * 24 * 60 * 60;
// 10回に1回実行
if( rand(1,10)==1 ){ $smarty->clear_all_cache($time); }

ファイルを使用せずキャッシュにMySQLを使用する

http://www.smarty.net/docsv2/ja/section.template.cache.handler.func.tpl

No.761
08/23 10:43

edit

Smarty
ファイル
高速化

PHPでHTMLタグの閉じ忘れを修正する PECL::Tidy

TidyとはHTMLタグの閉じ忘れを直したりHTML修正を行う便利なソフトです。

Xpathでスクレイピングを行うときにHTMLが完璧でないと正しく取得できないので事前に整形を行います。

なおPECL拡張なのでインストールにはサーバー管理者権限が必要です。

インストールは yum で

yum install php-tidy

apache再起動

apachectl graceful

実際のソースは下記のように記述します。

$html = '<html><body><p>タグの閉じ忘れテスト</body></html>';
if ( ! in_array('tidy',get_loaded_extensions(), true )){
 die('このサーバではtidyが使用できません');
}
$config = array('indent' => false,
                'output-xhtml' => TRUE,
                'wrap' => 200);
$tidy = tidy_parse_string($html, $config, 'UTF8');
$h = tidy_get_html($tidy);
$html = $h->value;

以上の簡単なコードで実現できますが、整形するソースファイルが大きいとメモリ、プロセス共に大量に使用するので注意。

$configに設定できるオプションはこちら

http://tidy.sourceforge.net/docs/quickref.html

No.758
07/13 10:10

edit

Xpath

phpで画像ファイルの拡張子を判別する

phpで画像の拡張子を判別するには

$i = getimagesize($move_filename);
print_r($i);

結果

Array
(
    [0] => 192
    [1] => 273
    [2] => 2
    [3] => width="192" height="273"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)

と帰ってきますので、[mime]のところをみればいいでしょう。


No.751
10/19 09:31

edit

ファイル
画像

PHPでHTTPのステータスコード(404 、 301など)を返す。

HTTPステータスコードとは、ブラウザがリクエストを送信したときに受け取るコードです。

(通常目にすることはありません。 firefox LiveHTTPHeaderなどで確認します。)

HTTPステータスコードの例

301 Moved Permanently
303 See Other
403 Forbidden
404 Not Found

PHPでステータス 301 Moved Permanently を返すには。

header('Status: 301 Moved Permanently');
header('Location: http://hogehoge.com');
exit;

とします。

PHPでステータス 404 Not Found を返すには。

header("HTTP/1.1 404 Not Found");
include ('404.php');
exit;

とします。

404の場合はステータスを返した後に 404.php(ファイル名は任意)というphpを実行します。

(でないと画面が真っ白になる)

404.phpの例(404.html というファイルの中身をそのまま表示する)

<?
$filename = '404.html';
$fp = fopen($filename,'r') or die("ファイル({$filename})のオープンに失敗しました");
while (!feof($fp)) {
$line = fgets($fp, 1024);
print "$line\n";
}
fclose($fp);
?>
No.746
08/18 16:27

edit

PHPでXMLのXSLT変換を行う。

XMLファイルからHTMLファイルを作成したい時、XSLTを使うと早い場合があります。

そのサンプル

<?php
$xml = new DomDocument();
$xml->load('test.xml');
$xsl = new DomDocument();
$xsl->load('sample01.xsl');
$processor = new xsltprocessor();
$processor->importStyleSheet($xsl);
echo $processor->transformToXML($xml);
?>

XSLT書式

http://vosegus.org/guideline/xslt.html

例:そのノードのテキストが hoge の場合のみ ZZZZZZZZZ を表示する

<xsl:if test="contains(./text() , 'hoge')">
ZZZZZZZZZ
</xsl:if>

襟:デフォルト値をセットする

<xsl:param name="contents">デフォルト値</xsl:param>
No.741
04/08 10:00

edit

Xpath
XML

PHPで顔認識 openCV

画像ファイルに人物(顔が含まれるかどうか?)を判断するには openCV というのを使用します。

openCVのインストール

yum -y install opencv

re2cのインストール(インストールされている場合はスキップ)

tar zxvf re2c-0.12.2.tar.gz
cd re2c-0.12.2
./configure
make
su
make install

PHP拡張をインストール

http://hirokawa.netflowers.jp/entry/4874/

apacheを再起動

apachectl graceful


No.731
10/19 09:31

edit

画像

phpでxpathを使ってスクレイピング(WEBページの取得)とXpathの書式例

■ 1. まず php-xml のインストール

yum install php-xml

■ 2. 実際のサイトからスクレイピングを行って Xpath で要素を取得のPHPコード

test.server.com から WEBページを取得してきて<div id="myid">の要素を取得します。

$url='http://test.server.com';
// file_get_contents を使うより高速、ただしメモリは食う
require_once 'HTTP/Client.php';
$client =& new HTTP_Client();
$client->get($url);
$response = $client->currentResponse();
$dom = @DOMDocument::loadHTML( $response['body']);
$xml = simplexml_import_dom($dom);
$t = $xml->xpath('id("myid")');
if (! $t){ die('xpath error'); }
print_r( $t );

■ 3. Xpath書式例

全要素

//*	または /descendant::*

全 div 要素

//div	または /descendant::div

HTMLページのタイトル

//html/head/title

全 li または div 要素

//*[name()='li' or name()='div' ]

class 属性が 'hoge' な div 要素(完全一致)

//div[@class='hoge']	/descendant::div[@class='hoge']

class 属性が 'hoge fuga' な div 要素(完全一致)

//div[@class='hoge fuga']
//div[contains(@class ,'hoge') and contains(@class ,'fuga')]

class 属性に 'list' を含む div 要素(部分一致)

//li[contains(@class,'list')]

そのノードのテキストの取得

//div[@class='hoge']/text()

そのノード以下の全てのテキストの取得

//div[@class='hoge']/.

id 属性が 'hoge' な要素 → id('hoge')と書くのが高速ですがPHPではうまく取得できないこともあります

id('hoge')
//*[@id='hoge']
/descendant::*[@id='hoge']

テキストが 'hogehoge' なdiv要素(完全一致)   例:<div>hogehoge</div>

//div[text()='hogehoge']

テキストが 'fuga' を含むdiv要素(部分一致)

//div[contains(text(), "fuga")]

【thタグ内のテキストが'fuga'】なthを持つ tr

//table//tr[th[text()='fuga']]

title 属性が 'hoge' で class 属性が 'fuga' でない要素

//*[@title='hoge' and @class!='fuga']
/descendant::*[@title='hoge' and @class!='fuga']

form 要素の 3 番目の input 要素

//form/descendant::input[3]	/descendant::form/descendant::input[3]

5番目以降の p 要素

//p[position() >=5]

チェックされたチェックボックスの親要素

***//input[@checked='checked']/.. //input[@checked='checked']/parent::node()

RSSフィードのURL

//link[@rel="alternate" and @type="application/rss+xml"]/@href

src が 'images/test.gif' の要素

//*[@src='images/test.gif' ]

img タグで src に 文字列 .gif を含む要素

//img[contains(@src, '.gif')]

Firefox xpath アドオン(右クリックで xpath を表示)

https://addons.mozilla.org/en-US/firefox/addon/xpath-checker/

Xpathの書式

http://itref.fc2web.com/xml/xpath.html

Xpath仕様

http://www.w3.org/TR/xpath/

No.723
12/08 14:07

edit

Xpath

はてなダイアリーキーワード自動リンクAPIをPHPで使用する。

はてなダイアリーキーワード自動リンクAPI

http://developer.hatena.ne.jp/ja/documents/keyword/apis/autolink

パラメーター

uri : http://d.hatena.ne.jp/xmlrpc
encoding : utf8
methodName : hatena.setKeywordLink
parameters : 以下を参照
body(string): キーワードを抽出するテキストを指定します。
score(int): 0〜50。キーワードスコアのしきい値を指定します。指定された値よりもスコアが大きいキーワードのみが抽出されます。省略可。
cname(array): キーワードのカテゴリーを指定します。指定があった場合、「一般」と指定されたカテゴリーのキーワードが抽出されます。指定が無かった場合は、全カテゴリーとなります。book,music,movie,web,elec,animal,anime,food,sports,game,comic,hatena,clubが指定可能です。省略可。
a_target(string): アンカー(a)タグのtarget属性値を指定します。省略可。例:_blank
a_class(string): アンカー(a)タグのclass属性値を指定します。省略可。例:keyword
mode(string): 値として lite を指定すると、キーワード自動リンクの結果ではなく、自動リンクに使われるキーワード一覧が返却されます。省略可

PHPソース例

require_once 'XML/RPC.php'; 
$text = "日本語の文化と日本語のテスト";
$out_text = hatena_keyword_link($text);
print_r($out_text);
function hatena_keyword_link( $body ){
	$body = mb_convert_encoding( $body,'utf8',mb_internal_encoding() );
    $params = new XML_RPC_Value(array(
        "body"     => new XML_RPC_Value( $body , "string" ),
        "score"    => new XML_RPC_Value( 0 , "int" ),
        "a_target" => new XML_RPC_Value( '_blank', "string"),
        "a_class"  => new XML_RPC_Value( 'keyword', "string")
        ), "struct");
    $msg = new XML_RPC_Message("hatena.setKeywordLink", array($params));
	$client = new XML_RPC_Client( "/xmlrpc" , "d.hatena.ne.jp", 80 );
    $response = $client->send($msg);
    if (!$response->faultCode()) {
			$val = $response->value();
			$data = XML_RPC_decode($val);
			return $data;
	}
	else {
		return PEAR::raiseError( $response->faultCode(), $response->faultString() );
	}
}

実行結果

<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%C6%FC%CB%DC%B8%EC">日本語</a>の<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%CA%B8%B2%BD">文化</a>と<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%C6%FC%CB%DC%B8%EC">日本語</a>の<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%B9%A5%C8">テスト</a> 
No.721
05/02 15:07

edit

API
PEAR

PHPでWEBページをSQLライクに取得する。【htmlSQL】

■ htmlSQL

http://www.jonasjohn.de/lab/htmlsql.htm

使い方は

■ 例

http://codedump.jonasjohn.de/
というサイトの
クラスが "SnippetList" の ul タグを取得する場合
SELECT * FROM ul WHERE $class == "SnippetList"

というSQL文になります。

PHPコードで書くと以下の通り。

その他

htmlSQLのバリエーションとしては

■ ページのタイトルを取得する場合

SELECT text FROM title

<?php
    include_once("../snoopy.class.php");
    include_once("../htmlsql.class.php");
    $wsql = new htmlsql();
    // connect to a URL
    if (!$wsql->connect('url', 'http://codedump.jonasjohn.de/')){
        print 'Error while connecting: ' . $wsql->error;
        exit;
    }
    if (!$wsql->query('SELECT * FROM ul WHERE $class == "SnippetList"')){
        print "Query error: " . $wsql->error; 
        exit;
    }
    // show results:
    foreach($wsql->fetch_array() as $row){
        print_r($row);        
    }
?>

■ htmlSQLを使って取得したデータの日本語が文字化けする場合

htmlsql.class.php のソースの中の 201行目

$this->page = $this->snoopy->results;
$this->page = mb_convert_encoding( $this->page, 'UTF-8', 'AUTO' );	// これを追加

を付け足すことで回避できます。


参考:http://fdays.blogspot.com/2008/04/htmlsql.html


No.717
03/26 14:02

edit

改行コードを(LF)に統一する

PHPで改行コードをLF(¥n)に統一するには

$str = str_replace("\r\n","\n",$str);
$str = str_replace("\r","\n",$str);

とします。

1行で書きたいなら

$str = preg_replace("/\r\n|\r|\n/", "\n", $str);

と書きます。

No.712
01/04 17:41

edit

PHPで & → &amp (htmlエンティティ)に変換し、戻す

変換するには

$text = htmlspecialchars($text);

戻すには

$text = htmlspecialchars_decode($text);


No.709
08/12 10:25

edit

HTMLを取得(スクレイピング)してパース(解析)する

■ snoopy

http://sourceforge.net/projects/snoopy/

おもなメソッド解説

fetch($URI);
HTMLを取得

fetchtext($URI)
テキストのみを取得

fetchform($URI)
フォーム要素 <form>〜</form>のみを取得

fetchlinks($URI)
<a>タグのURIリストを取得

snoopyはどちらかというと、スパイダー(ロボット)に近いのでパーサとしては少し低機能ですが、使い勝手は非常にいいです。

■ simplehtmldom

http://sourceforge.net/projects/simplehtmldom/

require_once "simple_html_dom.php";
$html = file_get_html($url);
foreach($html->find('a') as $element){
	   echo $element->href . '
';
}
No.707
08/06 10:53

edit

Youtube API を使って自分のサイトでYouYube検索を行う

文字列「Michael Jackson」で10件検索

http://gdata.youtube.com/feeds/api/videos?vq=michael+Jackson&max-results=10

ビデオID「MYx3BR2aJA4」の情報を取得する

http://gdata.youtube.com/feeds/api/videos/MYx3BR2aJA4

ビデオID「MYx3BR2aJA4」の関連動画を取得する

http://gdata.youtube.com/feeds/api/videos/MYx3BR2aJA4/related

その他検索方法

http://gdata.youtube.com/feeds/projection/standardfeeds/FEED_ID

FEED_IDに指定できる文字列

feedid	説明
top_rated	評価の高い動画
top_favorites	お気に入り登録の多い動画
most_viewed	再生回数が多い動画
most_discussed	最も議論された動画
most_linked	リンクの多い動画
most_responded	動画レスポンスの多い動画
recently_featured	最近のおすすめ動画
watch_on_mobile	携帯電話のための動画

ユーザ「USER_NAME」のお気に入りに登録されているビデオを取得

http://gdata.youtube.com/feeds/api/users/USER_NAME/favorites

再生リスト「PLAYLIST_ID」のビデオを取得

http://gdata.youtube.com/feeds/projection/playlists/PLAYLIST_ID

ユーザ「USER_NAME」のプロファイルを取得

http://gdata.youtube.com/feeds/projection/users/「USER_NAME」

ユーザ「USER_NAME」が登録している再生リストを取得

http://gdata.youtube.com/feeds/projection/users/USER_NAME/playlists

ユーザ「USER_NAME」の登録チャンネルを取得

http://gdata.youtube.com/feeds/projection/users/USER_NAME/subscriptions

ユーザ「USER_NAME」のユーザコンタクトリストに登録されているユーザを取得

http://gdata.youtube.com/feeds/projection/users/username/contacts

JSOC-Cフォーマット(簡略版JSON)でデータを取得する

後ろに
?v=2&alt=jsonc
を追加する

http://gihyo.jp/dev/feature/01/jquery-ajax/0003

No.706
10/03 19:04

edit

API

PHPのGD画像関数

GD関数で画像の幅、高さを取得

$filename = 'test.jpeg';
$info = getimagesize($filename);
print_r($info);
出力例
        (
            [0] => 160
            [1] => 144
            [2] => 2
            [3] => width="160" height="144"
            [bits] => 8
            [channels] => 3
            [mime] => image/jpeg
        )

test.jpeg を開いて 0,0 の位置のピクセルの色RGB情報を16進数の数値で取得する

$filename = 'test.jpeg';
$jpeg = imagecreatefromjpeg($filename);
$rgb = imagecolorat($jpeg,0,0);
$info = imagecolorsforindex($jpeg,$rgb);
$r = sprintf("%02x",$info['red']);
$g = sprintf("%02x",$info['green']);
$b = sprintf("%02x",$info['blue']);
print "r:{$r}  g:{$g}  b:{$b}  ";

GD および Image 関数

gd_info — 現在インストールされているGDライブラリに関する情報を取得する
getimagesize — 画像の大きさを取得する
image_type_to_extension — 画像形式からファイルの拡張子を取得する
image_type_to_mime_type — getimagesize, exif_read_data, exif_thumbnail, exif_imagetypeから返される 画像形式のMIMEタイプを取得する
image2wbmp — ブラウザまたはファイルにイメージを出力する
imagealphablending — イメージのブレンドモードを設定する
imageantialias — アンチエイリアス機能を使用すべきかどうかを判断する
imagearc — 部分楕円を描画する
imagechar — 水平に文字を描画する
imagecharup — 垂直に文字を描画する
imagecolorallocate — 画像で使用する色を作成する
imagecolorallocatealpha — 画像で使用する色を透過度を指定して作成する
imagecolorat — ピクセルの色のインデックスを取得する
imagecolorclosest — 指定した色に最も近い色のインデックスを取得する
imagecolorclosestalpha — 指定した色+アルファ値に最も近い色のインデックスを取得する
imagecolorclosesthwb — 色合い、白、黒を有する色のインデックスを得る
imagecolordeallocate — イメージの色リソースを開放する
imagecolorexact — 指定した色のインデックスを取得する
imagecolorexactalpha — 指定した色+アルファ値のインデックスを取得する
imagecolormatch — パレットイメージの色を True カラーイメージに近づける
imagecolorresolve — 指定した色または出来るだけ近い色のインデックスを得る
imagecolorresolvealpha — 指定した色+アルファ値または最も近い色のインデックスを取得する
imagecolorset — 指定したパレットインデックスの色を設定する
imagecolorsforindex — カラーインデックスからカラーを取得する
imagecolorstotal — 画像パレットの色数を検出する
imagecolortransparent — 透明色を定義する
imageconvolution — div および offset の係数を使用し、3x3 の畳み込み配列を適用する
imagecopy — 画像の一部をコピーする
imagecopymerge — イメージの一部をコピー、マージする
imagecopymergegray — グレースケールでイメージの一部をコピー、マージする
imagecopyresampled — 再サンプリングを行いイメージの一部をコピー、伸縮する
imagecopyresized — 画像の一部をコピーしサイズを変更する
imagecreate — パレットを使用する新規画像を作成する
imagecreatefromgd2 — GD2 ファイルまたは URL から新規イメージを生成する
imagecreatefromgd2part — GD2 ファイルまたは URL の指定した部分から新規イメージを生成する
imagecreatefromgd — GD ファイルまたは URL から新規イメージを生成する
imagecreatefromgif — ファイルまたは URL から新規画像を作成する
imagecreatefromjpeg — ファイル又は URL から新規 JPEG 画像を作成する
imagecreatefrompng — ファイルまたは URL から新規 PNG 画像を作成する
imagecreatefromstring — 文字列の中のイメージストリームから新規イメージを作成する
imagecreatefromwbmp — ファイルまたは URL から新規イメージを作成する
imagecreatefromxbm — ファイル又は URL から新規イメージを生成する
imagecreatefromxpm — ファイルまたは URL から新規イメージを生成する
imagecreatetruecolor — TrueColor イメージを新規に作成する
imagedashedline — 破線を描画する
imagedestroy — 画像を破棄する
imageellipse — 楕円を描画する
imagefill — 塗り潰す
imagefilledarc — 楕円弧を描画し、塗りつぶす
imagefilledellipse — 塗りつぶされた楕円を描画する
imagefilledpolygon — 塗りつぶした多角形を描画する
imagefilledrectangle — 塗りつぶした矩形を描画する
imagefilltoborder — 特定色で塗りつぶす
imagefilter — 画像にフィルタを適用する
imagefontheight — フォントの高さを取得する
imagefontwidth — フォントの幅を取得する
imageftbbox — freetype2 によるフォントを用いたテキストを囲む箱を取得する
imagefttext — FreeType 2 によるフォントを用いてイメージにテキストを描画する
imagegammacorrect — GD イメージにガンマ補正を適用する
imagegd2 — GD2 イメージをブラウザまたはファイルに出力する
imagegd — GD イメージをブラウザまたはファイルに出力する
imagegif — ブラウザまたはファイルへ画像を出力する
imagegrabscreen — 画面全体をキャプチャする
imagegrabwindow — ウィンドウをキャプチャする
imageinterlace — インターレースを有効もしくは無効にする
imageistruecolor — 画像が truecolor かどうか調べる
imagejpeg — 画像をブラウザまたはファイルに出力する
imagelayereffect — アルファブレンディングフラグを設定し、 libgd にバンドルされているレイヤ効果を使用する
imageline — 直線を描画する
imageloadfont — 新しいフォントを読み込む
imagepalettecopy — あるイメージから他のイメージにパレットをコピーする
imagepng — PNG イメージをブラウザまたはファイルに出力する
imagepolygon — 多角形を描画する
imagepsbbox — PostScript Type1 フォントを用いてテキスト矩形のバウンディングボックスを指定する
imagepsencodefont — フォントの文字エンコードベクトルを変更する
imagepsextendfont — フォントを展開または圧縮する
imagepsfreefont — PostScript Type 1 フォント用メモリを解放する
imagepsloadfont — ファイルから PostScript Type 1 フォントをロードする
imagepsslantfont — フォントを傾ける
imagepstext — PostScript Type1 フォントを用いて画像の上に文字列を描く
imagerectangle — 矩形を描画する
imagerotate — 指定された角度で画像を回転する
imagesavealpha — PNG 画像を保存する際に(単一色の透過設定ではない)完全な アルファチャネル情報を保存するフラグを設定する
imagesetbrush — 線の描画用にブラシイメージを設定する
imagesetpixel — 点を生成する
imagesetstyle — 線描画用のスタイルを設定する
imagesetthickness — 線描画用の線幅を設定する
imagesettile — 塗りつぶし用のイメージを設定する
imagestring — 文字列を水平に描画する
imagestringup — 文字列を垂直に描画する
imagesx — 画像の幅を取得する
imagesy — 画像の高さを取得する
imagetruecolortopalette — TrueColor イメージをパレットイメージに変換する
imagettfbbox — TypeType フォントを使用したテキストの bounding box を生成する
imagettftext — TrueType フォントを使用してテキストを画像に書き込む
imagetypes — この PHP がサポートしている画像形式を返す
imagewbmp — ブラウザまたはファイルにイメージを出力する
imagexbm — XBM 画像をブラウザあるいはファイルに出力する
iptcembed — バイナリ IPTC データを JPEG イメージに埋めこむ
iptcparse — バイナリの IPTC ブロックのタグをパースする
jpeg2wbmp — JPEG イメージファイルから WBMP イメージファイルに変換する
png2wbmp — PNG イメージファイルから WBMP イメージファイルに変換する
No.705
10/19 10:47

edit

画像

htmlページを取得、解析してページタイトルを得る

PHPでhtmlページのタイトルタグ(任意のタグの内容でも可能)を取得するには。

function _get_element( $pElement, $pSource ) {
   $_data = null;
   $pElement = strtolower( $pElement );
   $_start = strpos( strtolower( $pSource ), chr(60) . $pElement, 0 );
   $_start = strpos( $pSource, chr(62), $_start ) + 1;
   $_stop = strpos( strtolower( $pSource ), "</" . $pElement .    chr(62), $_start );
   if( $_start > strlen( $pElement ) && $_stop > $_start ) {
      $_data = trim( substr( $pSource, $_start, $_stop - $_start ) );
   }
   return( $_data );
}

function _get_page_title( $url ) {
    $html = file_get_contents($url);
    $html = mb_convert_encoding( $html, 'UTF-8', 'AUTO' );
    $title = $this->_get_element( 'title', $html );
    $html = mb_convert_encoding($html, mb_internal_encoding(), "auto" );
    if ( $title ) {
        return $title;
    }
    else {
        return 'non-title';
    }
}

として

$url = 'http://www.yahoo.co.jp/';
$title = $this->_get_page_title( $url );

とします。

http://d.hatena.ne.jp/steel-plate/20080417/1208445174


No.704
11/02 14:03

edit

PHP(Smartyプラグイン)ではてな記法を使用する

PHP用はてな記法パーサをインストール

http://d.hatena.ne.jp/anatoo/20090608/1244387241

サーバのコマンドライン(シェル)から

pear channel-discover openpear.org
pear install openpear/HatenaSyntax-beta

でインストール完了。(要PHPバージョン > 5.25 )

また PEARのバージョンが 1.8.0 より低い場合もインストールできないので、アップデートします

yum update php-pear
pear upgrade PEAR

Smartyのプラグインフォルダに modifier.hatena_syntax.php というファイル名を作成して

下記の内容をコピー

<?php
require_once('HatenaSyntax.php');
function smarty_modifier_hatena_syntax($string){
	return HatenaSyntax::render($string);
}
?>

テンプレートファイルに

{$text|hatena_syntax}

などと書けばはてな記法が使えます。

No.693
04/07 13:45

edit

PEAR

ファイルアップロードのファイル要領制限(upload_max_filesize)を変更する。

1. .htaccess に記述する場合

#  ファイルアップロードの最大サイズを 10Mに設定
php_value upload_max_filesize 10M
#  ファイルアップロードの最大サイズを 500Kに設定
php_value upload_max_filesize 500K

2. php.ini 内に記述する場合(さくらのレンタルサーバはこちらの方法です。)

;ファイルアップロードの最大サイズを 10Mに設定
upload_max_filesize = 10M

3. phpスクリプト内に記述する場合(サーバの設定によっては許可されていない場合があります)

// ファイルアップロードの最大サイズを 10M に設定
ini_set('upload_max_filesize', 10 * 1024 * 1024); 

● なお現在のファイルアップロード制限の設定を取得するには

print "upload_max_filesize: " . ini_get('upload_max_filesize')." Bytes です。";

とします。

No.690
02/12 16:29

edit

ファイル
.htaccess
メモリ
エラー対処

セッション使用時のブラウザキャッシュの動作を制御する

PHPでセッションを使用する

session_start();

とすると、ブラウザのHTTPヘッダには

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

というのが必ず送られます。

これが送られるとそのページはキャッシュされないので、例えばフォーム入力画面の場合

次の確認画面から history.back(); で返ってくると、入力欄が消えてしまいます。

そこで

■ 方法1.

session_cache_limiter('none'); // no-cacheヘッダを送信しない
session_start();

とするか、

■ 方法2

session_cache_limiter('public'); // セッション使用時にキャッシュを使えるようにする
// ↓PHPのデフォルト値は 180 です
session_cache_expire(60); // セッション時のキャッシュ有効時間 60分(1時間)
session_start();

とすると、セッション使用時にもキャッシュ可能になります。

ちなみにセッション自体の有効時間は

ini_set("session.cookie_lifetime", 28800); // セッション有効時間 60*60*8(8時間)

として指定します。

session_cache_limiterの引数

none : no-cacheヘッダを送信しない
nocache : no-cacheヘッダを送信する
private : キャッシュを利用する(プロキシサーバーにはキャッシュを利用させない)
private_no_expire : キャッシュを利用する(プロキシサーバーにはキャッシュを利用させない)
public : キャッシュを利用する

No.680
02/08 15:39

edit

Cookie
セッション

SmartyプラグインでOSとブラウザ判別を行う

ファイル名 modifier.is_ua_with_osmb.php で下記コードを保存し Smartyの plugin フォルダに入れます。

<?php
// Version 1.2
function smarty_modifier_is_ua_with_osmb($arg,$debug=false){
	$useos; $browser; $os_browser;
	if (  preg_match('/Mac/',$_SERVER['HTTP_USER_AGENT']) ){ $useos='mac'; }
	elseif (  preg_match('/Win/',$_SERVER['HTTP_USER_AGENT']) ){ $useos='win'; }
	else { $useos = 'other'; }
	if ( preg_match('/Opera/',$_SERVER['HTTP_USER_AGENT']) && preg_match('/Version\/([0-9]+)/',$_SERVER['HTTP_USER_AGENT'], $r) ){ $browser = 'opera'.$r[1]; }
	elseif ( preg_match('/MSIE ([0-9])+/',$_SERVER['HTTP_USER_AGENT'], $r) ){ $browser = 'ie'.$r[1]; }
	elseif ( preg_match('/Safari/',$_SERVER['HTTP_USER_AGENT']) && preg_match('/Version\/([0-9]+)/',$_SERVER['HTTP_USER_AGENT'], $r) ){ $browser = 'safari'.$r[1]; }
	elseif ( preg_match('/Chrome\/([0-9]+)/',$_SERVER['HTTP_USER_AGENT'],$r) ){ $browser = 'chrome'.$r[1]; }
	elseif ( preg_match('/Firefox\/([0-9]+)/',$_SERVER['HTTP_USER_AGENT'], $r) ){ $browser = 'firefox'.$r[1]; }
	elseif ( preg_match('/Gecko/',$_SERVER['HTTP_USER_AGENT']) ){ $browser = 'gecko'; }
	else{ $browser = $_SERVER['HTTP_USER_AGENT']; }
	$os_browser = $useos.'_'.$browser;
	if ($debug){
		return "{$os_browser} : {$_SERVER['HTTP_USER_AGENT']}";
	}
	else{
		if ( strcmp($arg, $os_browser)==0 ){ return true; }
		else{ return false; }
	}
}
?>

■ 使い方

// デバッグモード
{ ""|is_ua_with_osmb:debug }
// 例
{ if "mac_safari4"|is_ua_with_osmb }このブラウザは mac版safari4です
{ elseif "win_ie8"|is_ua_with_osmb }このブラウザは win版IE8です
{ elseif "win_firefox3"|is_ua_with_osmb }このブラウザは win版firefox3です
{ else }それ以外のブラウザです
{ /if }

まず先頭に OSの種類を記述し、アンダースコアでブラウザとメジャーバージョンを記述します。

(記述は全て小文字)

No.674
03/23 13:23

edit

Smarty

PHPプログラムが使用しているメモリを取得する

PHPプログラムが使用しているメモリを取得するには

$mem = memory_get_usage();
$mem = number_format($mem);
print("Memory:{$mem}");

などとするとよいでしょう。

※ ただし関数を呼び出した時点での使用メモリなので注意。


最大どれだけメモリを使用したかは

memory_get_peak_usage();

で取得できます

メソッドとして持っておくといいでしょう

public function dumpmem(){
	print "\n".'<pre style="text-align:left;">'."\n";
	$mem     = number_format(memory_get_usage());
	$peakmem = number_format(memory_get_peak_usage());
	print("Memory:{$mem} / Peak Memory:{$peakmem}");
	print "\n</pre>\n";
}

No.653
04/19 00:47

edit

メモリ

Smarty の プラグインへの引数指定方法

通常( $data を myplugin に渡す )

{$data|myplugin}

引数を2つ($data1, $data2)渡す

{$data1|myplugin:$data2}

引数を3つ($data1, $data2, $data3)渡す

{$data1|myplugin:$data2:$data3}

配列や連想配列($ar_data)を引数として渡す

{$ar_data|@myplugin}

No.649
09/15 14:01

edit

Smarty
配列

配列(の配列)の文字コードを一括変換する

http://d.hatena.ne.jp/seto-san/20081203/1228274418

にありました。

以下引用。(クラスメソッドとして記述してあるので、通常の関数として使用したい場合は)

$target[$key] = $this->_mbConvertEncodingEx($val,$toEncoding,$fromEncoding);
↓
$target[$key] = _mbConvertEncodingEx($val,$toEncoding,$fromEncoding);

とするとよいでしょう。

/**
 * mb_convert_encoding()の拡張
 *
 * @param  mixed  $target       arrayかstring
 * @param  string $toEncoding   エンコード先
 * @param  string $fromEncoding エンコード元(default:null)
 * @return mixed  arrayが来たらarrayを、stringが来たらstringを
 */
function _mbConvertEncodingEx($target, $toEncoding, $fromEncoding = null)
{
  if (is_array($target)) {
    foreach ($target as $key => $val) {
      if (is_null($fromEncoding)) {
        $fromEncoding = mb_detect_encoding($val);
      }
      $target[$key] = $this->_mbConvertEncodingEx($val,$toEncoding,$fromEncoding);
    }
  } else {
    if  (is_null($fromEncoding)) {
      $fromEncoding = mb_detect_encoding($target);
    }
    $target = mb_convert_encoding($target, $toEncoding,$fromEncoding);
  }
  return $target;
}

No.648
11/12 11:21

edit

配列

ZIP Archive のインストール

ZIPファイルを扱う pecl拡張をインストールする。

root になって

yum install php-devel
yum install zlib-devel
pecl install zip

でインストール完了。

完了すると

You should add "extension=zip.so" to php.ini

と表示されるので

/etc/php.ini に【extension=zip.so】を追加。

apacheの再起動をします

apachectl graceful

確認は phpinfo() で出来ます。

pecl拡張がインストールできない環境の場合

http://phpspot.org/blog/archives/2007/10/phpzip.html


■ phpmyadmin(GPLライセンス)のライブラリを使用する

http://winofsql.jp/VA003334/phpVarious060803234456.htm

No.640
11/04 14:58

edit

ファイル

PHPとPerlのヒアドキュメント比較

■ PHPのヒアドキュメント(画面上に表示)

print <<< DOC_END
ここに内容を記述
ここに内容を記述
ここに内容を記述
DOC_END;

■ PHPのヒアドキュメント(変数$textに代入)

$text = <<< DOC_END
ここに内容を記述
ここに内容を記述
ここに内容を記述
DOC_END;

● Perl のヒアドキュメント(画面上に表示)

print << "END_OF_HTML";
ここに内容を記述
ここに内容を記述
ここに内容を記述
END_OF_HTML

No.636
01/30 15:09

edit

PHP文字コード, HTMLのヘッダのエンコード指定が正しいのに何故か時々文字化けする不具合の対応

なぜか時々文字化けが起きる。。。といった不具合の時は

PHPの最初の方に記述

$encoding = 'UTF-8';     // もしくは EUC-JP  ,  SJIS
ini_set('mbstring.internal_encoding', $encoding );
ini_set('mbstring.script_encoding', $encoding );
ini_set('default_charset', $encoding );

これでなおることがあります。

こちらの方法でも直ることがあります(サーバによる)

.htaccess に下記の記述をしてサーバにアップロード

php_value mbstring.internal_encoding EUC-JP
php_value mbstring.script_encoding EUC-JP
php_value default_charset EUC-JP

参考:http://blog.factree.co.uk/memo/000028.html

No.634
01/08 14:44

edit

日本語
.htaccess

出力バッファをフラッシュして出力と同時に画面に表示させる

PHPでは標準で出力バッファがonになっています。

これを制御して出力があったと同時に画面に表示させるには

for ($i=0 ; $i<10 ; $i++){
	print $i;
	flush();
	sleep(5);
}

という風にします。

No.617
08/11 11:40

edit

PHPであるディレクトリ(フォルダ)内のファイルを全て削除する

PHPであるディレクトリ(フォルダ)内のファイルを全て削除するには

function delete_allfile($dirpath=''){
	if ( strcmp($dirpath,'')==0 ){ die('delete_allfile : error : please set dir_name'); }
	$deleted_list = array();
	$dir = dir($dirpath);
	while ( ($file=$dir->read()) !== FALSE ){
		if (preg_match('/^\./',$file)){ continue; }	// skip dir , skip hidden file
		else {
			array_push($deleted_list, $file);
			if ( ! unlink("$dirpath/$file") ){ die("delete_allfile : error : can not delete file [{$dirpath}/{$file}]"); }
		}
	}
	return $deleted_list;
}
$deleted_list  = delete_allfile(ディレクトリ名);

で実行

No.608
07/03 11:56

edit

ファイル

PHPで1秒以下の短い時間(ミリ秒) sleep させる

何度も調べてしまうのでメモ

0.5秒スリープさせるには
usleep(500000);
1秒スリープさせるには
usleep(1000000);

と記述します。

No.607
02/19 10:50

edit

Smartyで配列の最初と最後の要素を検知する

Smartyで配列の最初、最後を検知するには ループ名(任意)をつけて

.first

.last

で知ることが出来ます。

{ foreach from=$test_loop key="k" item="v" name="loopname"}
{ if $smarty.foreach.loopname.first }(最初の要素){$v.name}です。{ /if }
{ $v.name }です。
{ if $smarty.foreach.loopname.last }(最後の要素){$v.name}です。{ /if }
{ /foreach }

ちなみに配列の長さは @count で求めることが出来ます

{$test_loop|@count}
No.601
11/01 11:18

edit

Smarty
配列

PHPソースコードを難読化

■ Windows アプリ(XP以上)
http://www.raizlabs.com/software/phpobfuscator/


■ オンラインで難読化が行えます(日本語には未対応)
http://www.virtualpromote.com/tools/php-encrypt/


■ Zendから発売されている製品はこちら 【ZendGuard 日本語版】
http://www.zend.co.jp/product/zendguard.html

No.596
04/25 18:46

edit

900 * (1.1) =990 を小数点第一位で切り上げると答えは 991 になる

PHP でも Perl でもいいのですが以下のような計算を小数点第一位で切り上げると、我々人間が予想した数値と違う結果になります。

■ PHP

$a = 900 * (1.1);
print $a."\n";

$b   = ceil( $a );
print $b."\n";

■ Perl

use POSIX;
my $a = 900 * (1.1);
print $a."\n";

my $b   = ceil( $a );
print $b."\n";

いずれも答えは

990
991

となります。

PHPマニュアル:http://manual.xwd.jp/language.types.float.html

によると

0.1 や 0.7 のような簡単な小数表現も、若干精度を失うことなく内部的な 2 進表現に変換することはできません。 これにより、混乱する結果を生じることがあります。 つまり floor((0.1+0.7)*10) は、 予想される 8の代わりに実際の内部表現の結果として 7.9999999999... のようなものを結果として返します。

これは、有限の桁数の小数点表記で正確に表現できない分数が存在するという事実に関係しています。 例えば、1/3 の小数表記は 0.3333333. . . となります。

よって、小数の最後の桁を信用してはいけませんし、 小数が等しいという比較を行ってはいけません。より高い精度が必要な場合には、 任意精度数学関数または gmp 関数を代わりに使用してください。

との事。

ご注意を。

No.587
05/23 12:16

edit

Smarty でテンプレート側で配列の長さ(要素数)を求める

Smartyはテンプレート内でPHP標準関数が使用できます。

なので

配列 $loop の要素数を知るには

{$loop|@count}

でOKです


if文で使用するには

{ if count($loop) > 0 }要素数は1以上です{/if}

計算式で使用するには( 例:$loopの要素数に2を足す )

{ math equation=a+b a=$loop|@count b=2 assign=kekka }
{$kekka}

No.583
01/21 11:11

edit

配列
Smarty

Smartyテンプレート内で変数に代入をする、計算をする

まずテンプレート内での変数の定義

{assign var="hogehoge" value="test_txt" }
{assign var="aaa" value="999" }
{assign var="bbb" value="10000" }

{ math equation=a+b a=$aaa b=$bbb assign=kekka }

{$kekka}には10999という値が入ります


◆ 文字列を連結して代入する場合

$year = '2001';

$month = '01';

$date = '15';

{ assign var="now_date" value="`$v.year`/`$v.month`/`$v.date`" }
変数をバッククォートで囲むと文字列と混ぜることが出来ます。
No.580
10/14 23:47

edit

Smarty

No.575
06/10 15:32

edit

連想配列から配列の値を削除する

phpの連想配列(ハッシュ)で

$hash=array(
 'aa' => 'aiueo' ,
 'bb' => 'kakikukeko' ,
 'cc' => 'sasisuseso' ,
);

という配列から $hash['bb'] のキーと値を削除するには

unset($hash['bb']);

とします。

※ なおこれは普通の配列には使用しない方がいいです。(削除した配列は「欠番」となりますので、それより後ろのメンバがつまるわけではないため)

普通の配列には array_splice() を使用しましょう。

array_splice ( array &$input , int $offset [, int $length [, mixed $replacement = array() ]] )

配列 input から offset および length で指定された要素を削除し、配列 replacement でそれを置換します


※ 普通の配列の「欠番」をつめる array_values() というのもあります(パフォーマンスをあまり気にしない局面では使えると思います)

```

$list = array_values($list);

```

No.545
02/22 20:05

edit

配列

ファイル名からパス名、ファイル名、拡張子を調べる。また拡張子を取り除く

意外と何度も調べてしまうのでメモ

■ ファイル名からパス名、ファイル名、拡張子を調べるには pathinfo 関数を使用します

$p = pathinfo('./aaa/bbb/ccc/ddd.jpg');
print_r($p);
// 実行結果
Array
(
    [dirname] => ./aaa/bbb/ccc
    [basename] => ddd.jpg
    [extension] => jpg
    [filename] => ddd
)

ただし、拡張子がないときは $p['extension'] がセットされて帰ってこないので注意。

■ PHPでファイル名から拡張子を取り除くには

■ 1. 拡張子がわかっている場合

basename ("ファイル名","サフィックス");

とします。

$test=basename ( "hogehoge.jpg",".jpg" );

■ 2.拡張子がわかってない場合

関数を定義するのがいいでしょう(か?)

function _delete_extention( $string='' ){
$p = pathinfo($string);
return basename ( $string, ".{$p['extension']}" );
}

No.528
09/07 09:32

edit

ファイル

PHPで文字列を比較するときに == は絶対に使ってはいけない。

PHPで文字列を比較するときに == は絶対に使ってはいけない。

というのを意外とみなさん知らないようで、改めてここに記述しておきます。

参考:がるの健忘録 - 素晴らしき自動的な世界〜或いは「型のない」世界〜

参考:がるの健忘録

参考:zuzara : PHPの比較演算子($a == $b)で注意が必要なとき

参考:PHPの文字列比較で気をつけるべきこと - 暗黙の型変換 - EC studio 技術ブログ

Perlだと文字列比較は

if ( $a eq $b ){ print '同じです'; }

PHPだと

if ( strcmp($a,$b)==0 ){ print '同じです'; }

と書くのがいいでしょう。

また

if ( $a===$b ){ print '同じです'; }

と(===による厳密な比較)も有効でしょう。↓こちらは要チェックです

PHP 型の比較表

No.506
03/16 14:01

edit

PHPで相対パスから絶対URL(URI)を作成する。または絶対パスを返す。

元となるURLとそれに対する相対パスを指定すると絶対URLを作成する関数です。

元URL:http://www.test.com/gallery/index.html
相対パス:../contact.html
URL:http://www.test.com/contact.html

使い方

$url = make_uri('元url','相対パス');

です。

関数 make_uri

//================ make_uri:version 1.4
function make_uri($base='', $rel_path=''){
    $base = preg_replace('/\/[^\/]+$/','/',$base);
    $parse = parse_url($base);
    if (preg_match('/^https\:\/\//',$rel_path) ){
        return $rel_path;
    }
    elseif ( preg_match('/^\/.+/', $rel_path) ){
        $out = $parse['scheme'].'://'.$parse['host'].$rel_path;
        return $out;
    }
    $tmp = array();
    $a = array();
    $b = array();
    $tmp = preg_split("/\//",$parse['path']);
    foreach ($tmp as $v){
        if ($v){  array_push($a,$v); }
    }
    $b = preg_split("/\//",$rel_path);
    foreach ($b as $v){
        if ( strcmp($v,'')==0 ){ continue; }
        elseif ($v=='.'){}
        elseif($v=='..'){ array_pop($a); }
        else{ array_push($a,$v); }
    }
    $path = join('/',$a);
    $out = $parse['scheme'].'://'.$parse['host'].'/'.$path;
    return $out;
}

元URLと相対パスから絶対パス(ドキュメントルートからのパス表記)を返す関数( make_apath )はこちら。

//============= make_apath:version 1.1
function make_apath($base='', $rel_path=''){
	$base = preg_replace('/\/[^\/]+$/','/',$base);
	$parse = parse_url($base);
	if (preg_match('/^https\:\/\//',$rel_path) ){
		return $rel_path;
	}
	elseif ( preg_match('/^\/.+/', $rel_path) ){
		$out = $parse['scheme'].'://'.$parse['host'].$rel_path;
		return $out;
	}
	$tmp = array();
	$a = array();
	$b = array();
	$tmp = preg_split("/\//",$parse['path']);
	foreach ($tmp as $v){
		if ($v){  array_push($a,$v); }
	}
	$b = preg_split("/\//",$rel_path);
	foreach ($b as $v){
		if ( strcmp($v,'')==0 ){ continue; }
		elseif ($v=='.'){}
		elseif($v=='..'){ array_pop($a); }
		else{ array_push($a,$v); }
	}
	$path = join('/',$a);
	return '/'.$path;
}
No.501
01/21 11:58

edit

URL

phpでjsonを扱う / json_decode() / json_encode()

● jsonデータをPHPの配列にする(デコード)

$array = json_decode($json,true);

● PHPの配列をjson形式にする(エンコード)

$json = json_encode($array);

● php5.2より低いバージョンでjsonを扱う 「php-jsonのインストール」

PHPのバージョンが 5.2より低いphpでjsonを扱うには 「php-json」をインストールします。 (ヘテムルなど大手レンタルサーバ会社のサーバには標準でインストールされています。) (他にも PEARパッケージなどがありますが、phpエクステンションとして提供されているphp-json の方が高速なので、php-json を使用します。)

1. phpバージョンの確認

php --version

PHPのバージョンが 5.2.0 以上の場合、php-json はあらかじめインストールされています。 それより低いバージョンの場合のみ手動でインストールしましょう。

2. json-phpのインストール

yum install php-json

でOKです。

4. json.soを指定のディレクトリ(/usr/lib/php/modules/)に移動

cp json.so /usr/lib/php/modules/json.so

5. /etc/php.d/json.ini ファイルの作成

'/etc/php.d/json.ini' というファイルを下記の内容で作成します。

   ; Enable json extension module
    extension=json.so

6. apacheの再起動

    apachectl graceful

これでOKです。

7. 確認

php.info(); 関数で確認します。 実行して表示される画面に json の項目とバージョンが正しく表示されていればOK。

8. json関数の使用。

これで関数

json_encode();
json_decode()

が使用できるようになります。

9 json関数使用の注意

$my_array = json_decode($json,true);

json_decode を使用する際は、2つめの引数に true を渡します。 (trueとすると結果が連想配列で帰ってきます。渡さないとオブジェクトで帰ります。)

No.500
02/09 17:46

edit

Smartyでセッション変数、cookie、環境変数を参照する

Smartyテンプレート内でセッション変数、cookie、環境変数の値を参照したいときは下記のようにします。

phpのセッション変数"id"の値を表示

{$smarty.session.id}

クッキーに登録された"username"の値を表示

{$smarty.cookies.username}

環境変数"PATH"の値を表示

{$smarty.env.PATH}

環境変数 "SERVER_NAME" の値を表示

{$smarty.server.SERVER_NAME}

環境変数 "HTTP_USER_AGENT" の値を表示

{$smarty.server.HTTP_USER_AGENT}

■ ただし Smartyで全ての環境変数が取得できるわけではありません。

なので

{ foreach from=$smarty.server key="k" item="v" }
{$k}:{$v} 
{ /foreach }

としてどういう環境変数が取得できるのかを調べるのがいいでしょう。



No.490
04/21 10:18

edit

Smarty
Cookie
セッション

携帯サイトなどCookieを使えないクライアントの場合に自動でセッション変数をURIに埋め込む

(一部の)携帯などでcookieを使えない場合にセッションIDをURIに埋め込んで使用する方法が一般的です。

そこで

・cookieを受け付けるときはcookieを使用したセッション。

・cookieを受け付けないときはURI埋め込みを使用したセッション。

を実現します。

php.ini の設定

session.use_cookies = 1
session.use_only_cookies = 0

としてapache をリスタート

apachectl graceful

で準備OK。

後はPHPスクリプト内で

定数SID が存在するブラウザの場合 → cookie使用不可(携帯など)

定数SID が存在しないブラウザの場合 → 通常のWEBブラウザ

で判別できます。

session_start();
if (SID){
	// cookieを使えないブラウザの処理
}
else {
	// cookieを使えるブラウザの処理
}

No.489
04/21 10:18

edit

携帯スマホサイト
Cookie
セッション

PHPのソースコードを整形する PHP_Beautifier を試す。

PHPコード整形ツール PHP_Beautifier を試してみます。

http://pear.php.net/package/PHP_Beautifier

PHP_Beautifierのインストール

ソースコードを取得してきて PEAR コマンドでインストールする

wget http://pear.php.net/get/PHP_Beautifier-0.1.15.tgz

pear install PHP_Beautifier-0.1.15.tar

でインストール

■ php_beautifier の実行(コマンドライン編)

まずヘルプを表示するには

php_beautifier --help

ソースコードbefore.phpを整形してafter.phpに出力するには

php_beautifier  before.php > after.php

■ php_beautifier の実行(PHPソース編)

$in に入っているPHPソースコードを整形します

require_once 'PHP/Beautifier.php';
$ob = new PHP_Beautifier();
$ob->setInputString( $in );
$ob->process();
$out = $ob->get();
print ($out);

マニュアル:http://beautifyphp.sourceforge.net/docs/

No.488
02/10 18:05

edit

PEAR

Smartyで for文 (for i=0 ; i<10; i++)のような繰り返しを行う。

Smartyでfor文のような繰り返し処理をするには以下のように記述する。

{section name=i start=0 loop=10}
繰り返し回数は{$smarty.section.i.index}です。

$i に変数を代入する場合は下記のように行う
{assign var="i" value=$smarty.section.i.index }
繰り返し回数は{$i}です。

{/section}

No.486
12/22 14:22

edit

Smarty

PHPアクセラレータAPCを導入して、PHPを高速化する。

APCを導入して高速化を図る。今回 Fedora Core5, CentOS5 で実験しました。

【Fedora Core5にAPCをインストール】

■ 1. php-apcをインストール

yum install php-apc

■ 2. /etc/php.ini に設定を追加

extension=apc.so

■ 3. apacheの再起動

apachectl graceful

【Cent OS5にAPCをインストール】

■ 1. php-devel、httpd-devel(apxs)、gcc,、c++、APC をインストール

yum install php-devel

yum install httpd-devel

yum install gcc

yum install gcc-c++

pecl install APC

■ 2. /etc/php.ini に設定を追加

extension=apc.so

■ 3. apacheの再起動

apachectl graceful

APCのオプション(php.iniに記述)

APCの on/off を切り替える(1でon 0でoff)

apc.enabled = 1

CLI(コマンドライン)のPHPでもAPCを有効する

apc.enable_cli = 1

【インストールの確認】

phpinfo.php を実行して APC という項目があることを確認する

実効速度の比較

APCをOFFにした状態ONにした状態それぞれ【ab】(apache bench)を実行する。

ab -n 100 -c 10 http://www.testserver.local/

【ab結果の比較例】

実際には色々な項目を比較して結論を出すのですが、とりあえず「Time Per request」で比較してみると

■ APC無効
Time per request: 269.403 [ms] (mean, across all concurrent requests)
■ APC有効
Time per request: 111.376 [ms] (mean, across all concurrent requests)

となりました。

yumコマンド一発でインストールできることを考えると、インストールしない手はないと思います。

APCの導入はとりあえずここまで。

さらに使いこなすには細かく設定をしましょう。

参考:http://zapanet.info/phpdoc/ref.apc.html

No.483
01/20 13:57

edit

高速化

cookieを使わずにセッション管理する(ログイン認証が必要な携帯サイト用)

セッションは通常cookieを通してやりとりしますが、cookieを使えないブラウザ

(携帯端末 Docomo Softbank )等でセッション機能を実現させたい場合はセッションIDを

URIに埋め込んで使用することになります。

■ セッションをURLに埋め込んで使用するには以下の記述を行います。

/etc/php.iniに設定する場合(書き換えたら apache をリスタート)

session.use_trans_sid = 1

.htaccessに設定する場合

php_flag session.use_trans_sid On

phpコードに記述する場合

ini_set('session.use_trans_sid', '1');

ただし

注意: 相対URLでないURLは外部サイトを指していると仮定され、SIDが追加 されません。これは、SIDを外部のサーバに開示することはセキュリティ 上のリスクとなる可能性があるためです。

なので注意


■ セッションに関するパラメータを変更するには phpコード内に以下の記述を行います。

が、通常書き換えなくてもOKです。

//一文字あたりのビット数(4,5,6)数値が大きいほどセッションIDを短くすることが出来る
ini_set('session.hash_bits_per_character', 6);
//セッションパラメーター名 デフォルト値:PHPSESSID
ini_set('session.name', '_SESSID');
//ハッシュ関数 0:MD5(128bits) 1:SHA(160bit) デフォルト値:0
ini_set('session.hash_function', 1);

参考:

http://labs.scyphus.co.jp/memos/php/session

http://www.yc.musashi-tech.ac.jp/~yamada/doc/php/0802.html

http://ke-tai.org/blog/2007/12/12/php_session_new/

No.481
07/14 14:08

edit

携帯スマホサイト
Cookie
セッション
.htaccess

文字列に「ひらがな(全角)」「漢字(全角)」「カタカナ(全角)」「カタカナ(半角)」が使われているか判別する。

文字列に「ひらがな(全角)」「漢字(全角)」「カタカナ(全角)」が使われているかを判別するには次のようにする

PHP5 + UTF-8の場合

mb_regex_encoding('UTF-8');
if ( preg_match('/[一-龠]+/u', $q)  ){ 漢字を含む時の処理 }
if ( preg_match('/[ァ-ヶー]+/u', $q) ){ カタカナを含む時の処理 }
if ( preg_match('/[ぁ-ん]+/u', $q) ){ ひらがなを含む時の処理 }
if ( preg_match('/[ア-ン゙゚]+/u', $q) ){ 半角カタカナを含む時の処理 }

■ 注意1

正規表現のオプション【 /u 】というのが最後にくっついていますが、

これは文字コード UTF-8 で検索を行うときには必ず必要なものです。

忘れないよう注意!


■ 注意2

また上記の例だと「ー」はひらがなとしてマッチしません。

ひらがなにも「ー」を含ませる場合は

if ( preg_match('/[ー-ん]+/u', $q) ){ ひらがなを含む }



仕方なく mb_ereg で実装する場合は下記の通り

mb_regex_encoding('EUC-JP');

if ( mb_ereg('[一-龠]+', $q) ) { 漢字を含む }


Unicode対応 文字コード表

!JP 付録4 日本語文字一覧

http://jprs.jp/doc/rule/saisoku-1-wideusejp-furoku-4.html


ASCII文字コード一覧表

http://www.psl.ne.jp/perl/pdojo00b.html


memo.xight.org - PHPの文字化け - 5つの誤解と5つの対策

http://memo.xight.org/2007-02-14-1



No.473
11/19 14:06

edit

正規表現
日本語

メモリエラー「PHP Fatal error: Allowed memory size of 8388608 bytes exhausted」

CSVで大きなファイルをコンバート中にメモリエラー

PHP Fatal error: Allowed memory size of 8388608 bytes exhausted

が発生。

このエラーはメモリ不足なので、PHPの最大使用メモリを増やしてあげると回避できます。

下記の例では200MBytesに設定しています。

対処法 1.

/etc/php.ini の設定を以下のように変える

memory_limit = 200M      ; Maximum amount of memory a script may consume (8MB)

対処法 2.

PHPプログラム内に下記コードを記述する

ini_set('memory_limit', '200M');
No.472
09/18 18:05

edit

ファイル
メモリ

PHPでファイルの移動を行う

PHPでファイルの移動を行う

PHPでファイル移動の関数が見あたらなかったので以下のようにする

function move( $from, $to ){
    if ( copy ($from, $to) ){
        unlink($from);
        return TRUE;
    }
    else{
        return FALSE;
    }
}
No.460
11/04 15:01

edit

ファイル

配列を自然順アルゴリズムでソートを行う【natsort】【natcasesort】

普通にソートすると

 img1.png
 img2.png
 img10.png
 img12.png

となってしまう配列を

img1.png
img10.png
img12.png
img2.png

でソートするのが自然順アルゴリズムによるソート(人間が認識しやすいソート)

これは

$arr=new array(
'img2.png',
'img12.png',
'img1.png',
'img10.png'
);
natsort($arr);

で実行できます。

natsort(配列):自然順アルゴリズムによるソート
natcasesort(配列):自然順アルゴリズムによるソート(大文字小文字の違いを無視)
No.453
11/12 11:23

edit

配列

ソースコードを色づけして表示するライブラリ

■ GeSHi - Generic Syntax Highlighter

http://qbnz.com/highlighter/index.php

対応プログラミング言語

Actionscript、ADA、Apache Log、AppleScript、ASM、ASP、AutoIT、Backus-Naur form、Bash、BlitzBasic、C、C for Macs、C#、C++、CAD DCL、CadLisp、CFDG、CFDG、ColdFusion、CSS、Delphi、DIV、DOS、Eiffel、Fortran、Fortran、FreeBasic、GML、Groovy、HTML、Inno、IO、Java、Java 5、Javascript、LaTeX、Lisp、Lua、Microprocessor ASM、mIRC、MySQL、NSIS、Objective C、OCaml、OpenOffice BASIC、Oracle 8 SQL、Pascal、Perl、PHP、PL/SQL、Python、Q(uick)BASIC、robots.txt、Ruby、SAS、Scheme、SDLBasic、Smalltalk、Smarty、SQL、T-SQL、TCL、thinBasic、Uno IDL、VB.NET、Visual BASIC、Visual Fox Pro、Winbatch、XML

No.445
06/15 16:07

edit


PHPの有用なソースが多数登録されているサイト http://www.phpclasses.org/

なかなかいいクラスがそろっています。

http://www.phpclasses.org/


No.444
06/15 16:07

edit


PHPからunixシェルコマンドを実行しその結果を取得する。

シェルコマンドを実行する関数は

・shell_exec() もしくは バッククォート(`)でコマンドを囲む
・passthru()
・system()
・exec()
・popen()
・proc_open()

と6つありますが、

それぞれの違いは

・shell_exec() 「実行結果の出力がテキスト」のコマンドを実行する場合に使用する
・passthru()  「実行結果の出力がバイナリ」のコマンドを実行する場合に使用する
・system()   コマンド実行結果のうち最後の一行だけ取得
・exec()     コマンド実行結果を指定した変数へ返す(配列で取得)
・popen()     プロセスへのファイルポインタをオープンする
・proc_open()  プロセスへの入出力用ファイルポインタを開く

shell_exec()【コマンド実行結果を全て取得】(スカラーで取得)

passthru()【コマンド実行結果を直接標準出力へ出力。戻り値はナシ。指定した変数へUnixコマンド実行結果が帰る】

passthru()関数はexec()関数と同様にコマンドを実行します。 引数 return_var を指定した場合、 Unix コマンドのステータスで置換されます。Unix コマンドからの出力がバイナリデータであり、 ブラウザーへ直接返す必要がある場合 passthru()を 使用する必要があります。

system()【コマンド実行結果のうち最後の一行だけ取得】

exec()【コマンド実行結果を指定した変数へ返す】(配列で取得)

popen()【プロセスへのファイルポインタをオープンする】

proc_open()【プロセスへの入出力用ファイルポインタを開く】

となっています。

また passthru() 、 system() はコマンド実行結果を標準出力(画面)に出力します。

なのでよく使うのは shell_exec(), exec() という事になります。

◆ shell_exec() の使い方

$output = shell_exec('ls -lart');
もしくは
$output = `ls -lart`;

◆ exec() の使い方

exec ( コマンド, 出力, 戻り値 );

コマンド:文字列(実行するコマンド)

出力:配列(実行結果を格納する配列)

戻り値:数値(戻り値を格納する変数)

です。

具体的には下記のように記述します。

$command = 'ls -la';
$output = array();
$ret = null;
exec( $command, $output, $ret );
print_r( $output );

◆ 標準エラーを取得するには。

shell_exec も exec も、結果を取得するのは標準出力(STDOUT)だけです。

標準エラー(STDERR)を取得するにはコマンドの最後に

2>&1

を追加するとよいでしょう。

例:

$command = 'ls -l';
$output = shell_exec("{$command}  2>&1");
print_r($output);
No.443
04/05 15:35

edit

現在の日付を求める

現在の日付を求めるには

$today = getdate();
print("$today[year]年$today[mon]月$today[mday]日¥n");

ただし、プログラムで日付を扱うときは桁を揃えた方が扱いやすいので

$today = getdate();
$year=sprintf("%04d",$today['year']);
$month=sprintf("%02d",$today['month']);
$day=sprintf("%04d",$today['day']);

がよいかと思われます。


No.436
05/16 21:48

edit


Smartyテンプレート内にcss定義など {} を含む文字列を記述する。

Smartyでは {} は変数を囲うマークアップとなります。

たとえば

.style2 {
font-size: small
}

はエラーとなってしまう。

これを防ぐには

.style2 {ldelim}
font-size: small
{rdelim}

と表記するか、

{literal}
.style2 {
font-size: small
}
{/literal}

と記述します。

No.435
07/25 15:25

edit

Smarty

PHPのプロセス番号を取得する

プロセス番号を取得する

PHPで実行中のプロセス番号を取得するには

$pid = getmypid();

と記述します。

( $pid にプロセス番号が返ってきます)


No.434
05/16 21:49

edit


PHPによるウェブサイトクローラー

■ サイトクローラー(巡回ロボット)クラス phpcrawl

・http://sourceforge.net/projects/phpcrawl/

※ phpcrawl には下記の不具合があります(2007.01.23現在)

・URI正規化が出来ない

・巡回間隔を設定できない(一気にアクセスしに行く)

・HTTPステータス 403 を理解しない


No.433
08/23 19:48

edit


WEBサービスAPIを利用するときに便利なPEARクラス

Yahoo!やGoogle, Amazon, Twitter, はてな 等の各種WEBサービスAPIを利用するときに便利なPEARパッケージ。

http://pear.php.net/packages.php?catpid=23&catname=Web%20Services


No.428
04/07 13:46

edit

API
PEAR

XML,HTMLを解析(パース)するクラスXML_HTMLSax

■ XML_HTMLSax

http://www.go-pear.org/package/XML_HTMLSax

インストール方法は

pear install -o XML_HTMLSax

でOK。

次にソースをダウンロードして、doc/examples の中のSimpleExample.phpを見てみます

ダウンロード:http://www.go-pear.org/package/XML_HTMLSax

    function openHandler(& $parser,$name,$attrs) {}
    function closeHandler(& $parser,$name) {}
    function dataHandler(& $parser,$data) {}
    function escapeHandler(& $parser,$data) {}
    function piHandler(& $parser,$target,$data) {}
    function jaspHandler(& $parser,$data) {}
openHandler:タグの開始位置に到達したときに実行されるメソッド
closeHandler:タグの終了位置に到達したときに実行されるメソッド
dataHandler:タグとタグの内容を取得したときに実行されるメソッド
escapeHandler:htmlコメントやDOCTYPEに到達したときに実行されるメソッド
piHandler:PHPコードに到達したときに実行されるメソッド
jaspHandler:JSP/ASP コードに到達したときに実行されるメソッド

これらを自分で自由に定義して使います。

No.422
04/08 10:00

edit

PEAR
XML

No.403
05/30 16:06

edit

No.356
11/08 17:28

edit


Smartyで 配列の中に要素があるかを調べる (in_array )

Smartyで PHP のin_array を使いたいなと思ったんですが、プラグインを書かなくても使えます。

$shop_idが配列$listの中に入っているかどうかを調べるには以下のようにする
テンプレートファイル内で以下のように記述する。
{if $shop_id|in_array:$list}すでに入っています
{else}配列の中には存在しません
{/if}

No.354
03/23 13:56

edit

Smarty
配列

xmlrpcを使って外部Blog(Livedoor Blog)を更新する

まず PEARのライブラリをインストール

pear install Net_URL
pear install Net_Socket
pear install HTTP_Request

次に

http://blog.livedoor.jp/t_furu/archives/50509529.html

のライブラリをダウンロードしてきて

config.phpの中の

$livedoor_id = "ライブドアID";
$password    = "ログインパスワード";
$blog_id     = "ブログID"; //自分のブログのURL中の blog_idパラメーターの値

を適宜書き換え、 index.phpを実行。

有用なソースを公開していただいている↓の方に感謝!

http://blog.livedoor.jp/t_furu/

No.348
04/07 15:11

edit

PEAR

PEAR Cache_Lite を使ってみる

Cacheクラス PEAR Cache_Lite を使ってみる。

インストールはコマンド一発。簡単。

pear install Cache_Lite

composerコマンドでも入れられます

composer require pear/cache_lite 
 ```

レンタルサーバの場合は
http://pear.php.net/package/Cache_Lite/download
からダウンロード

ソースは下記のような感じ

// クラス読み込み require_once('Cache/Lite.php'); // IDのセット $cache_id = '123456'; // オプション $options = array(

'cacheDir'               => '/tmp/',
'caching'                => 'true',	// キャッシュを有効に
'automaticSerialization' => 'true',	// 配列を保存可能に
'lifeTime'	             => 1800,	// 60*30(生存時間:30分)
'automaticCleaningFactor' => 200,	// 自動で古いファイルを削除(1/200の確率で実行)
'hashedDirectoryLevel'    => 1,		// ディレクトリ階層の深さ(高速になる)

); // オブジェクトのnew $cache=new Cache_Lite($options); // キャッシュデータがあるかどうかの判別 if( $cache_data=$cache->get($cache_id) ){

$buff = $cache_data;

} else{

// キャッシュデータがない。DBからデータを読み込む処理
// データ取得処理ここから
// ……………………… $read_data にデータを入れておく
// データ取得処理ここまで
$buff = $read_data;
$cache->save($buff, $cache_id);

} print_r($buff);


簡単、便利。
古くなったキャッシュファイルも自動で削除してくれるので余計なコーディングをしなくてすみます。

オプションについてのマニュアル:http://pear.plus-server.net/package.caching.cache-lite.cache-lite.cache-lite.html

マニュアル:http://pear.php.net/manual/en/package.caching.cache-lite.php

他のおすすめキャッシュクラスとしては
phpfastcache : https://packagist.org/packages/phpfastcache/phpfastcache    
がおすすめです  



No.334
03/08 20:29

edit

高速化
PEAR

【Smarty】で{foreach}の繰り返し回数を取得する

Smartyで繰り返しの回数を取得(カウント)するには予約変数 {$smarty.foreach.ループ名}を使用する。

{ foreach from=$loop key="key" item="value" }
 名前は{$value.name}です
{/foreach}

というループ箇所がある場合は、【name="任意のループの名前"】をつけて

【$smarty.foreach.任意のループの名前.iteration】で参照する。

(なお、iteration の値は1からはじまる。)

{ foreach from=$loop key="key" item="value" name="loopname"}
 名前は{$value.name}です
 ループ回数は{$smarty.foreach.loopname.iteration}です
{/foreach}

でOK。

また5回ループするごとに何か処理を行いたい場合は {if} を使う

{ foreach from=$loop key="key" item="value" name="loopname"}
 名前は{$value.name}です
 {if $smarty.foreach.loopname.iteration%5==0}5回繰り返しました{/if}
{/foreach}
No.333
11/24 11:20

edit

Smarty

PHPで1の位を切り上げ、切り捨てる

PHPで1の位を切り上げ、切り捨てるには以下のようにするといいでしょう

function floor_1( $no ){
	return floor(($no/10))*10;
}
function ceil_1( $no ){
	return ceil(($no/10))*10;
}
$data = floor_1(1957.5); // 1950 になります。
$data = ceil_1(1957.5); // 1960 になります。

10の位で切り上げ、切り捨てるには以下のようにするといいでしょう

function floor_10( $no ){
	return floor(($no/100))*100;
}
function ceil_10( $no ){
	return ceil(($no/100))*100;
}

その他数値関数は以下のとおり

srand       乱数初期化
rand        乱数発生
floor       切り捨て整数化
ceil        切り上げ整数化
round       四捨五入
sqrt        平方根
No.315
09/25 13:38

edit


PHPで環境変数一覧を取得する

PHPで環境変数一覧を取得するには

print "<pre>\n";
print_r($_SERVER);
print "</pre>\n";

とする。

これはつまり $_SERVER 変数を取得してきているので、それぞれを参照するには

$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$data =
"
------------------------------------------------------
Host  : {$hostname}
Addr  : {$_SERVER['REMOTE_ADDR']}
Agent : {$_SERVER['HTTP_USER_AGENT']}
------------------------------------------------------
";
print $data;

という風に記述する。

また getenv() という環境変数を取得する関数はWindows版PHPでは使えないことがあるので使用しないほうがよい。(またはgetenv()が使えないwindowsサーバで使用してもnullが返るので処理を入れておくほうが良い。)

No.309
11/17 17:40

edit

全角カタカナにマッチする正規表現

全角カタカナにマッチする正規表現

preg_match( '/[ァ-ヶ]+/',$text );

参考:Unicode対応文字コード表

http://ash.jp/code/unitbl21.htm

No.304
08/08 14:22

edit

正規表現
日本語

PHPでクッキーの読み書きをする

■PHPでクッキーを書き込むには

setcookie( $name, $value, $timeout, $path, $domain);

$name:名前

$value:値

$timeout:有効期限

$path:対象となるパス(指定したパス以下でcookieが有効)

$domain:対象となるドメイン

setcookie ( $name, $value, time( )+90*24*3600, '/' );  //90日で期限切れ

PHPでクッキーの値を削除するには

名前だけをセットして、値を空文字にして、【時間をnullにして】 setcookie を実行する

setcookie ( $name, '', null, '/' );  //クッキーの値を削除

PHPでクッキーを読み込むには

$data= $_COOKIE['cookie_name'];

とする。

No.300
04/20 16:26

edit

Cookie

Smartyを使ってRSS用日付を表示させる

■ 日付表示の基本

{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
 ↓
2007-07-04 18:00:00

■ RSS用 日付表示

<pubDate>{$date|date_format:"%a, %d %b %Y %H:%M:%S"} +0900</pubDate> 

■ RSS用 日付表示(現在の日付を表示する場合)

<pubDate>{$smarty.now|date_format:"%a, %d %b %Y %H:%M:%S"} +0900</pubDate>
↓
<pubDate>Fri, 27 May 2011 14:13:13</pubDate>
No.289
06/30 15:28

edit

Smarty
日付

日本語が入った正規表現で検索、置換を行う

日本語が入った正規表現を使って検索、置換を行うには preg_match , preg_replace を使う

その際文字化けが起こってしまうことが多いが、原因は【/】をエスケープし忘れている

ところにあると思うので、【/】はきちんとエスケープしよう。

1 日本語エンコードを指定する

mb_regex_encoding('UTF-8'); // もしくは SJIS, EUC-JP

2 検索する文字( $find_text )と区切り文字(/)はあらかじめエスケープしておく

$find_text = preg_quote($find_text, '/');

3 正規表現を使って置換を行う

$string=preg_replace("/($find_text)/", "置換する文字列",$string );

これで文字化けもおこらないと思います。

エンコードUTF-8で日本語を使う場合は u オプションを使用します

$string=preg_replace("/($find_text)/u", "置換する文字列",$string );
No.287
02/09 16:10

edit

正規表現
日本語

PHPのタイムアウト【Maximum execution time of 60 seconds exceeded】エラーが出る場合の対応

PHPで処理時間の長いプログラムを実行時に

【Maximum execution time of 60 seconds exceeded】(60のところは任意の数字)

が出てプログラムが終了する場合があります。

これは60秒以上かかったので強制終了したというエラーです。

どうしても処理が60秒以上かかる場合はタイムアウトまでの時間を変更します。

/etc/php.ini

max_execution_time = 30
max_input_time = 60

の箇所を修正する。

または PHPソース内に

ini_set("max_execution_time",180); // タイムアウトを180秒にセット

No.283
08/21 15:52

edit

エラー対処

多次元配列を結合する

配列を再起的に結合するには

array_merge_recursive

を使用する

array_merge_recursive ( array 配列1, array 配列2 )
No.276
08/12 10:15

edit

配列

Smartyで配列かどうかを判別するには?

Smartyで配列かどうかを判別するには is_array を使用します

{ if is_array($data) }
  { foreach from=$data key="k" item="v" name="loopname" }
    {$v|escape}
  { /foreach }
{ else }
  {$data|escape}
{ /if }
No.262
07/14 15:34

edit

Smarty
配列

RSSフィード(XML)をパースしてPHPオブジェクトに変換する【PEAR::XML_Serializer】

RSSフィード(XML)をパースしてPHPオブジェクト(や配列)に変換するには下記の2通りの方法があります

■1. PEAR::XML_Serializerを使用する方法

xml 文章を配列やオブジェクトにしてくれる PEAR::XML_Serializer

http://pear.php.net/package/XML_Serializer/download

からダウンロード

PEARでのインストール方法

pear install XML_Util
pear install XML_Serializer-0.18.0

でOK!

<b>またはこのファイルをダウンロード(phplib.zip)してサーバーにアップロードします。</b>

使い方

$url = "http://sankei.jp.msn.com/rss/news/points.xml"; // RSSフィードのURL
$xml = file_get_contents($url);
require_once "XML/Unserializer.php";
$parser = new XML_Unserializer(array('parseAttributes' => true));
$parser->unserialize($xml);
$data = $parser->getUnserializedData();
if (PEAR::isError($data)) {   print ('ERROR');   }
print_r($data);

エラー補足は PEAR::isError で行えます。

■2. SimpleXMLElement (要PHP5以降)を使用する方法

使い方

$url = "http://sankei.jp.msn.com/rss/news/points.xml"; // RSSフィードのURL
$xml = file_get_contents($url);
$xml = preg_replace( '/dc:/', 'dc_', $xml );
// <dc:subject> <dc:date> などを取得する場合は : を _ に置換する。
$data_obj = new SimpleXMLElement($xml);
$data = (ARRAY)$data_obj;
print_r($data);

どちらも簡単ですね!

添付ファイル1
phplib.zip ( 37.3 KBytes ) ダウンロード
No.258
03/18 09:59

edit

添付ファイル

XML
PEAR

エラー、警告メッセージをロギングする。

PHPではデフォルトでエラーをログに吐かない。

なので明示的にロギングをするよう設定する。

(PHPスクリプトの最初に記述しておく)

ini_set('log_errors', 1);					// エラーをロギングする

毎回記述するのが面倒な場合は

php.ini の該当箇所に記述する。


No.243
08/12 10:14

edit

エラー対処

ある月の日数を取得する

PHPである月の日数を取得するには

print date("t", time());

とします。


No.226
08/12 10:10

edit


チェックボックスの値を配列で受け取るため name="check[]" とするとJavaScriptで値が受け取れない問題について

JavaScriptでチェックボックスの値を受け取るには

<form name="FM">の<input type="checkbox" name="order_no[]">時
// form_name
var form_name = 'order_no[]';

// length
alert('合計' + document.FM.elements[form_name].length + '個のチェックボックスがあります');

// value
value_array = new Array();
for (i=0; i<document.FM.elements[form_name].length; i++ ){
	if(document.FM.elements[form_name][i].checked == true){
		value_array.push(document.FM.elements[form_name][i].value);
	}
}
alert('合計' + value_array.length + '個チェックされています');
alert(value_array);
No.222
03/31 15:33

edit

配列

PHPで日本語を扱うための設定をする mb_string

phpinfo()で【mbstring.language】の項目を見てみる

デフォルトでは【neutral】になっているので mb_string関連関数が動作しない

そこで実行するPHPスクリプトの先頭の方で以下の関数を実行する

mb_language( "ja");
mb_internal_encoding( "UTF-8"); // もしくは EUC-JP(PHPを記述している文字コードを指定)

尚php.iniの設定は

output_buffering              = Off

(PHPを記述している文字コードと出力文字コードが違う場合は on にする必要があるが、

文字コード変換はframworkで行うのが望ましいのでとりあえずoffでいい)

No.215
08/12 10:17

edit

日本語

Smartyで数字を3桁ごとにコンマで区切る

Smartyで数字を3桁ごとにコンマで区切るには

合計: {$sum|number_format}円

とします。

No.214
07/14 11:28

edit

Smarty

PHPでfillinform

PerlにはHTML::FillInFormという便利なモジュールがありますが
それをPHPでも!
fbisさん作 PHP版 HTML::FillInForm
http://d.hatena.ne.jp/fbis/searchdiary?word=HTML%3a%3aFillInForm



No.193
07/16 12:11

edit

PEAR関連

インストール方法

参考:http://dozo.matrix.jp/pear/index.php/PEAR/HTML_Template_Flexy

インストールされているモジュールの一覧

pear list

pear list-all (現在Stableな最新版のバージョンも表示)

モジュールのバージョンアップ

pear upgrade モジュール名

pearマニュアル

http://pear.php.net/manual/ja/


No.190
08/23 19:30

edit

PEAR

PHPのエラー表示を設定する

PHPのエラー表示を設定する箇所は `php.ini```phpソース内```.htaccess` の3箇所あります


#● php.ini に記述する場合
```
error_reporting = E_ALL & ~E_NOTICE
```

#● phpソース内に記述する場合
```
error_reporting(E_ALL ^ E_NOTICE);
```

#● .htaccessに記述する場合
```
php_value error_reporting 6135
```
.htaccess に記述する場合は定数は使えませんので数値で指定します  
http://php.net/manual/ja/errorfunc.constants.php  


#● エラーが全く表示されない場合
php.ini中の display_errors が Off になっているとエラーが一切表示されなくなります。
エラーがまったく表示されないときはphpソース内に
```
ini_set( 'display_errors', "1" );
```
とします。

また phpinfo(); で表示される画面から php.ini を探し出して php.ini ファイルを書き換えます。
```
display_errors = Off
  ↓
display_errors = On
```

No.70
03/08 21:04

edit

エラー対処

PHPの代表的なテンプレートエンジンsmartyのダウンロードとインストール

1. Smarty動作条件を確認する

Smarty動作条件は

Smarty 3.x: PHP 5.2+
Smarty 2.x: PHP 4 or 5

となっています。

条件に当てはまるバージョンのSmartyをダウンロードします。

2. ダウンロードした「Smarty-XXXXX.tar.gz」または「Smarty-XXXXX.zip」を解凍する

3. 解凍して出来たディレクトリ内の 「libsフォルダ」をFTPでアップロード(プログラムがあるphpディレクトリにアップロード)

4. テンプレート用フォルダを作成しパーミッションを変更する

templates (パーミッションは変更しなくてよい)
templates_c (パーミッション 777 に変更する)

5. テンプレート用フォルダ(templates)にテンプレートファイルをアップロード

テンプレートファイルを置くフォルダは「templates」です。

templates_cフォルダは Smarty が使用するフォルダですので一切触る必要はありません。

6. ディレクトリ例

このようなディレクトリ構成になります

 |-- [libs]
 |-- [templates]
 |-- [templates_c]
 |-- 実行するプログラム.php

7. phpコーディング例 ( ./templates/test.html を表示させる。)

require_once('Smarty/Smarty.class.php');
$template = new Smarty;
$template->display('test.html');

以上。簡単ですね。

■ Smarty3日本語マニュアル

http://www.smarty.net/docs/ja/

■ Tips

http://techblog.ecstudio.jp/tech-tips/smarty-tip.html

No.1
08/23 19:34

edit

Smarty