●メニューへ ●単福へ ●自動車の維持費をシミュレーション ●InDesign JavaScript ノート

FPDF/Image


Image('file',X,Y,W,H,'fileType','link');


TOPへ


FPDF/Output


Output

string Output([string name [, string dest]])

name
ファイルの名前

dest
ドキュメントを送信する送信先。 以下のうちのひとつを指定します。
I:ブラウザにインラインにて送信します。存在すればプラグインが利用されます。
D: 指定された名前で強制的にダウンロード。
F: 指定された名前で保存
S: PDFドキュメントを文字列として返します。 name パラメータは無視されます。


TOPへ


FPDF/インストール


FPDFのインストール
http://www.fpdf.org/
よりFPDFの最新版をダウンロード

http://www.setasign.de/products/pdf-php-solutions/fpdi/downloads/
よりPDFテンプレートを読み込むためのFPDIをダウンロード

http://www.geocities.jp/rui_hirokawa/php/pdf/
からMBFPDF 1.0bをダウンロード(日本語対応)
とパッチファイル(mbfpdfi102.patch.gz)をダウンロード

このパッチは、以下のように適用します。

$ cp fpdf/mbfpdf.php fpdf/MBfpdi.php
$ gzip -cd mbfpdi102.patch.gz | patch -p0

とあるので一旦
FPDFとFPDIとMBFPDFとmbfpdfi102.patch.gzをひとつのフォルダにまとめて
サーバにアップロードしtelnetでサーバにつないで
telnetから実行する。

作成された、MBfpdi.phpをfpdi.phpの代わりに使用する。

http://fpdf.japansite.net/


TOPへ


FPDF/サンプル


<?php
$myStr="あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ★。あいうえおかきくけこあいうえおかきくけこ1うえおかきくけこあいうえおかきくけこ★。";
require('fpdf153/MBfpdi.php');
$GLOBALS['EUC2SJIS'] = true;

$pdf=& new MBfpdi('L','mm','A4');

$pagecount = $pdf->setSourceFile("orig.pdf");
$tplidx = $pdf->ImportPage(1);

$pdf->addPage();
$s = $pdf->useTemplate($tplidx,0,0,297,210);

$pdf->SetY(10);
//$pdf->AddMBFont(KOZMIN ,'SJIS');
$pdf->AddMBFont(KOZGO ,'SJIS');
//$style="B" ;
$style="";
$font_size="8.5";
$pdf->SetFont(KOZGO,$style,$font_size) ;

$imageFile='test.jpg';
$targetW=128;
$targetH=126;
$newFile='test2.jpg';
$pdf->SetXY((297/2)-120, 150);
$pdf->MultiCell(115, 4, $myStr,0,"J");
$pdf->Output("new.pdf","F");

?>


TOPへ


JPEG/画像のサイズを調べる


$imageFile='test.jpg';
$imgA = imagecreatefromjpeg($imageFile);
$width=imagesx($imgA);
$height=imagesy($imgA);
imagedestroy($imgA); 


TOPへ


String/\の重複を修正する。


■\の重複を修正する。
$_GET[name]が\500ならprintすると\\500になるので
$data=stripslashes($_GET[name])とすると\\が解除される。
get_magic_quotes_gpcがONなら\\と重複する。
if (get_magic_quotes_gpc){
	$data=stripslashes($_GET[name]);
}else{
	$data=$_GET[name];
}


TOPへ


String/sprintfフォーマットする


$test = sprintf("%04d", 10);
print $test;

結果は0010

%04d
で0を4つ使って埋める、dは10進数の文字
ということです。

$money = 123.1;
$formatted = sprintf ("%01.2f", $money);
// echo $formatted は "123.10"を出力します

これは"%01.2f"
0ひとつ使って埋める
小数点以下は2桁分0で埋めるということでしょうか

sprintf("%02.0f",1);
で"01"と2桁の文字列を出力します。

% - パーセント文字。引数は不要です。
b - 引数を整数として扱い、バイナリの数値 として表現します。
c - 引数を整数として扱い、その ASCII 値 の文字として表現します。
d - 引数を整数として扱い、10 進数として 表現します。
u - 引数を整数として扱い、符号無しの10進 数として表現します。
f - 引数を double として扱い、浮動小数点数 として表現します。
o - 引数を整数として扱い、8 進数として 表現します。
s - 引数を文字列として扱い、表現します。
x - 引数を整数として扱い、16 進数として (小文字で)表現します。
X - 引数を整数として扱い、16 進数として (大文字で)表現します。


TOPへ


String/str_replace


$buf = str_replace('findstr','repstr',$buf);


TOPへ


String/strlen


strlen($findStr)>26


TOPへ


String/strpos


strpos($TXT,'<>')

検索する


TOPへ


String/substr


substr($Str,0,7);

123456789なら
1234567が返る

20060908を取り出すには
$Str="20060908";
$year=substr($Str,0,4);
$month=substr($Str,4,2);
$date=substr($Str,6,2);
になる。


TOPへ


date/date


date(Y)年4ケタ
date(n)月
date(m)月2ケタ
date(j)日
date(d)日2ケタ
date(H)時
date(i)分


