http://www.asahi-net.or.jp/%7Ewv7y-kmr/memo/php_security.html
なんか上読んでると穴だらけで実運用したくない気がする。
エラーメッセージはphp4apache.dllのモジュールが見つかりませんとでるので紛らわしい。要はphp4ts.dllをc:\windowsに置いてないと依存関係が解決できずにエラーが出てしまう。php5に関しても同様。
PHPIniDir "C:/php"
remiレポジトリからインストール
yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum remove php php-pdo php-mbstring php-pgsql php-gd yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysql php-xml
さすがに7.3はcakephpがだめだった。7.2でもfile_get_htmlがダメなのでfile_get_contentsして、strに入れた後、str_get_htmlに変更して、ついでにHTTPのエラーハンドリングも入れる!しかし交通情報リカバリーバッチでしくって2日障害状態!!
昔はテキストエディタだけだったが、今やeclipseなどが利用できる時代。ZendStuidoというのがリモートデバッグも出来るらしいのだが、有料なので却下。無料といえばEclipseというわけでPHPEclipseが今のところ一番のお勧め。プラグイン入れるのが面倒な御仁には全部いりパッケージのEasyEclipseForPHPをお勧めしておく。
ob_start(); //ここでprint_rやvar_dumpしても画面に出力されずにバッファにたまる print_r($_SERVER); //バッファ取得 $tmp = ob_get_contents(); //バッファクリアしてバッファリングも終わり ob_end_clean();
$str = var_export($hogehoge, $true); $handle = fopen(a.txt, "w"); fwrite($handle, $str); fclose($handle);
変数の型を取得 | gettype($var) |
クラス名を取得 | get_class($var) |
配列の要素数取得 | count() or sizeof() |
バージョンによる変数名の違い | $_GETが4.2以降。$HTTP_GET_VARSなどが4.0.x |
エラーレベルの設定 | error_reporting(E_ALL) |
デバック手法1 | phpinfo()でHTTPリクエスト内容が取得できる |
デバック手法2 | print_r(配列)で配列内全表示,var_dumpやvar_exportも役立つ |
自分自身のパス名取得 | $_SERVER["PHP_SELF"] |
定数定義 | define(定数名,内容) |
定数一覧取得 | print_r(get_defined_constants()); |
include,requireされているファイル一覧表示 | get_included_files() |
文字コード変換 | Shift_JISの入力に対して、EUCに変換i18n_convert($_POST['test'],"EUC","SJIS"); |
コマンドラインから利用 | php ファイル名 |
コマンドラインから直接実行 | php -r 'echo "HelloWorld\n";' |
エラーメッセージの抑制 | @fopenなどと実行するとエラーメッセージが$php_errormsg荷格納され画面には表示されない |
インクルードパスの変更 | set_include_path("../lib"); |
環境変数の設定 | putenv("NLS_LANG=Japanese_Japan.JA16EUC"); |
日付の妥当性チェック | checkdate($month,$day,$year) |
基本PHPはソースEUCかつ出力もEUCで利用するのが一番トラブルが少ないが、携帯サイトなどで泣く泣くSJISを利用しなければいけない場合のTIPS
下記の手順でやれば文字化けもない
php.iniで設定するのはお勧めできないのでスクリプト単位で設定するのがお勧め。
ini_set('mbstring.http_output','SJIS'); ini_set('mbstring.http_input','SJIS'); ini_set('output_buffering','On'); ini_set('output_handler','mb_output_handler');
参考サイト
http://www.hizlab.net/app/phppg.html
本番環境などではOffになっていてその場合はエラーがまったく表示されないので画面が真白になってもあわてないこと。PHPのエラーログにはちゃんと出力される
display_errors = On
$a = "test"; $b = "a"; $c = $$b;
$a = "before"; $b = &$a; $b = "after";
$bを通して$aの内容を変更できる。要は参照渡し
拡張ライブラリでC言語でコンパイルされているので早い。
全角スペースはいってませんか?たまに意図せず紛れ込んで頭抱えます。
基本的に上記エラー表示をonにすればよい
requeire_onceは一度だけ読込む命令だが、同じファイルを相対パス表記と絶対パス表記でrequire_onceしていると別ファイルとみなされる。同じクラス名を宣言しているので二度目の読込で Cannot redeclare class のエラーがでる。上記を避けるにはrequire_onceの表記を絶対パスか相対パスかのどちらかに統一すること。どうやらDLLのバグらしい
セッションに格納したオブジェクトを取り出すところでもrequire_onceしとかないとクラス定義が未定のためメソッドが利用できない。PHPでは1リクエストで完結するの考えてみれば当然のことである。
上記エラーはヘッダー情報を操作した後にechoやprintなどの画面出力命令を行うとでてしまう。require_onceしているクラスファイルの<?php ?>タグ外の空行も画面出力とみなされるので注意
<?php mb_language("Ja"); $headers = "From: xxxxx@nifty.com\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/plain;charset=ISO-2022-JP\r\n"; $to = 'takeru.fujii@infinium.jp'; $subject = mb_convert_encoding('日本語テスト','iso-2022-jp','euc-jp'); $body = mb_convert_encoding('はるのうーたー','iso-2022-jp','euc-jp'); $result = mb_send_mail($to,$subject,$body,$headers); if (!$result) { echo "mail send failure!"; } else { echo "mail send to $to"; } ?>
php.iniのdefault_charset を変更してapache再起動
今までEUC-JPがデフォルトのOSでやってきたのであまりはまることは無かったが、基本的にHEADER関数で出力エンコーディングを指定した方が安全。CentOS4以降ではデフォルトUTF-8なのでEUC-JP前提のソースコードではそのままだと化ける
header("Content-type: text/html; charset=EUC-JP");