PHP PGPHPのプログラムのTIPSです。
TIPSコーディング規約付録 B. Zend Framework PHP 標準コーディング規約 ダブルクォーテーションとシングルクォーテーションの違いダブルクォーテーション 括弧内の変数は認識される。 requireとincludeの違いrequireはスクリプト解析前に置き換えされ、includeはそのときに置き換えられます。このためループでまわして、都度読み込みたいような場合は、includeを使います。require_onceとinclude_onceは1度しか評価を行わないので、2回以上読み込まれて、再定義エラーになる場合に使用します。 ログをとるerror_log("ログ",3,"/webroot/error.log"); を埋め込みます。 0:php.iniのerror_log参照 1:メール 2:他ホスト通知 3:ログファイル apacheにログをとるapache_noteを使う。 配列
ブラウザで中止しても続行させたいphp.iniに ignore_user_abort = On またmax_execution_timeを大きくしておきましょう mbstringhttp://php.s3.to/man/ref.mbstring.html 変数のデータ型gettype($hoge); もしくはis_array()とかで参照する。 substr他の言語をさわっているとよく間違える... String 関数 - 文字列の一部分を返す 文字列のバイト数strlen(bin2hex($hoge))/2 mb_strwidthはなんかおかしいんだよな... fgetcsvで文字化け使えそうで使えなかった... ので大変よくないやり方ですが、 //while ($data = fgetcsv($fp,2048)) { while ($data1 = fgets($fp,2048)) { $data1 = mb_convert_encoding($data1,"EUC-JP","SJIS"); $data = mb_split(",",str_replace('"','',$data1)); なんだこりゃ... チェックボックスhttp://www.fukushi-net.or.jp/takamoto/php/checkbox/ =&とは$hoge1 =& $hoge2とかで使ってたりしますが、これはリファレンスです。ポインタみたいなもんでしょうか。 日付日付をフォーマットしたい場合に、 date("Y-m-d", strtotime("2007/02/10 22:40:00")); 1年前date("Y-m-d",mktime(0,0,0,date("m"),date("d"),date("Y")-1)); 1日前とか1ヶ月前も同じ要領で。こんなことしなくても、 date('Y-m-d', strtotime('-1 day')); とか +3 weekで3週間後、-5 daysで5日前、-1 month で一ヶ月前。 strposの戻り値がintとboolean?見つかった場合は見つかった文字の開始位置、見つからなかった場合は、falseって型が違うではないか。この場合は、!==という比較演算子をつかいましょう。===もあります。 ==の比較がおかしい?$a = "00001"; $b = "01"; if ($a == $b) { //ここを通る } なんってこった....... ===かstrcmpを使います。 HTTP_RequestこれはHPの自動取得や自動POSTなどいろいろと応用がきくのでぜひ使いましょう。JAVAの場合は、HttpClient?を使えば楽にできます。Etherealを使って調べながらやりましょう。 $req =& new HTTP_Request("http://www.hoge.ho"); GET,POSTしたいURLを指定します。必要ならばヘッダを付加します。 $req->addHeader("User_Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); POSTの場合、変数と値をセットします。 $req->addPostData('koumoku','atai'); セットが終わったらリクエストを投げます。 $response = $req->sendRequest(); エラーかどうかを調べます。 if (PEAR::isError($response)) { // エラー表示 echo "エラー:".$req->getResponseCode(); もしくは $code = $req->getResponseCode(); で、そのレスポンスコードを確認します。404はNot Foundとかです。302とかであれば、LocationにリダイレクトされるURLがありますので、 $nexturl = $req->getResponseHeader("Location"); で取得して、 $req->setURL($nexturl); でURLをセットしておいて、もう一度 $response = $req->sendRequest(); とします。setURLでセットしたURLは $req->_url->url で参照可能です。エラーでないなら、 $body = $req->getResponseBody(); で取得したhtmlを$bodyに入れます。これを好きな形に加工します。 もし取得したデータを一行一行処理したいなら、 $bodyline = mb_split("\n",$body); foreach($bodyline as $linedata){ でグルグルまわします。他にもいろいろとありますので、ほんの一例です。cookieが必要なら、(ログインがあるような場合) $cookies = $req->getResponseCookies(); で取得しておきます。このcookieを渡したい場合は、 foreach ($loginCookies as $cookie) { $req->addCookie($cookie['name'], $cookie['value']); } でセットします。 URL分解parse_urlを使います。 $urlary = parse_url("http://hidekazu.dhs1.sst.ne.jp/pukiwiki/pukiwiki.php"); で、 $urlary['scheme']; http $urlary['host']; hidekazu.dhs1.sst.ne.jp $urlary['path']; /pukiwiki/pukiwiki.php 他にport,user,pass,query,fragmentとかあります。 正しいDNSかどうかをチェックしたい。//@以降を$hostpartに入れる if (!checkdnsrr($hostpart,"ANY")) { //error } http://www.teu.ac.jp/chiit/~dsuzuki/phpdoc/function.checkdnsrr.html HTTPの環境変数取得非同期実行system("/home/your/bgprog $arg1 $arg2 > /dev/null &"); 動かない場合は、> test.logとかしてログを出すかパスが通っているか調べるために set > path.log とかして、確認しておこう。 待ちsleep(秒); usleep(マイクロ秒); タイムアウトset_time_limit(秒数) セーフモードで実行されていると無効になるので、もしくはphp.iniでmax_execution_time で指定しておけば長いスクリプトに対応できます。セッションが維持される長さについては、session.gc_maxlifetimeの値を変更します。 戻るボタンPHPで戻るボタンを押すとキャッシュの有効期限れといわれる場合は、 $utime = date( "U" ) + 60 * 60 * 24; $expires = date( "D, d M Y H:i:s", $utime )." GMT"; header("Expires: {$expires}"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); とすればいいらしいのですが、XOOPSでいまいちうまくいきません。includeのfunction.phpやcp_function.phpあたりに header ('Content-Type:text/html; charset='._CHARSET); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header('Cache-Control: no-store, no-cache, max-age=1, s-maxage=1, must-revalidate, post-check=0, pre-check=0'); header("Pragma: no-cache"); の記述があり、このあたりだとは思うのですが... とりあえずfirefoxで LiveHTTPHeadersをいれて覗いていると、うまくいっているほうは、 Cache-Control: private, no-cache だめなほうは、 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 となっている。 ダウンロード$len = filesize($file_name); header("Content-type: application/force-download"); header("Content-Disposition: attachment ; filename=download.csv"); header("Content-Length: ". $len) ; //ファイル出力(文字コード変換含む) $kanji_code=mb_internal_encoding(); // 現在の内部文字コードをキープ mb_http_output("SJIS"); // HTTP文字コードをSJISに明示的に設定 readfile($file_name); // ファイルを読み込んでHTTP出力 mb_internal_encoding($kanji_code); // 内部文字コードを元に戻す //テンポラリファイルを削除 unlink($file_name); ディレクトリの中のファイルを削除$dellpath = "/work"; $dir = opendir($dellpath); while($file = readdir($dir)) { if(is_file($dellpath."/$file")) { unlink($dellpath."/$file"); } } closedir($dir); 文字の長さマルチバイトの時に全角2バイト、半角1バイトとして計算したい場合。 mb_strwidth($test) <--長さ mb_strimwidth($test,0,40,''); <--40バイトで切る ファイルシステムに関する関数の戻り値がおかしいキャッシュがきいているかもしれないので、clearstatcache()でクリアしておいきましょう。 配列の中身を確認したい。print_r($ary); タグを消したい!strip_tags スパム対策の画像を作りたい。アンチスパム画像だと思っていたんですが、CAPTCHA(completely automated public Turing test to tell computers and humans apart)っていうんですね。知らなかったです。 スパムがうざいスパム防止に使えるPEARパッケージ「PEAR::Net_DNSBL」 PHPからPDFを生成したい場合、TCPDFというものがあります。ただし日本語化けるそうなのですが、どうなんでしょうか。 wget http://downloads.sourceforge.net/tcpdf/tcpdf_4_0_027_php4.zip?modtime=1221827720&big_mirror=0 unzip tcpdf_4_0_027_php4.zip mv tcpdf_php4 /usr/local/lib/php /usr/local/lib/phpはphp.iniのincludeのところ cd /usr/local/lib/php/tcpdf_php4/fonts/utils/src/ttf2ufm-src make all ん?エラーが... scripts/unhtml <FONTS.hpux.html >FONTS.hpux /bin/sh: scripts/unhtml: 許可がありません とりあえず、 chmod -R 777 /usr/local/lib/php/tcpdf_php4/fonts/utils/src/ttf2ufm-src make all make install これでttf2pt1がつかえる。 wget http://ossipedia.ipa.go.jp/ipafont/IPAfont00203.php unzip IPAfont00203.zip cd IPAfont00203 ttf2pt1 -a -F ipag.ttf /usr/local/lib/php/tcpdf_php4/fonts/utils/makefont.php ipag.ttf ipag.ufm cp ipag.php /usr/local/lib/php/tcpdf_php4/fonts/ipagothic.php cp ipag.ctg.z /usr/local/lib/php/tcpdf_php4/fonts/ cp ipag.z /usr/local/lib/php/tcpdf_php4/fonts/ なんか重いな...
参考: ではFPDFを見てみましょう http://www.fpdf.org/en/dl.php?id=99にドキュメントがあります。 fpdf16.zipをダウンロードしました。 unzip fpdf16.zip mkdir /usr/local/lib/php/pdf cp fpdf.php /usr/local/lib/php/pdf/ cp -rf font /usr/local/lib/php/pdf/ wget http://www.fpdf.org/download/japanese.zip unzip japanese.zip cp japanese.php /usr/local/lib/php/pdf japanese.phpを修正します。 function AddSJISFont($family='SJIS')の $name='KozMinPro-Regular-Acro'; を $name='MSGothic'; では、動かしてみましょう。 <?php require('pdf/japanese.php'); define(SC_CHAR, "EUC-JP"); $pdf = new PDF_Japanese(); $pdf->AddSJISFont(); $pdf->Open(); $pdf->AddPage(); $pdf->SetFont('SJIS', '', 9); $pdf->Text(0, 10, sjis_conv("テスト")); $pdf->Output(); function sjis_conv($conv_str) { return (mb_convert_encoding($conv_str, "SJIS", SC_CHAR)); } ?> あら? FPDF error: mbstring overloading must be disabled php.iniを見ると、 mbstring.func_overload = 7 になっている。0にすれば出力されました。.htaccessに php_value mbstring.func_overload 0 とでもしておくか。 ん?windowsではゴシックでmacでは明朝になった... 次は、FPDIです。既存のPDFをテンプレートとして、そのPDFに文字を埋め込めます。 ではhttp://www.setasign.de/products/pdf-php-solutions/fpdi/のDownloadより FPDI-1.2.1.zip FPDF_TPL-1.1.2.zip 両方解凍後、 cp -rf * /usr/local/lib/php/pdf/ 次にjapanese.phpを修正します。 require('fpdf.php'); の下に require('fpdi.php'); を追加 class PDF_Japanese extends FPDF を//でコメントして、 class PDF_Japanese extends FPDI を追加。 ではテンプレートのファイルをtmp.pdfとして、そのPGのある場所に置いて、動かしてみましょう。 <?php require('pdf/japanese.php'); define(SC_CHAR, "EUC-JP"); define(TMPL_PDF, "tmp.pdf"); $pdf = new PDF_Japanese(); $pdf->AddSJISFont(); $pdf->Open(); $pageno = $pdf->setSourceFile(TMPL_PDF); $tplidx = $pdf->ImportPage(1); $pdf->AddPage(); $pdf->SetFont('SJIS', '', 9); $pdf->useTemplate($tplidx); $pdf->Text(0, 10, sjis_conv("テスト1")); $pdf->SetFont('SJIS', '', 30); $pdf->Text(30, 100, sjis_conv("テスト2")); $pdf->SetFont('SJIS', '', 20); $pdf->Text(50, 50, sjis_conv("テスト3")); $pdf->Output(); function sjis_conv($conv_str) { return (mb_convert_encoding($conv_str, "SJIS", SC_CHAR)); } ?> では今度はjapanese.zipではなく、mbfpdf10b.zipを使ってみましょう。 解凍後、 cp -rf * /usr/local/lib/php/pdf/ で、 <?php require_once 'pdf/mbfpdf.php'; $GLOBALS['EUC2SJIS'] = true; $pdf=new MBFPDF('P', 'mm', 'A4'); $pdf->AddMBFont(GOTHIC ,'SJIS'); $pdf->AddPage(); $pdf->SetFont(GOTHIC,'',20); $pdf->Write(10,"サンプル文字列"); $pdf->Output(); ?> ではこちらもFPDIに対応させましょう。MBfpdi.phpを開いて require('fpdf.php'); の下に require('fpdi.php'); を追加、また class MBFPDF extends FPDF を class MBFPDF extends fpdi に変更します。 <?php require_once 'pdf/mbfpdf.php'; $GLOBALS['EUC2SJIS'] = true; define("SC_CHAR", "EUC-JP"); define("TMPL_PDF", "tmp.pdf"); $pdf=new MBFPDF('P', 'mm', 'A4'); $pdf->AddMBFont(GOTHIC ,'SJIS'); $pdf->Open(); $pageno = $pdf->setSourceFile(TMPL_PDF); $tplidx = $pdf->ImportPage(1); $pdf->AddPage(); $pdf->SetFont(GOTHIC, '', 9); $pdf->useTemplate($tplidx); $pdf->Text(0, 10, sjis_conv("テスト1")); $pdf->SetFont(GOTHIC, '', 30); $pdf->Text(30, 100, sjis_conv("テスト2")); $pdf->SetFont(GOTHIC, '', 20); $pdf->Text(50, 50, sjis_conv("テスト3")); $pdf->Output(); function sjis_conv($conv_str) { return (mb_convert_encoding($conv_str, "SJIS", SC_CHAR)); } ?> 参考: QRhttp://blog.webcreativepark.net/2007/09/17-194842.html MySQLへの複数接続$dbsaki = mysql_connect("host","user","pass"); //これがいる mysql_select_db("dbname", $dbsaki); //クエリ $sql = "select ...."; mysql_query($sql,$dbsaki); 参考:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1447277 MySQLのAUTO_INCREMENTで生成された値を取得したい。mysql_insert_id() カンマ編集、ゼロサプレス(ゼロパディング)number_format sprintf("%03d", $hoge); 邪魔な文字を消したい。たとえば数値アルファベット以外を消したい場合は、 $hoge = ereg_replace("[^a-zA-Z0-9]", "", $hoge); 文中のURLをリンクへ,メールアドレスをmaillto$kkbody = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]","<a href='\\0' target='_blank'>\\0</a>",$kkbody); $match = '[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+' .'@[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+\.' .'(com|net|org|gov|edu|int|mil|biz|info|name|pro|jp|af|al|dz|as|ad|ao|ai|aq|ag|ar|am|aw|ac|au|at|az|bh|bd|bb|by|bj|bm|bt|bo|ba|bw|br|io|bn|bg|bf|bi|kh|cm|ca|cv|cf|td|gg|je|cl|cn|cx|cc|co|km|cg|cd|ck|cr|ci|hr|cu|cy|cz|dk|dj|dm|do|tp|ec|eg|sv|gq|er|ee|et|fk|fo|fj|fi|fr|gf|pf|tf|fx|ga|gm|ge|de|gh|gi|gd|gp|gu|gt|gn|gw|gy|ht|hm|hn|hk|hu|is|in|id|ir|iq|ie|im|il|it|jm|jo|kz|ke|ki|kp|kr|kw|kg|la|lv|lb|ls|lr|ly|li|lt|lu|mo|mk|mg|mw|my|mv|ml|mt|mh|mq|mr|mu|yt|mx|fm|md|mc|mn|ms|ma|mz|mm|na|nr|np|nl|an|nc|nz|ni|ne|ng|nu|nf|mp|no|om|pk|pw|pa|pg|py|pe|ph|pn|pl|pt|pr|qa|re|ro|ru|rw|kn|lc|vc|ws|sm|st|sa|sn|sc|sl|sg|sk|si|sb|so|za|gs|es|lk|sh|pm|sd|sr|sj|sz|se|ch|sy|tw|tj|tz|th|bs|ky|tg|tk|to|tt|tn|tr|tm|tc|tv|ug|ua|ae|uk|us|um|uy|uz|vu|va|ve|vn|vg|vi|wf|eh|ye|yu|zm|zw)'; $kkbody = ereg_replace($match,"<a href='mailto:\\0'>\\0</a>",$kkbody); 文字列折り返しマルチバイトの2バイト目とか考えるの面倒なときは、mb_strcutを使ってやれば。 デーモンを作る【PHP TIPS】 57. PEAR::Net_Serverでサーバデーモンを作ろう GDを使って画像加工したい画像保存<?php $temp=file_get_contents("http://www.google.co.jp/intl/ja_jp/images/logo.gif"); $handle=fopen("test.gif","w"); fwrite($handle,$temp); fclose($handle); ?> 画像合成<?php // 1枚目 $im1 = ImageCreateFromJpeg("a.jpg"); // 合成したいファイル $im2 = ImageCreateFromGif("b.gif"); // 合成 ImageCopy($im1, $im2, 470, 400, 0, 0, 169, 85); // 保存 書き込めないときは権限を見直しましょう Imagejpeg($im1,"/hoge/c.jpg"); // 破棄 ImageDestory($im1); ImageDestory($im2); ?> 出力バッファob_flushとflushの違いを理解しよう。
出力バッファ制御 リンクWindows機種依存文字の解消機種依存文字の解消のサンプルを提供していただいております。 レッツPHP! WebメーラWebメーラーのサンプルがあります。 PHP 基礎編9 - 正規表現、マッチ、置き換え、ereg、eregi、eregi_replaceセキュアな PHP アプリケーションを作成するための 7 つの習慣PHP でオブジェクト指向の設計をするための 7 つの良い習慣を身につける参考書籍コメント
|