a	:午前または午後(小文字)	am or pm
A	:午前または午後(大文字)	AM or PM
B	:Swatch Internet time	000 から 999
d	:日。二桁の数字(先頭にゼロがつく場合も)	01 から 31
D	:曜日。3文字のテキスト形式。	Mon から Sun
F	:月。フルスペルの文字。	January から December
g	:時。12時間単位。先頭にゼロを付けない。	1 から 12
G	:時。24時間単位。先頭にゼロを付けない。	0 から 23
h	:時。数字。12 時間単位。	01 から 12
H	:時。数字。24 時間単位。	00 から 23
i	:分。先頭にゼロをつける。	00 to 59
I :(大文字の i)	サマータイム制か否か	1ならサマータイム制。 0ならそうではない。
j	:日。先頭にゼロをつけない。	1 から 31
l :(小文字の 'L')	曜日。フルスペル形式。	Sunday から Saturday
L	:閏年であるかどうかを表す論理値。	1なら閏年。0なら閏年ではない。
m	:月。数字。先頭にゼロをつける。	01 から 12
M	:月。3文字形式。	Jan から Dec
n	:月。数字。先頭にゼロをつけない。	1 から 12
O	:グリニッジ標準時(GMT)との時間差	Example: +0200
r	:RFC 822 フォーマットされた日付	Example: Thu, 21 Dec 2000 16:01:07 +0200
s	:秒。先頭にゼロをつける。	00 から 59
S	:英語形式の序数を表すサフィックス。2 文字。	st, nd, rd or th. Works well with j 
t	:指定した月の日数。	28 から 31
T	:このマシーンのタイムゾーンの設定。	Examples: EST, MDT ...
U	:Unix 時(1970年1月1日0時0分0秒)からの秒数	See also time()
w:	曜日。数値。	0 (日曜)から 6 (土曜)
W	ISO-8601 月曜日に始まる年単位の週番号 (PHP 4.1.0で追加)	Example: 42 (the 42nd week in the year)
Y	:年。4 桁の数字。	Examples: 1999 or 2003
y	:年。2 桁の数字。	Examples: 99 or 03
z	:年間の通算日。数字。	0 から 366
Z	:タイムゾーンのオフセット秒数。 UTCの西側のタイムゾーン用のオフセットは常に負です。そして、 UTCの東側のオフセットは常に正です。


TOPへ


date/getdate


$myTime=time();
$ARY = getdate($myTime); 


配列が戻り値
	[seconds] => 40
	[minutes] => 58
	[hours]   => 21
	[mday]	=> 17
	[wday]	=> 2
	[mon]	 => 6
	[year]	=> 2003
	[yday]	=> 167
	[weekday] => Tuesday
	[month]   => June
	[0]	   => 1055901520


TOPへ


date/microtime


$time=time();

$time=microtime();


TOPへ


date/mktime


$myTime=mktime(22,45,5,7,5,2004);

時,分,秒,月,日,年

UNIXタイムスタンプを返す


TOPへ


date/time


$myTime=time();

1970/1/1 0:00:00
からの経過秒数


TOPへ


date/その年の祝日をかえす


function GETHOLIDAY($year){
	###############ここから###############

	#★★★★★日の決まった祝日★★★★★★★★★★★★★★★★★★★

	$HOLARY = array('test','','','0101','0211','0429','0503','0505','1103','1123','1223');
	#★★★★★春分・秋分日を計算(1980-2099まで有効)★★★★★★★★★

	$dirY = 1980;
	$syunbun = (int)(20.8431 + 0.242194*($year - $dirY) - (int)(($year - $dirY)/4));
	$syubun = (int)(23.2488 + 0.242194*($year - $dirY) - (int)(($year - $dirY)/4));
	$HOLARY[1] = ($year <= "2099") ? "03".substr("0".$syunbun,-2) : '';
	$HOLARY[2] = ($year <= "2099") ? "09".substr("0".$syubun,-2) : '';

	#★★★★★日の決まっていない祝日(何月第何月曜)★★★★★★

	$mARY = array("01", "07", "09", "10");
	$dARY = array("2", "3", "3", "2");
	for($N=0;$N<4;$N++){
		$monbuf=$mARY[$N];
		$syu=$dARY[$N];
		$youbibuf=strftime('%a',mktime(12,00,00,$monbuf,1,$year,0));#$Mon1月の1日の曜日を調べる
		$shuARY=array("Sun"=>2,"Mon"=>1,"Tue"=>7,"Wed"=>6,"Thu"=>5,"Fri"=>4,"Sat"=>3);
		$daybuf=$shuARY[$youbibuf];#これで最初の月曜日の日付がでる。
		$daybuf+=($syu-1)*7;#これで何週目の月曜が指定できる。
		if($daybuf<10){$daybuf=bTWOKETA($daybuf);}#2桁数字に整える。
		$HOLARY[]=$monbuf.$daybuf;
	}

	#★★★★★★★★★★ここから振替休日★★★★★★★★★★★
	foreach($HOLARY as $buf){
		$Mbuf=substr($buf,0,2);
		$Dbuf=substr($buf,2,2);
		$youbi=bGETYOUBI($year,$Mbuf,$Dbuf);
		if($youbi=="日"){
			$Dbuf++;
			$Dbuf=bTWOKETA($Dbuf);
		}
		$HOLARY2[]=$Mbuf.$Dbuf;
	}

	#★★★★★★★★★★ここから休日と休日の間・国民の休日を検索★★★★★★★★★★★

	foreach($HOLARY2 as $buf){
		$HOLARY3[]=$buf;
		$Mbuf=substr($buf,0,2);
		$Dbuf=substr($buf,2,2);
		$Dbuf2=bTWOKETA($Dbuf+2);
		if(array_search ($Mbuf.$Dbuf2, $HOLARY2)){
			if(bGETYOUBI($year,$Mbuf,$Dbuf)<>"土"){
				$HOLARY3[]=$Mbuf.bTWOKETA($Dbuf+1);
			}
		}
	}
	return $HOLARY3;

}


TOPへ


date/曜日を調べる


#★★★★★★★★★★★★★★★★★★★★★#
#★★★  		曜日を調べる  		★★★#
#★★★★★★★★★★★★★★★★★★★★★#

function bGETYOUBI($year,$mon,$day){
	#任意の日付けで曜日を出す
	$youbi=array('日','月','火','水','木','金','土');
	$y=$year; 
	$m=$mon; 
	$d=$day;
	if ($m < 3) {--$y; $m+=12;}
	$w=($y+ floor($y/4) - floor($y/100) + floor($y/400)+ floor((13*$m+8)/5) + $d) % 7;
	return "$youbi[$w]";#.$hol;
}


TOPへ


echoとprint/echoとprint


echoとprint "";文
echo "","","","";文 perlのHERE文と同じで複数行OK。;がでるまでつづけられる。


TOPへ


mysql/DataBase選択


$result=mysql_select_db(データベース名)


TOPへ


mysql/insert


DataBaseへinsert
$sql="insert into bbs set name='$db_name',e_mail='$db_mail',title='$db_title',";
$sql.="url='$db_url',contents='$db_cont',remote_host='$ip',datetime=now()";
$result=mysql_query($sql);
if(!$result){
エラー処理
}


TOPへ


mysql/mysqlへの接続


