PHP

【CakePHP2.x】モデルでのバーチャルフィールド設定方法。

これが使えれば、ちょっと特殊なSQLも簡単に発行可能。

下記使った時の例。(ちょこっと改変してあります)

public function myCount() {
	$return = Cache::read($this->name.'_'.__FUNCTION__);
	if(!$return) {
		// バーチャルフィールドの追加
		$this->virtualFields = [
			'count' => 'count('.$this->alias.'.id)'
		];
		$conditions = [
			$this->alias.'.status' => 1
		];
		$fields = [
			$this->alias.'.hoge',
			$this->alias.'.count',
		];
		$group = $this->alias.'.hoge';
		$return = $this->find('list', [
			'conditions' => $conditions,
			'fields' => $fields,
			'group' => $group
		]);
		Cache::write($this->name.'_'.__FUNCTION__, $return);
	}
	return $return;
}

う?む。唸るほど便利。

 

【PHP】配列を指定の位置で切り取る。

めも。

$arr = [1,2,3,4,5,6,7,8,9];

// 配列の4番目から3つの要素を取り出す。
$res = array_slice($arr, 3, 3);

// 配列の6番目以降をすべて取り出す。
$res = array_slice($arr, 5);

 

【PHP】CakePHP2.4のSecurityComponent、使い方めも。

超絶今更すぎるリマインド。

■セキュリティーコンポーネントを有効にする。

public $components = ['Security'];

※コントローラーのメンバ変数です。

■改竄対策、CSRF対策を個別に操作する。

// 改竄対策をオフにする
$this->Security->validatePost = false;

// CSRF対応をオフにする
$this->Security->csrfCheck = false;

 

【PHP】CakePHP2.xの例外処理まとめ。

忘れるので、自分用めも。

// Bad Request エラー
throw new BadRequestException('message');

// Forbidden エラー
throw new ForbiddenException('message');

// Not Found エラー
throw new NotFoundException('message');

// Method Not Allowed エラー
throw new MethodNotAllowedException('message');

// Internal Server Error エラー
throw new InternalErrorException('message');

// Not Implemented Errors エラー
throw new NotImplementedException('message');

 

【PHP】文字列をユニコードエンコードする。

素晴らしいコードを発見したのでペタリ。

// 文字列のユニコードデコードを行う
function unicode_decode($str) {
  return preg_replace_callback("/((?:[^\x09\x0A\x0D\x20-\x7E]{3})+)/", "decode_callback", $str);
}

function decode_callback($matches) {
  $char = mb_convert_encoding($matches[1], "UTF-16", "UTF-8");
  $escaped = "";
  for ($i = 0, $l = strlen($char); $i < $l; $i += 2) {
    $escaped .=  "\u" . sprintf("%02x%02x", ord($char[$i]), ord($char[$i+1]));
  }
  return $escaped;
}

// 文字列のユニコードエンコードを行う
function unicode_encode($str) {
  return preg_replace_callback("/\\\\u([0-9a-zA-Z]{4})/", "encode_callback", $str);
}

function encode_callback($matches) {
  $char = mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UTF-16");
  return $char;
}

※英数字、及び記号はエスケープされないので注意されたし。
そしてこれ、PHP6からはネイティブで実装されるらしい。いやPHP5で追加してくれよ。

 

【PHP】波ダッシュを文字列から取り除く。

波ダッシュのせいで色々と詰まりましたよと。

preg_replace('/\xE3\x80\x9C/', '', $string);

これで奴らを無力化出来るじぇじぇじぇ。

 

【PHP】CakePHPでソケット通信を行う。

ウェブサイト上のページコンテンツなどを取得したい場合に便利。

■GETリクエスト

App::uses('HttpSocket', 'Network/Http');
$HttpSocket = new HttpSocket();
$response = $HttpSocket->get('http://example.com');

■PSOTリクエスト

App::uses('HttpSocket', 'Network/Http');
$HttpSocket = new HttpSocket();
$response = $HttpSocket->post('http://example.com', ['key' => 'value']);

下記ページが大変参考になりました。

http://lennaert.nu/2013/12/01/how-to-use-httpsocket-instead-of-curl-in-cakephp-2/

 

【PHP】Simple_HTML_DOMの使い方メモ。

自分用。

■HTMLファイルの流し込み方

// 文字列
$html = str_get_html( '<html><head></head><body><p>hoge</p></body></html>' );

// URL
$html = file_get_html( 'http://example.com' );

// HTMLファイル
$html = file_get_html( 'hoge.html' );

■要素の取得方法

// 全てのdiv要素を取得
$res = $html->find('div');

// 見つけたdiv要素の先頭を取得
$res = $html->find('div', 0);

// id="hoge"なdiv要素を取得
$res = $html->find('div[id=hoge]');

// idを持っているdiv要素全てを取得
$res = $html->find('div[id]');

// idを持っている要素全てを取得
$res = $html->find('[id]');

// 全てのdiv要素を取得
$res = $html->find('div');

※基本的にはCSSセレクタと同様の記述が可能。
※find()の第2引数にindexを指定していない場合、マッチした要素が1つであっても結果はつねに配列で返されるため、連結したい場合は必ずindexを指定すること。

例)

$res = $html->find( 'div[id=hoge]', 0)->find( 'div.hoge', 0);

■コンテンツ(中身)を取得する

echo $html->find( 'div', 0)->tag; // Returns: " div"
echo $html->find( 'div', 0)->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $html->find( 'div', 0)->innertext; // Returns: " foo <b>bar</b>"
echo $html->find( 'div', 0)->plaintext; // Returns: " foo bar"

■メモリを解法する

このライブラリはクッソ重たいのでこまめにメモリを開放して上げる必要がある。
といっても下記メソッドを実行するだけで良い。

$html->clear();

ざっとこんな感じかな。