Php/php技術メモ
目次
- 1 dbクラス移行
- 2 参照渡し
- 3 参照渡し2
- 4 phpスクリプトをウェブサーバを使わずに実行する方法
- 5 クラスからクラスを呼び出す
- 6 変数値をクラス名とする
- 7 メソッド呼び出し
- 8 文字列分割について
- 9 配列の一部を削除
- 10 配列に追加
- 11 コード省略のメモ
- 12 エラーが表示されなくなる
- 13 スカラー値かどうか調査
- 14 変数値調査
- 15 配列格納確認
- 16 \n削除
- 17 半角カナを全角へ
- 18 エンコード変更
- 19 文字の数だけ連結させる
- 20 define使用方法
- 21 日付
- 22 smartyコレできる?
- 23 タイムアウト時間を指定する方法
- 24 定義済み変数
- 25 2重forループを抜ける
- 26 printfの使い方
- 27 サニタイズ
- 28 self,parentについて
- 29 json
- 30 301リダイレクト
- 31 sessionが4日で切れる問題
- 32 PHP4,5共通で動く参照クラスの書き方
- 33 foreachの参照渡し(php5はOK、php4では使えない)
- 34 elseif規約
- 35 windows・linux互換パス区切りdefine
- 36 include_pathにパスを追加する方法
- 37 レスポンスデータ
- 38 機種依存文字の文字コード変換
- 39 php5でエラーメッセージがでない処理落ちの原因
- 40 エラーログファイルに文字列出力
- 41 携帯でsessionを使う方法
- 42 オブジェクト作成
- 43 printのバッファを取る
- 44 クラスをハンドラに設定するときの書き方
- 45 リバースプロキシ設定
- 46 do~whileの高度な使い方
- 47 処理後に独自関数を実行させたい場合
- 48 phpバッチでサーバのIP取得(linuxのみ
- 49 ipアドレス最後の数字を取得
- 50 url解析
- 51 パラメータの型指定
- 52 正規表現でmatchする日本語文字列を取得
- 53 iphone4バイト絵文字削除
- 54 長過ぎるwwwを3つに省略
- 55 プロセスユーザー表示
- 56 バッチでip取得
- 57 無名関数変数引き継ぎ
dbクラス移行
Pear::DB → Pear::MDB2 速いらしい。
参照渡し
$a="c"; $b="a"; print $a; $a=&$b; $b="b"; print $a;
参照渡し2
$a = 1;
test($a);
function test(&$aa) {
$aa += 1;
}
$aは2になります。
phpスクリプトをウェブサーバを使わずに実行する方法
windows d:\php5\php.exe d:\home\test\test.php
linux /usr/local/bin/php /home/user1/batch/test.php
perlの場合は
windows perl d:\home\test\test.cgi
linux perl /home/user1/batch/test.cgi
クラスからクラスを呼び出す
$objdb = new class_db;
$objdb->_main("a");
print nl2br(print_r($objdb,1));
class class_db {
var $main;
var $cla2;
function _main($s) {
$this->cla2 = new class_db2;
$this->cla2->_trim("c");
}
}
class class_db2 {
var $main;
function _trim($s) {
$this->main = trim($s);
}
}
変数値をクラス名とする
class test
{
var $param = 1;
}
class test2
{
var $param = 2;
function test2($add) {
$this->param = $this->param + $add;
}
}
$name = "test";
$test =& new $name;
print $test->param;
$name = "test2";
$test =& new $name(2);
print $test->param;
メソッド呼び出し
このように動的にメソッドを呼ぶことも可能
$this->m[$name] $this->$name()
文字列分割について
explode() は正規表現無し
splitはphpの正規表現で分割
preg_splitはperl互換の正規表現で分割
配列の一部を削除
unset($foo["bar"]);
配列に追加
$test[] = "test"; →とおなじ array_push($test, "test");
コード省略のメモ
array_map("foo", $arr);
↓と同意コード
foreach ($arr as $value) {foo($value);}
エラーが表示されなくなる
error_reporting(0);
か
ini_set("display_errors",0);
//error_reporting(E_ERROR | E_WARNING | E_PARSE);
//ini_set("display_errors",1);
スカラー値かどうか調査
is_scalar($aaa);
変数値調査
$my=array("a","b","c","d","e");
var_dump($my);
//array(5) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" [4]=> string(1) "e" }
print_r($my);
//Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )
配列格納確認
nl2br(print_r($a),1)
\n削除
$value= preg_replace("/(\r\n|\r|\n)/","",$value)
半角カナを全角へ
$value=mb_convert_kana($value,"KV");
エンコード変更
$value=mb_convert_encoding($value,"EUC-JP",mb_detect_encoding($value));
文字の数だけ連結させる
$value=str_repeat($str,$cnt);
define使用方法
define('TEST',"test1");
print TEST;
日付
print date('Y/m/d H:i:s',time());
smartyコレできる?
<{section name=num loop=$category}>
<option value="<{$category[num].id}>"><{$category[num].name}></option>
<{/section}>
バッククオートすればできる
タイムアウト時間を指定する方法
php.iniの以下を変える デフォルト30(秒)になっている
max_execution_time=30 ↓ max_execution_time=2000
~.phpに以下コードを加える
set_time_limit(2000);
定義済み変数
print __LINE__; // ライン print __FILE__; // ファイルの絶対パス print dirname(__FILE__); // ディレクトリ絶対パス
2重forループを抜ける
continue 2; // や break 2;
printfの使い方
sprintf('a=%d', $a);
サニタイズ
<?php
$a = array("a"=>1,"b"=>2);
$c = sanitize($a);
print nl2br(print_r($c,1));
/* 不正データ削除 */
function sanitize($data)
{
if (is_array($data)) {
return array_map('sanitize', $data);
}
return str_replace("\0", , $data);
}
self,parentについて
self、parentを使用してクラス内のプロパティ/メソッドにアクセスした場合、static宣言していない場合、エラーとなってアクセスできません。
json
ver5.2以降であれば標準で使える
$values = array('id' => '1', 'data' => 'test');
$json = json_encode($values);
// string '{"id":"1","data":"test"}'
$values = json_decode($json);
// $values = json_decode($str, true); 第2引数をtrueにするとオブジェクトでなく連想配列が戻る
print nl2br(print_r($values,1));
301リダイレクト
header("HTTP/1.1 301 Moved Permanently");
header("Location: " . $url);
sessionが4日で切れる問題
ini_set('session.gc_maxlifetime', 360000 * 100); // セッション初回設定から期限までの秒
ini_set('session.cookie_lifetime', 360000 * 10); // セッション再設定から期限までの秒
// ↑session_start();より上に書く
PHP4,5共通で動く参照クラスの書き方
class Af
{
var $data;
function set($data)
{
$this->data = $data;
}
function get()
{
return $this->data;
}
}
class Backend
{
var $_af;
function Backend()
{
$this->_af =& new Af;
}
function &getAf()
{
return $this->_af;
}
}
$b =& new Backend; $af =& $b->getAf(); $af->set(100); $af2 = $b->getAf();
foreachの参照渡し(php5はOK、php4では使えない)
foreach ($arr as &$value )
{
$value = 1;
}
elseif規約
else ifではなくelseifが正しい
windows・linux互換パス区切りdefine
PATH_SEPARATOR
include_pathにパスを追加する方法
ini_set('include_path', '/lib:' . ini_get('include_path'));
php4.3以降
set_include_path('.' . PATH_SEPARATOR . dirname(__FILE__) . '/../application/lib/' . PATH_SEPARATOR . get_include_path());
レスポンスデータ
<form action="a.php" method="post"> <input type="checkbox" name="arr[]" value="aaa"> <input type="submit" value="send"> </form> print $_POST[arr][0] // aaaとなる
機種依存文字の文字コード変換
mb_convert_encoding("あいうえおⅡ", "utf-8", "sjis-win");
php5でエラーメッセージがでない処理落ちの原因
ini_set("memory_limit", "64M"); でメモリ値を大きくすると直る
エラーログファイルに文字列出力
error_log("test");
携帯でsessionを使う方法
ini_set('session.use_cookies', 0); // セッションIDの管理にCookieを利用するかどうかの設定です。
ini_set('session.use_only_cookies', 0); // セッションIDの保存をCookieのみで行うかどうかの設定。
ini_set('session.use_trans_sid', 1); // URLに自動的にセッションIDを埋め込むかどうかの設定になります。
を実行し、Aタグにsession_idを付加させる。 リダイレクトを使っているところは強制的に付加→sprintf("%s=%s",session_name(), session_id())
オブジェクト作成
$std = new stdClass(); $std->test = 1;
printのバッファを取る
ob_start(); echo "Hello "; $out1 = ob_get_contents(); ob_end_clean();
クラスをハンドラに設定するときの書き方
$this->register_outputfilter(array($this, 'smarty_outputfilter_test'));
リバースプロキシ設定
$_SERVER['HTTP_HOST'] = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST']; $_SERVER['REMOTE_ADDR'] = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; $_SERVER['SERVER_NAME'] = isset($_SERVER['HTTP_X_FORWARDED_SERVER']) ? $_SERVER['HTTP_X_FORWARDED_SERVER'] : $_SERVER['SERVER_NAME'];
do~whileの高度な使い方
do {
// 日付入力形式が異なるとき
if (checkdate($month, $day, $year)) {
break;
}
// 処理
} while(0);
処理後に独自関数を実行させたい場合
register_shutdown_function("__shutdown");
function __shutdown(){
echo "ended";
}
phpバッチでサーバのIP取得(linuxのみ
rtrim(`/sbin/ifconfig | /bin/grep inet | /bin/grep -v inet6 | /bin/cut -d ":" -f 2 | /bin/cut -d " " -f 1 | head -n1`);
ipアドレス最後の数字を取得
substr($ip, strrpos($ip, '.') + 1, strlen($ip))
url解析
$url = "http://google.com/hoge/piyo?test=1&test2=2"; $parse = parse_url($url); [scheme] => http [host] => google.com [path] => /hoge/piyo [query] => test=1&test2=2
パラメータの型指定
class Hoge{}
class Piyo{}
test(new Hoge()); // OK
test(new Piyo()); // NG
function test(Hoge $data) {
}
正規表現でmatchする日本語文字列を取得
// 日本語charsetが正しく設定されている場合
if (preg_match("!<name>([\W]*町)</name>!", $xml, $matches)) {
}
// 日本語charsetが正しく設定されていない場合
if (preg_match("!<name>([\w]*町)</name>!u", $xml, $matches)) {
}
iphone4バイト絵文字削除
mysqlのutf8でinsert時のエラーが起こるので削除する用途などに
$text = '右にくちびる | 💋 | 左にくちびる';
$text = preg_replace('/[¥xF0-¥xF7][¥x80-¥xBF][¥x80-¥xBF][¥x80-¥xBF]/', , $text);
// ちなみにmysql(utf8)のinsertエラー
SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x92\x8B\xE3\x83...' for column 'name' at row 1'
長過ぎるwwwを3つに省略
$str = "ぐーぐるWWWwwwwwwWWWWWwwwwwwWWWWWWwwwWWW:やほー";
$str = preg_replace("/[wwW]{3,}/iu", "www", $str);
// ぐーぐるwww:やほー
プロセスユーザー表示
echo posix_getpwuid(posix_geteuid())['name'];
バッチでip取得
if (preg_match('/inet addr: ?([^ ]+)/', `/sbin/ifconfig`, $matches)) {
echo $matches[1]; /127.0.0.1
}
`ifconfig`だとipが取れない可能性があるので、`/sbin/ifconfig`とする
無名関数変数引き継ぎ
$message = 'hello';
$example = function () use ($message) {
var_dump($message);
};
$example();