★mysqlへの接続。
$con=@mysql_connect(server名,ユーザー名,パスワード);
$con=@mysql_connect("localhost",$user,$pass);
if(!$con){
えらー処理
}
※@をつけないとmysqlのエラー文が表示されてしまう。


TOPへ


mysql/select


★Databaseからselect
$sql="select * from bbs";
$result=mysql_query($sql);
※返り値はリソースID

・selectできた数を調べる
$row=mysql_num_rows($result)


TOPへ


mysql/クエリ発行


$sql="insert into Smaster set ";
	$sql.=returnQuery($fieldNameList,0);
	#print $sql;
	#★★更新のsqlクエリ★★★★★★★★★★★★★★
	$sql=stripslashes($sql);
	$result = mysql_query($sql);
	if(!$result){
		return $_POST[ef0]."の新規保存に失敗しました。";
	}else{
		return $_POST[ef0]."を新規保存しました。";
	}


TOPへ


mysql/接続


function OpenDB($ID,$PASS){

	$user = $ID;#"COOP";
	$pass = $PASS;#"coopsql";
	$dbname = "kirari";

	###MySQLへの接続
	###mysql_connect(server名,ユーザー名,パスワード)

	$con = @mysql_connect("localhost",$user,$pass);
	#mysql_connectの返り値を$conに代入する
	#失敗した場合は、「@」が関数の前についているので、$conには何も入らない

	
	if(!$con){
		#もし$conが変数として存在しない場合(中身が空の場合・値が0の場合・値がfalseの場合)
		ErrorPrint("MySQLへの接続に失敗しました","MySQL接続エラー");
		exit;
	}
	
	#DBの選択
	$result = mysql_select_db($dbname);
	#$result = mysql_query("use ".$user);
	
	if(!$result){
		ErrorPrint("DBの選択に失敗しました","DB接続エラー");
		exit;
	}

}


TOPへ


mysql/全てを選択


#全てを選択のクエリーを発行。
$sql="select * from bbs where delflg='N' order by datetime desc limit ".$tmp.",".($limit+1);


TOPへ


mysql/値の取り出し


値の取り出し。
$myAry=mysql_fetch_array($result,option);

option
MYSQL_NUM	通常配列で取り出しfieldの左から順に[0]・・・・
MYSQL_ASSOC	連想配列で取り出し
		配列のkeyはmysqlのfield名
MYSQL_BOTH	上の両方。

例
#全てのデータを連想配列で取り出す。
$arr_data=mysql_fetch_array($result,MYSQL_ASSOC);

print $arr_data[name].",";
print $arr_data[e_mail].",";
print $arr_data[title].",";
print $arr_data[url].",";
print $arr_data[contents].",";
print $arr_data[remote_host].",";
print $arr_data[datetime].",";
print $arr_data[serial]."
";


★レコード分どうやって取り出すか
$arr_data=mysql_fetch_array($result,MYSQL_ASSOC);
↑これを繰り返すとデータを全て表示させることができる。
for ($i=1;$i<=$row;$i++){
	#全てのデータを連想配列で取り出す。
	$arr_data=mysql_fetch_array($result,MYSQL_ASSOC);
	$name	=	stripslashes($arr_data[name]);
	$mail	=	stripslashes($arr_data[e_mail]);
	$title	=	stripslashes($arr_data[title]);
	$url	=	stripslashes($arr_data[url]);
	$contents	=	stripslashes($arr_data[contents]);
	$remote_host	=	$arr_data[remote_host];
	$datetime	=	$arr_data[datetime];
	$serial	=	$arr_data[serial];
}


TOPへ


mysql/直前のupdate文で変更できたか


#mysql_affected_rowsの関数で変更がかかったかどうかチェックできます。
if(!mysql_affected_rows()){
	#直前のupdate文で変更がかかっていなかったら。
	ErrorPrint("パスワードが違います。");
	exit;
}


TOPへ


mysql/動いているかTEST


<?php
$user="root";
$pass="68000";
$con=@mysql_connect("localhost",$user,$pass);
if(!$con){
	print "えらー処理";}
$result=mysql_select_db("mysql");
$sql="select * from user";
$result=mysql_query($sql);
$row=mysql_num_rows($result);
$arr_data=mysql_fetch_array($result,MYSQL_ASSOC);
for ($i=1;$i<=$row;$i++){
	print $arr_data[User];
}

?>


TOPへ


mysql/文字化け


「INSERT」、「UPDATE」のクエリする直前に
mysql_query("SET NAMES utf8")
mysql_query("SET NAMES ujis")
mysql_query("SET NAMES euc")
などで文字コードを指定しておくと
文字化けしないで登録できる。


TOPへ


php/do文


do文
$i=1;
do{
	print "数値は".$i."です。
";
	$i++;
}while($i <= 10);


TOPへ


php/foreach


foreach文(連想配列のキーと値を取り出せる。)★
$price=array("りんご"=>120,"みかん"=>80,"ぶどう"=>150);
foreach($price as $key=>$value)
{
	print $key."は".$value."円だよ
";
}


TOPへ


php/for文


for文
for($i = 1 ; $i <= 10 ; $i++){
	print "数値は".$i."です。
";
}
while文
$i=1;
while ($i <= 10){
	print "数値は".$i."です。
";
	$i++;
}


TOPへ


php/functionの作り方呼び出し方


■functionの作り方
function OpenDB($data="デフォルト値"){
#引数が無ければデフォルト値が使われる。
return $data;
}

呼び出し方
OpenDB($data);
外部ファイルを作る場合はsubpack.incなど拡張子incで。


TOPへ


php/set_time_limit(90);


set_time_limit(90);


TOPへ


php/sleep(1);


sleep(1);
1秒停止


TOPへ


php/while文


while($FLG){
	if($bufAry==""){$FLG=false;}
	else{
	
		}
	}
}


TOPへ


php/スーパーグローバル変数


スーパーグローバル変数
$_GET[name]でGETで送信されたformのnameの内容を調べる。(旧バージョンでは$HTTP_GET_VARS)
$_POST[name]でPOSTで送信されたformのnameの内容を調べる。(旧バージョンでは$HTTP_POST_VARS)
$_ENV環境変数(旧バージョンでは$HTTP_ENV_VARS)
$_SERVERサーバー変数(旧バージョンでは$HTTP_SERVER_VARS)
$_COOKIEクッキーの値(旧バージョンでは$HTTP_COOKIE_VARS)
$_REQUESTゲットやクッキーやポストの内容全てが収納されるが下位互換なし。
$_FILESアップロードされたファイルの情報が入ります。(旧バージョンでは$HTTP_POST_FILES)
$_SESSIONセッションモジュールにより登録された内容が格納される。(旧バージョンでは$HTTP_SESSION_VARS)


TOPへ


php/ランダム


mt_rand(5, 15);

5〜15の乱数を生成する


TOPへ


php/リファレンスはどこにあるか?


http://www.php.net/download-docs.php


TOPへ


php/ループを抜ける


break;


TOPへ


php/外部ファイルを読み込む


include "./bfnc.php";


TOPへ


php/算術演算子


■算術演算子
A + B
A = B
A * B
A / B
A % B	A/Bのあまり
A++	Aに1を足す
A-	Aから1をひく


TOPへ


php/条件分岐


★条件分岐
if ($data == "朝"){
	print "おはようございます";
}elseif($data == "昼"){#★
	print "こんにちは";
}else{
	print "こんばんは";
}


TOPへ


php/比較演算子


■比較演算子
A > B
A < B
A >= B
A <= B
A == B等しい
A <> B違う★


TOPへ


php/変数


■変数
$data普通の変数
$data[0]配列
$data[name]連想配列

配列に値を入れるとき下記で自動でaddしてくれる。
$data[]="A"
$data[]="B"
$data[]="C"

$data=array("A","B","C")これでも同じ(arrayは関数名)

$data=array("1"=>"A","2"=>"B","3"=>"C")これも同じ。連想配列にも使える。


TOPへ


php/論理演算子


A and B	AとB
A && B	AとB
A or B	AかB
A || B	AかB
!A	Aではない。


TOPへ


いろいろな値を受け取り/$_FILES ファイルのアップロード


<form action="image.php" method="post" name="f">

<input type="hidden" name="MAX_FILE_SIZE" value="100000">

アップロードファイルを選択してください。

<input type="file" name="img" size="40">
<input type="submit" name="upload" value="アップロード">



if($_POST[upload]=="アップロード"){
	$fomatfol="./imgfolder";
	hSAVEIMG($fomatfol,$_FILES);
}


#★★★★★★★★★★★★★★★★★★★★★#
#★★★		  $_FILEを保存		  ★★★#
#★★★★★★★★★★★★★★★★★★★★★#

function hSAVEIMG($imgFol,$_FILES){
	if($_FILES['img']['name']){
		#print $_FILES['img']['name']."
";#クライアントマシンの元のファイル名。
		#print $_FILES['img']['tmp_name']."
";#アップロードされたファイルがサーバー上で保存されているテンポラ リファイルの名前。
		#$_FILES['img']['type']#ファイルのMIME型。ただし、ブラウザがこの情報を提供する場合。 例えば、"image/gif"のようになります。 
		#$_FILES['img']['size']#アップロードされたファイルのバイト単位のサイズ。 
		#print $_FILES['img']['error'];
		
		$kakucyou=$_FILES['img']['type'];
		if		(strpos($kakucyou,"jpeg")>0){$kakucyou="jpg";}
		elseif	(strpos($kakucyou,"jpg")>0){$kakucyou="jpg";}
		elseif	(strpos($kakucyou,"gif")>0){$kakucyou="gif";}
		elseif	(strpos($kakucyou,"png")>0){$kakucyou="png";}
		else{$kakucyou="";}
		if($kakucyou<>""){
			copy($_FILES['img']['tmp_name'],$imgFol.$_FILES['img']['name']);
		}
	}
}


TOPへ


いろいろな値を受け取り/$_POST


$btnName=$_POST[submit];


TOPへ


いろいろな値を受け取り/$_SERVER


■ユーザー情報の取得
$ip=$_SERVER["SERVER_ADDR"];
$blowser=$_SERVER["HTTP_USER_AGENT"];
print "<h2>あなたのIPアドレスは".$ip."です</h2>";
print "<h2>あなたのブラウザは".$blowser."です</h2>";


TOPへ


いろいろな値を受け取り/HOSTネームを調べる


$IP=getenv(REMOTE_ADDR);
	$HOST=getenv(REMOTE_HOST);
	if($HOST==""){$HOST=gethostbyaddr($IP);}
	if(eregi("yahoobb219029008014|localhost",$HOST)){#proxやsquidが含まれる。
		return "";
	}
	$PORT=getenv(REMOTE_PORT);


TOPへ


いろいろな値を受け取り/IPアドレス


$IP==getenv(REMOTE_ADDR)


TOPへ


いろいろな値を受け取り/POSTかGETか


if($_SERVER['REQUEST_METHOD']=="POST"){
		$TXT=hESC($_POST[file]);
	}


TOPへ


いろいろな値を受け取り/チェックボックス


チェックボックスの値の送受信

こんな感じで送ると
<td><input type="checkbox" name="FB[1]" value="2004/11/08">08</td>
<td><input type="checkbox" name="FB[2]" value="2004/11/09">09</td>
<td><input type="checkbox" name="FB[3]" value="2004/11/10">10</td>
<td><input type="checkbox" name="FB[4]" value="2004/11/11">11</td>
<td><input type="checkbox" name="FB[5]" value="2004/11/12">12</td>

こんな感じで受け取れる。
$FB=$_POST[FB];
if(!$FB){$FB[]="";}
foreach($FB as $buf){
	print $buf;
}
$FBにはvalue値が入る


TOPへ


インストールや設定/httpd.confの変更など


php-4.2.0-win32フォルダの中のフォルダ名を
phpに変更してC:\phpの状態にする。

httpd.confに下記の3行を追加する。

LoadModule php4_module c:/php/sapi/php4apache.dll
AddType application/x-httpd-php .php .inc
AddType application/x-httpd-php-source .phps


さらに
phpフォルダ内のphp.ini-distをphp.iniにする

php4ts.dllをC:\WINDOWS\SYSTEMフォルダにコピーする。

国際化版ではこのインストール方法は使えないようだ。


TOPへ


インストールや設定/さくらサーバでメールをトリガーに(空メール)


転送先設定で届いたメールをPHPに転送するようにしておく
PHPでは転送されたメールを読み込んで処理する。

●設定1転送設定

さくらサーバ
コントロールパネルで
メールアドレスの管理
該当するメールの転送設定を作成する(転送先はなんでもいい)
FTPでさくらサーバに接続
/home/アカウント名/MailBox/メールID/
に.mailfilterができているので、内容を
to "| /usr/local/bin/php /home/アカウント名/www/test.php"
exit
に書き換えてアップ。
※要注意!パーミッションは600!!!

●設定2PHP
/home/アカウント名/www/test.phpの内容
#!/usr/local/bin/php -q
<?php
set_time_limit(0);
$stdin = fopen("php://stdin", "r");
while(!feof ($stdin)){
	$mail .= fgets($stdin, 4096);
}
fclose ($stdin);

$fp = fopen('./mail.txt', "a");
set_file_buffer($fp, 0);
flock($fp, 2);
fwrite($fp, $mail);
flock($fp, 3);
fclose($fp);
?>
1行目の#!/usr/local/bin/php -qは必要!
動かすとでき上がるmail.txtを解析すればOK


TOPへ


インストールや設定/さくらサーバにPHP5


さくらレンタルサーバにPHP5をインストールする場合はスタンダード以上のプランでないとダメ

activecollabを参考にまとめてみました。
http://www.curlybrace.net/wp/activecollab

----------------------------------------------------------------------
1. PHP5をダウンロード
http://www.php.net/downloads.php
こちらのサイトから”php-5.X.X.tar.gz”を落とす。
----------------------------------------------------------------------
2. PHP5をサーバにアップ
/home/アカウント名/にworkディレクトリを作成しphpの圧縮ファイルをサーバにアップ。
----------------------------------------------------------------------
3. telnetでさくらサーバにつなげる
MACターミナルで“telnet アカウント名.sakura.ne.jp”と打ち込んで実行。
----------------------------------------------------------------------
4. ログインして圧縮されたファイルを解凍する
まずログインします。ログインしたら“cd /home/アカウント名/work/”と打ち込んで
tar.gzのあるフォルダまで移動。
“tar xzvf php-5.X.X.tar.gz”と打ち込んで解凍します。
“ls”コマンドでphp-5.X.Xというフォルダができたか確認。
----------------------------------------------------------------------
5. configにシェルを実行--(GDバンドル版)
★★★★★下記シェルスクリプトをconf.shというファイル名で保存★★★★★
#!/bin/sh

./configure \
--prefix=$HOME \
--with-config-file-path=$HOME/www/php5.ini \
--program-suffix=5 \
--with-pear=$HOME/share/pear5 \
--enable-force-cgi-redirect \
--enable-mbstring=all \
--enable-mbregex \
--enable-mbstr-enc-trans \
--enable-versioning \
--enable-trans-sid \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--with-mysql \
--with-openssl=/usr \
--with-soap=yes \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-ttf \
--with-freetype-dir=/usr/local \
--with-curl
★★★★★ここまで★★★★★
※\はバックスラッシュ(半角の¥)に置き換えて下さい。
“php-5.X.X/にconf.shアップ。
“cd php-5.X.X”
“sh conf.sh”で実行。
いろいろ文字が出て最後に「thank you for using(installing?) PHP」の文字が出る。
----------------------------------------------------------------------
6. makeコンパイル
シェルを実行したら、“make”でコンパイル。数分かかる。
----------------------------------------------------------------------
7.PEARを動かす設定をする。
“setenv PHP_PEAR_CACHE_DIR /home/アカウント名/php5/pear/cache;”
----------------------------------------------------------------------
8. make install
コンパイルが終わったら“make install”でインストールします。
/home/アカウント名/bin/のなかにphp5というフォルダが出来ますので
“ls /home/アカウント名/bin/”で確認してみてください。
----------------------------------------------------------------------
9. cpコマンドで移動
さくらのサーバだとcgi-binのフォルダがない可能性があるので、
ないときは“mkdir /home/アカウント名/www/cgi-bin”でフォルダを作る。
“cp 〜/bin/php5 〜/www/cgi-bin/php5.cgi”と打ち込んでコピーします。
----------------------------------------------------------------------
10. htaccessを設置
/home/アカウント名/www/の下に.htaccessを設置します。
すでにhtaccessファイルがあるようでしたら、既存のファイルに
Action php5-script /cgi-bin/php5.cgi
AddHandler php5-script .php5
を追加。
これで.php5という拡張子のファイルはPHP5で動作するようになります。
“exit”でログアウトして終了です。
----------------------------------------------------------------------
11.テスト
<?
phpinfo();
?>
をinfo.php5
という名前で保存してアップしてテストします。
----------------------------------------------------------------------
12.ディレクトリの削除
workディレクトリとアカウント名直下のphp5ディレクトリは削除してもOKみたい。


TOPへ


インストールや設定/モジュールを使えるようにする


mbモジュールを使用する方法

php.iniをC:\WINDOWSへ移動

;extension=php_mbstring.dll
の;をはずす

extension_dir = "./"を下記のように変更
extension_dir = "C:/php/extensions"


TOPへ


クッキーやヘッダ/header


header("Location: ".$URL);


TOPへ


クッキーやヘッダ/setcookie


setcookie("KIRARI",time(),0);
setcookie("KIRARIUSER",$ID,0);

引数は
クッキー名,クッキーの値,有効期限

有効期限はtime()ユニックスまたはmktime()関数で作られる
UNIXタイムスタンプ形式

setcookie($NAME);
setcookie($NAME,0,0);
値を何も入れないとクッキーを消せる


TOPへ


クッキーやヘッダ/キャッシュさせない


# 日付が過去
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
# 常に修正されている
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
# HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
# HTTP/1.0
header("Pragma: no-cache");


TOPへ


クッキーやヘッダ/クッキーの値を取り出す


$time=$_COOKIE[$NAME];


TOPへ


クッキーやヘッダ/クッキーガ存在するか?


if(isset($_COOKIE[$NAME])){


TOPへ


クッキーやヘッダ/クッキーサンプル


#このファイルをインクルードするだけでチェックできる。
	$NAME="KIRARI";
	$OVERTIME=30;#単位分
	$URL="./login.php";
	$COOKIEFLG="true";
	if(isset($_COOKIE[$NAME])){
		$time=$_COOKIE[$NAME];
		$timeflg1=time()-$time;
		$timeflg2=60*$OVERTIME;
		if($timeflg1>$timeflg2){
			$COOKIEFLG="timeover";
			setcookie($NAME);
			setcookie($NAME,0,0);
		}else{
			setcookie($NAME);
			setcookie($NAME,time(),0);
		}
	}else{$COOKIEFLG="false";}
	if($COOKIEFLG=="true"){
		return;
	}


TOPへ


クッキーやヘッダ/プロクシに制限をかける


##########ここからプロクシチェック#############
	$FLG=false;
	$IP=getenv(REMOTE_ADDR);
	$HS=getenv(REMOTE_HOST);
	if($HS==""){$HS=gethostbyaddr($IP);}
	$PO=getenv(REMOTE_PORT);
	#.jp 、.bbtec.net 、 .il24.net 以外は規制
	if(!eregi('\.jp|\.bbtec.net|\.il24\.net|localhost',$HS)){$FLG=true;}
	#以下の環境変数に何か含まれてたらアウト
	if(getenv(HTTP_VIA)){$FLG=true;}
	if(getenv(HTTP_CACHE_INFO)){$FLG=true;}
	if(getenv(HTTP_SP_HOST)){$FLG=true;}
	if(getenv(HTTP_FORWARDED)){$FLG=true;}
	if(getenv(HTTP_FORWARDED_FOR)){$FLG=true;}
	if(getenv(HTTP_X_FORWARDED_FOR)){$FLG=true;}
	if(getenv(HTTP_CLIENT_IP)){$FLG=true;}
	#ホスト名にprox squid cache www dns firewall
	if(eregi('prox|squid|cache|www|dns|firewall',$HS)){$FLG=true;}
	if($FLG==true){
		ERREXIT("プロクシ経由での予約は現在行っておりません。");
	}


TOPへ


クッキーやヘッダ/強制リフレッシュ


header("Refresh:600");

単位秒


TOPへ


クッキーやヘッダ/携帯かどうか調べる


<?php

$user_agent= explode( "/", $_SERVER['HTTP_USER_AGENT']);

$TANMATSU=$user_agent[0];

if($TANMATSU=="DoCoMo"){$URL="indexk.php";}

elseif($TANMATSU=="L-mode"){$URL="indexk.php";}

elseif($TANMATSU=="ASTEL"){$URL="indexk.php";}

elseif($TANMATSU=="UP.Browser"){$URL="indexk.php";}

elseif($TANMATSU=="PDXGW"){$URL="indexk.php";}

elseif($TANMATSU=="J-PHONE"){$URL="indexk.php";}

elseif(preg_match("/^KDDI/",$TANMATSU)){$URL="indexk.php";}

else{$URL="demo.html";}

header("Location: ".$URL);

?>


TOPへ


ファイルの読み書き/chmod


chmod($file,0666);


TOPへ


ファイルの読み書き/copy


copy($file, $file.'.bak')

0=false
1=trueで返ってくる


TOPへ


ファイルの読み書き/mkdir


mkdir($fol,0766);


TOPへ


ファイルの読み書き/mkdirロック


#★★★★★★★★★★★★★★★★★★★★★#
#★★★		  ファイルロック		  ★★★#
#★★★★★★★★★★★★★★★★★★★★★#
function mkdirLook(){
	global $lock;
	if(file_exists($lock)){
		#ファイルが存在して時間が昔のものなら消しておく。
		$list=(stat($lock));
		$ftime=$list[ctime];
		$mytime=time();
		if($mytime-5>$ftime){mkdirunlock();}
	}
	$retry=5;
	while(file_exists($lock)){
		if($retry==0){
			#ロックに失敗したらエラーを返す。
			return false;
			exit;
		}
		sleep(1);
		$retry--;
	}
	#成功したら
	touch($lock);#空のファイルを作成する
	chmod($lock,0755);
	return true;
}


#★★★★★★★★★★★★★★★★★★★★★#
#★★★		  ロック解除		  ★★★#
#★★★★★★★★★★★★★★★★★★★★★#
function mkdirunlock() {
	global $lock;
	if(file_exists($lock)){
		unlink($lock);
	}
}


TOPへ


ファイルの読み書き/ディレクトリかどうか調べる


is_dir($file);


TOPへ


ファイルの読み書き/バックアップファイルを開く


書き込みに常に2つのファイルに書き込んでおき
開くときにファイルサイズの大きい方を開く。
バックアップがないときも下記で新たに作られる。

function READLIST($readFile){
	$readFile=fGETBAK($readFile);
	if(file_exists($readFile)){
		$LIST=file($readFile);
	}
	$LIST=array_map('trim',$LIST);
	return $LIST;
}

#★★★★★★★★★★★★★★★★★★★★★#
#★★★	バックアップファイル名をGET	★★★#
#★★★★★★★★★★★★★★★★★★★★★#
function fGETBAK($file){
	$filebak=$file.".bak";
	#####比較###########
	if(file_exists($filebak)){
		$baksize=filesize($filebak);
	}else{
		$baksize=0;
	}
	if(file_exists($file)){
		$fsize=filesize($file);
	}else{
		$fsize=0;
	}
	if($baksize>$fsize){
		#要領が大きいほうを小さい方にコピーする。
		copy($filebak,$file);
		chmod($file,0766);
		$refile=$filebak;
	}elseif($baksize<$fsize){
		copy($file,$filebak);
		chmod($filebak,0766);
		$refile=$file;
	}
	return $refile;
}

#★★★★★★★★★★★★★★★★★★★★★#
#★★★	バックアップファイルにも書き込み	★★★#
#★★★★★★★★★★★★★★★★★★★★★#
function fWRITEBAK($file,$wStr){
	if(file_exists($file)){
		$fp=fopen($file,"w");#書き込み	fpはfileの先頭
	}
	if($fp){
		flock($fp,LOCK_EX);
		fwrite($fp,$wStr);
		flock($fp,LOCK_UN);#ファイルを閉じる前に実行。
		fclose($fp);
	}
	#さらにバックアップもしておく。
	if(file_exists($file.".bak")){
		$fp=fopen($file.".bak","w");#書き込み	fpはfileの先頭
	}
	if($fp){
		flock($fp,LOCK_EX);
		fwrite($fp,$wStr);
		flock($fp,LOCK_UN);#ファイルを閉じる前に実行。
		fclose($fp);
	}
}


TOPへ


ファイルの読み書き/ファイルが存在するか


if(file_exists($file)){#ファイルがあるなら


TOPへ


ファイルの読み書き/ファイルを削除


if(file_exists($lock)){
		unlink($lock);
 }

ファイルを消す
bool unlink (filename)
0=false
1=trueで返ってくる


TOPへ


ファイルの読み書き/ファイルコピー


copy($fileA,$fileB);


$fileA->$fileBにコピー


TOPへ


ファイルの読み書き/ファイルサイズ


$baksize=filesize($filebak);


TOPへ


ファイルの読み書き/フォルダ内リスト作成


<?php
$targetdir="./datafolder/";
$DIRLIST=GETDIRLIST($targetdir);

if($DIRLIST<>""){
	foreach($DIRLIST as $buf){
		print $buf."
";
	}
}

#★★★★★★★★★★★★★★★★★★★★★#
#★★★	  フォルダ内リスト作成	★★★#
#★★★★★★★★★★★★★★★★★★★★★#

function GETDIRLIST($targetdir){
	if($targetdir==""){
		return "";
	}

	if(!file_exists($targetdir)){
		return "";
	}
	$dir=dir($targetdir);
	while(($ent=$dir->read()) !== FALSE){
		if(preg_match('/.+xml$|.+html$/',$ent)){
			$DIRLIST[]=$ent;
		}
	}
	return $DIRLIST;
}

?>


TOPへ


ファイルの読み書き/開く


★開く
$fp=fopen(filename,"mode");
エラーのときは$fpは空になる。if(!$fp)で確認
modeは
r	読み込み	fpはfileの先頭
r+	読み書き	fpはfileの先頭
w	書き込み	fpはfileの先頭	fileがなければ作成※開いた瞬間ファイルの中身が空になる。
w+	読み書き	fpはfileの先頭	fileがなければ作成※開いた瞬間ファイルの中身が空になる。
a	書き込み	fpはfileの終端
a+	読み書き	fpはfileの終端
※+がつくのは全部読み書き
★閉じる
fclose($fp);
★ファイルサイズを調べる。
filesize(filename);
★読み込む
fread($fp,バイト数);
バイト数はファイルサイズを調べて入れる。
このとき読み込んだバイト分カーソルも移動してしまう。
全部読み込むとファイルの最後にカーソルが移動する。
★カーソルを先頭に移動する。
rewind($fp);


TOPへ


ファイルの読み書き/開くお手軽に


改行区切りで配列がかえってくる。
$list1=file($file);

改行や余分なスペースを削除。
$list1=array_map('trim',$list1);

1つのテキストにしたい時は下記で
配列を結合する。この場合上のtrimはしない。
$StrData=implode("",$list1);


TOPへ


ファイルの読み書き/空のファイルを作成する


touch($lock);#空のファイルを作成する


TOPへ


ファイルの読み書き/更新日を表示


$filename = 'database.csv';
if (file_exists($filename)) {
 echo "最終更新日:" . date ("F d Y H:i:s.", filemtime($filename));
}


TOPへ


ファイルの読み書き/書き込む


★書き込む
fwrite($fp,"text");

★ファイルロック
flock($fp,operation)
ロックはfopenの直後にロック解除はfcloseの直前に
operation
LOCK_SH	共有ロック。読み込み可
LOCK_EX	排他的ロック	読み書き不可
LOCK_UN	ロック解除	※ファイルを閉じる前に実行。


$log="./count.dat";
$fp=fopen($log,"r+");
if(!$fp){
	print "ファイルを開けませんでした。";
	exit;
}
flock($fp,LOCK_EX);
$count=fread($fp,filesize($log));
rewind($fp);
$count++;
fwrite($fp,$count);
flock($fp,LOCK_UN);#ファイルを閉じる前に実行。
fclose($fp);

サンプル
function fWRITEGO($file,$writeTXT){
	$FLG=true;
	#print $file;
	$fp=fopen($file,"w");#書き込み	fpはfileの先頭
	if($fp){
		flock($fp,LOCK_EX);
		fwrite($fp,$writeTXT);
		flock($fp,LOCK_UN);#ファイルを閉じる前に実行。
		fclose($fp);
	}else{$FLG=false;}
	chmod($file,0766);
}


TOPへ


数値/四捨五入等


切上げ
ceil(数値);

切捨て
floor(数値);

四捨五入
round(数値);


TOPへ


数値/四捨五入等


切上げ
ceil(数値);

切捨て
oor(数値);

四捨五入
round(数値);


TOPへ


正規表現/.*を改行もOKにする


s (PCRE_DOTALL)

この修飾子が設定された場合、
パターン中のドットメタ文字は 
改行を含む全ての文字にマッチ。
 これを指定しない場合、改行は除かれます。 
この修飾子は、Perl の /s 修飾子と等価です。


TOPへ


正規表現/eregi_replace


$data=ereg_replace("\n","
",$data);#改行コードの変換

大文字小文字を区別しない
eregi_replace("http://","",$url);


TOPへ


正規表現/preg_grep


$ARY=preg_grep($data,$ARYmoto);

$dataは正規表現
$ARYmotoは配列。

配列の中から$dataにHITする配列を取り出す。


TOPへ


正規表現/preg_match


if(preg_match("/^KDDI/",$TANMATSU)){$URL="indexk.php";}

戻り値はint
preg_match("/^(.*)/",$moto, $matches);
print $matches[0];

 $matches[0]はパターン全体にマッチしたテキスト。 $matches[1]は最初の括弧付きのサブパターンに
マッチしたテキスト 。


TOPへ


正規表現/preg_replace


$TXT=preg_replace('/¥([0-9,]*)/',$fomat[$N2].'¥'.'$1</b></font>',$TXT);


TOPへ


正規表現/パターン


.	改行以外のすべての文字
[a-zA-Z0-9]	セット内の1文字[^a-zA-Z0-9]	セット以外の1文字
\d	数字
\D	数字以外
\w	英数字
\W	英数字以外
\s	スペース・tab・改行
\S	スペース・tab・改行以外
\n	改行chr(10)
\r	復帰chr(13)
\t	tab
\f	改ページ
\b	バックスペース
\0	ヌル文字

?	0または1個
*	0個以上
+	1個以上
{m,n}	m個以上n個以下

abc	abcにHIT
a|b|c	aかbかcにHIT

$	行の最後
^	行の先頭


TOPへ


設定/Macインストール




ダウンロードはこのへんから
http://www.entropy.ch/software/macosx/php/



TOPへ


設定/Windowsインストール


php-4.2.0-win32フォルダの中のフォルダ名を
phpに変更してC:\phpの状態にする。

httpd.confに下記の3行を追加する。

LoadModule php4_module c:/php/sapi/php4apache.dll
AddType application/x-httpd-php .php .inc
AddType application/x-httpd-php-source .phps


さらに
phpフォルダ内のphp.ini-distをphp.iniにする
そしてC:\WINDOWS\php.ini状態にする

php4ts.dllをC:\WINDOWS\SYSTEMフォルダにコピーする。

国際化版ではこのインストール方法は使えないようだ。


ダウンロードはこのへんから
http://jp2.php.net/get/php-4.3.4-Win32.zip/from/a/mirror


TOPへ


設定/Windowsダウンロード


ダウンロードはこのへんから
http://www.php.net/downloads.php

Windows Binariesの中の
PHP 4.3.10 installerとか。

php-4.3.10-installer.exeをダウンロードしインストール


TOPへ


設定/php.iniの場所


<?php
	phpinfo();
?>
で調べることができる。

MacOSXの場合は

/usr/local/php/lib/php.ini


TOPへ


設定/ディスプレイエラー


display_errors = On

これで表示



error_reporting  =  E_ALL & 〜E_NOTICE

Macではこうしないと
なんでもかんでもエラーに。。。
$ID=$_POST[myID];
とかが受けれなくなってしまう。


TOPへ


設定/モジュールを使用する方法


mbモジュールを使用する方法

php.iniをC:\WINDOWSへ移動

;extension=php_mbstring.dll
の;をはずす

extension_dir = "./"を下記のように変更
extension_dir = "C:/php/extensions"


TOPへ


宣言/include


include "./inc/userdata.php";
外部phpを読み込む


TOPへ


配列/1つめの配列を削除


array_shift($list1);


TOPへ


配列/N番目の要素を削除


$selectList=array_splice($selectList,$N);
#N番目の要素を削除


TOPへ


配列/もっとも小さい値


min($ary)


TOPへ


配列/もっとも大きい値


max($ary)


TOPへ


配列/キーを取り出す


$keyAry=array_keys($XML);


TOPへ


配列/ソートする


sort($todaylist);

戻り値なし。引数の配列がそのまま変更される

natsort($todaylist);

自然なsortになる。


配列のKEYでSORT
ksort($hash);
krsort($hash);



TOPへ


配列/ユニークな配列を取り出す


$myList=array_unique($myList);


TOPへ


配列/配列すべてにtrim


$list1=array_map('trim',$list1);


TOPへ


配列/配列に分割


$ary=explode(",",$str);
文字列$strを
","区切りで配列に分解


逆は
$stringdata=implode(",",$ary);


TOPへ


配列/配列の最初に値を入れる


array_unshift ($menu,'<table width="100%" border="0"><TR>');


TOPへ


配列/配列の作成


$list = array("A", "B", "C", "D", "E");


TOPへ


配列/配列の連結して1つの配列


array_merge
<?php
$array1 = array ("key1" => "val1", 2, 4);
$array2 = array ("a", "b", "key1" => "val2", "etc" => "val3", 4);
$result = array_merge ($array1, $array2);
print_r($result);
?> 

同じkeyは後ろが優先。

[key1] => val2
[0] => 2
[1] => 4
[2] => a
[3] => b
[etc] => val3
[4] => 4


TOPへ


配列/配列を文字列に連結


$str=implode(",",$ary);
配列$aryを連結します。
区切り文字に","が入る。


TOPへ


配列/配列内に存在するか?


if(in_array($STR,$ARY)){

$ARY内に$STRが存在するか?


TOPへ


配列/要素の数を数える


$num= count ($ARY)


TOPへ


変換/addslashes


$data=addslashes($data);	
#DB格納用にメタ文字をエスケープ

\を加えるということ


TOPへ


変換/base64


$sub=base64_encode($sub);
		$sub="=?ISO-2022-JP?B?".$sub."?=";


TOPへ


変換/htmlspecialchars


$data=htmlspecialchars($data);	
#HTMLの特殊文字の変換(タグの禁止))


TOPへ


変換/str_pad


str_pad ($str,3 [, " " [, option]])

文字列を3ケタになるように" "で埋める





オプションの引数には、 
STR_PAD_RIGHT, 
STR_PAD_LEFT, 
STR_PAD_BOTHを指定可能です。
指定されない場合、STR_PAD_RIGHT 。 


$M="1";
$M=str_pad($M,2,' ',STR_PAD_LEFT);

結果$M=" 1"


TOPへ


変換/strip_tags


TXT=strip_tags($TXT);


TOPへ


変換/stripslashes


stripslashesはaddslashesの反対

\をはぶく


TOPへ


変換/urlencode


こんな感じ。
$keyword = urlencode($keyword);


TOPへ


変換/整数にする


$num=intval("500");


TOPへ


変換/文字コード


$sub=mb_convert_encoding($sub,'JIS','SJIS');

SJIS<=JIS


string mb_convert_encoding (str, to-encoding [, from-encoding])


strの文字エンコーディングを from-encoding から to-encoding に変換。

from-encodingは","区切りで複数記述可。省略すると内部文字エンコーディング
from-encodingを"auto"にすると"ASCII,JIS,UTF-8,EUC-JP,SJIS" 




UCS-2LE
ASCII
JIS
UTF-7
UTF-8
EUC-JP
SJIS
eucjp-win
sjis-win


TOPへ