SQLの窓 イラストAC フリー素材

2016年11月20日

ImageMagick を Windows(32ビット)の PHP で利用する


php 5.4 と 5.6 で動作確認しました

Windows + PHP で ImageMagick するには、こちらからダウンロードします(サイトが無くなっているのでインターネットアーカイブです)

ここからは、画像フォーマット用の DLL を手に入れる事ができます
( ImageMagick-6.8.0-vc9 というフォルダに 画像フォーマット用を含めた DLL が入っています )

最新は、pecl からダウンロードする事ができますが、画像フォーマットの dll が pecl 側には無いので、上記の消失サイトのインターネットアーカイブからダウンロードできるものをコピーして利用可能です。( pecl 側の全てのファイルを、ImageMagick-6.8.0-vc9 の中にコピーして上書きしたものを使用します )



※ phpinfo() で、NTS か TS かを確認します。( 上の例は NTS )

対象となる PHP 用の dll を配置して、php.ini で参照します(例:最初の画像)

それ以外にも、Windows 用の DLL がたくさん用意されているので、そのフォルダを適当に配置して、PATH 環境変数に追加して使用します。( php.ini の記述例 : extension=C:\php\imagick\php_imagick.dll )

正しく設定できれば、以下のようになります。(PHP Version 5.4.13)

※ pecl 側のみだと、ImageMagick supported formats が no values で空になります。


マニュアル

画像処理 [ImageMagick] : php オンラインマニュアル
<?php

// 画像
$image = new Imagick("1382552847536630.jpeg");

// トリミング
$image->cropImage(300, 300, 600, 200);

// 出力
$image->writeImage('crop.jpg');

?>
OK

関連する記事

PHP : 曲線が必要ならば ImageMagick ( 但し使えるかどうかはサーバー次第 )


posted by at 2016-11-20 20:47 | PHP | このブログの読者になる | 更新情報をチェックする

2015年10月10日

PHPで、ベタベタな日付チェック。汎用的とも言うw

フォーマットチェックを兼ねて、explode で分割し、3つの配列になった場合のみ、checkdate しますが、引数にはそれぞれ +0 を書いておくといいですね。
// 【生年月日】
$ymd = explode("/", $_POST['birthday']);
if ( count($ymd) != 3 ) {
	$ErrorMessage .= "日付のフォーマットが正しくありません<br>";
}
else {
	if( !checkdate( $ymd[1]+0,$ymd[2]+0,$ymd[0]+0 ) ) {
		$ErrorMessage .= "日付が正しくありません<br>";
	}
}

大昔は、checkdate 部分は自作したものですが、各言語にそれなりのがあると思います。その際、必要な値を文字列から分割する必要があるので、どうしてもこういう発想になります。

正規表現使うより説明しやすいってのあります。


大昔は、2000年になる前の頃の事ですが、言語と呼ばれるものも未発達だったので、2000年がうるう年である事をチェックするのに、自分で書いた記憶のある人も世の中には沢山居ます。

通常は、100年で割り切れると、うるう年では無いわけですが、400年で割り切れる 2000年はうるう年なので、気を使ったもんです。
posted by at 2015-10-10 22:54 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2015年09月28日

PHP でカタカナのフリガナ入力のチェック



preg_match で、カタカナのみでなりたっているかどうかをチェックするならば、
if ( !preg_match("/^[ァ-ー]+$/u", $entry) ) {
    print "全てカタカナで入力して下さい";
}
本当は、30FF までがカタカナの範囲ですが、一般的には ァ〜ー で十分です。この範囲の文字が最初から最後まで続いていなかったらエラーです。

ただ、この場合ですと、半角と全角のスペースが許され無いので、一般的にフリガナとしては正しい仕様とするならば、"/^[  ァ-ー]+$/u" として、[] の中に半角と全角のスペースを追加します

また、逆のひらがなのふりがなの場合は、長音を追加する事が必要になります。


posted by at 2015-09-28 18:58 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2014年11月11日

TCPDF で罫線を引く

罫線を引く処理をまとめておけば、それは罫線だけ印刷された印刷物の上にデータを印刷する処理をアプリ側で実装できます(AddPage の後に毎回出力)。そのためには、少なくとも四角形と直線だけ引ける必要があります。

Line メソッド

二つの座標と、罫線の属性を定義した配列で直線を引けます

Line( $x1, $y1, $x2, $y2, array( "width" => 幅, "color" => array( 0, 0, 0 ) ) );
※  array( 0, 0, 0 ) は黒

Rect メソッド

四角形(4つの直線)を作成できます。塗りつぶしもかねているので、以下の書式は塗りつぶしをしない書式です

$line_style = array( "width" => 幅, "color" => array( 0, 0, 0 ) );
Rect( $x, $y, $w, $h, "D", array( "all" => $line_style ) );

4角形なので、4つを別々に定義できますが、all にすると一度に全て定義した事になります

// ***********************************************
// 罫線印字
// ***********************************************
function load_form( $pdf, $cur_position  ) {

	$left = 5;
	$top = 5;
	$width = 200;
	$height = 285;
	$line_height = $GLOBALS['line_height'];

	$line_style = array('width' => 0.1, 'color' => array(0, 0, 0) );
	$body_style = array( 
		'T' => $line_style, 
		'R' => $line_style, 
		'B' => $line_style, 
		'L' => $line_style );
	$pdf->Rect( $left, $top, 200, 285, 'D', $body_style );

	$line_top = $cur_position;
	for( $i = 0; $i < 30; $i++ ) {
		$ly = ($i-1) * $line_height + $line_top;
		$pdf->Line( $left, $ly, $left + $width, $ly );
	}

}


getLastH で現在のフォントでの文字高さを取得
	// ダミーで印字して、現在のフォントでの
	// 行の高さを決定する
	$pdf->SetXY( -100, -100 );
	$pdf->Cell(1, 0, " ", 0, 0, "L");
	$GLOBALS['line_height'] = $pdf->getLastH();



タグ:PHP line Rect
posted by at 2014-11-11 16:45 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2014年11月06日

フリーフォントを使って PHP 画像(GD)として埋め込むアクセスカウンターの DB 処理部分

アクセスカウンターの文字列表示部部下は、PHP 画像(GD)として埋め込むアクセスカウンターの画像出力部分の作成 を参照して下さい。

ここの get_value() 関数の戻り値を $img_text = get_value(); としてセットするだけです。
※ require_once( "example_db.php" ); も必要です

▼ example_db.php
<?php
function get_value() {

	// ***********************************************
	// グローバル変数
	// ***********************************************
	$server = 'サーバー';
	$db_name = 'データベース';
	$user = 'ユーザ';
	$password = 'パスワード';

	// ***********************************************
	// データベース接続
	// ***********************************************
	$connect = @ new mysqli($server, $user, $password, $db_name);
	if ($connect->connect_error) {
		return "----------";
	}

	$query = "update counter ";
	$query .= " set c1 = LAST_INSERT_ID( c1+1 ) ";
	$query .= " where rkey = 1";

	$result = $connect->query($query); 
	if ( !$result ) {
		return "==========";
	}

	$query = "select LAST_INSERT_ID()";

	$result = $connect->query($query); 
	if ( !$result ) {
		return "==========";
	}

	$row = $result->fetch_array(MYSQLI_BOTH);

	$ret = sprintf( "%010d", $row[0]+0 );

	return $ret;

}
?>

要点は、LAST_INSERT_ID( n ) を使用して、カウンター用のレコードの一つの列を更新して、その結果を取得して使用しているところです。

テストに使ったテーブル定義
CREATE TABLE `counter` (
  `rkey` int(11) NOT NULL,
  `c1` int(11),
  `c2` int(11),
  PRIMARY KEY (`rkey`)
)
この方法ですと、一つのテーブルの1レコードだけで複数のカウンターを管理できます。


posted by at 2014-11-06 22:14 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

フリーフォントを使って PHP 画像(GD)として埋め込むアクセスカウンターの画像出力部分の作成

アクセスカウンターのカウントアップは、データベースを使用すると簡単です。その部分は別に作成するほうが内容の重要な部分が明確になります。

数字画像を作成するのは、imagettftext を使用すれば容易です。文字に対していろいろ装飾するには、追加処理が必要ですが、ここでは単純に白い背景に対して黒い文字を『GN-キルゴ』というフォントで出力します。

※「GN-キルゴ」は、漫画『キルミーベイベー』のタイトルロゴをイメージしたフォントです

▼ 実際の PHP による画像表示



<?php
// ***********************************************
//
//  プログラム名 : アクセスカウンターの下準備
//  作   成   者 : lightbox
//  作   成   日 : 2014/10/31
//  ソ   ー   ス : UTF-8N
//
//  概要 : 指定したフォントで数字文字列画像作成
//
// ***********************************************
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// ***********************************************
// 使用するフォント
// ***********************************************
$font_path = "GN-KillGothic.ttf";
// ***********************************************
// 初期テキスト
// ***********************************************
$img_text = "8888888888";
// ***********************************************
// 幅と高さ
// ***********************************************
$width = 220;
$height = 30;

// ***********************************************
// キャンバス作成
// ***********************************************
$im = imagecreatetruecolor( $width, $height );

// ***********************************************
// 画像の背景色( 白 )
// ***********************************************
$white = imagecolorallocate( $im, 255, 255, 255 );
imagefilledrectangle($im, 0, 0, $width, $height, $white);

// ***********************************************
// 画像の文字色( 黒 )
// ***********************************************
$black = imagecolorallocate( $im, 0, 0, 0 );

// ***********************************************
// 使用不可サイトのチェック
// ***********************************************
$site = false;
$target_sites = array("http://toolbox.winofsql.jp/","http://logicalerror.seesaa.net/");
foreach( $target_sites as $target ) {
	$len = strlen( $target );
	$ref = substr( $_SERVER['HTTP_REFERER'], 0, $len );
	if ( $target == $ref ) {
		$site = true;
		break;
	}
}

// ***********************************************
// 【使用許可サイトの場合】
// ここに、DB から取得した文字列をセットする処理
// を入れる予定です
// ***********************************************
if ( $site ) {
	$img_text = "1235467890";
}

// ***********************************************
// フォントより文字列画像作成
// ***********************************************
imagettftext(
	$im,
	20,	// サイズ
	0,	// 角度
	5,	// x 座標
	25,	// y 座標
	$black,
	$font_path,
	$img_text);


// ***********************************************
// ブラウザへ出力
// ***********************************************
header('Content-Type: image/png');
imagepng($im);


// ***********************************************
// 後処理
// ***********************************************
imagecolordeallocate( $im, $black );
imagecolordeallocate( $im, $white );
imagedestroy($im);


?>

imagefilledrectangle は、その名の通り( FILL ) 四角形の塗りつぶし処理です。

関連する記事

フリーフォントを使って PHP 画像(GD)として埋め込むアクセスカウンターの DB 処理部分



posted by at 2014-11-06 21:26 | PHP | このブログの読者になる | 更新情報をチェックする

2014年10月15日

PHP + GD : 四角形への DropShadow



グラデーション方法のサンプル

how to create thumbnail + shadow by this script
/* offset of drop shadow from top left */
define ( "DS_OFFSET" , 5 );
 
/* number of steps from black to background color /*
define("DS_STEPS", 10);
 
/* distance between steps */
define ( "DS_SPREAD" , 1 );
 
/* define the background color */
$background = array( "r" => 255 , "g" =>  255 , "b" =>  255 );

// 元のサイズに対して、影のサイズを含めた新しい幅と高さを決定します
$width = $o_width + DS_OFFSET ;
$height = $o_height + DS_OFFSET ;
$image = imagecreatetruecolor ( $width , $height );
 
/* determine the offset between colors */
$step_offset = array( "r" =>  ( $background [ "r" ] / DS_STEPS ), "g" =>  ( $background [ "g" ] / DS_STEPS ), "b" =>  ( $background [ "b" ] / DS_STEPS ));
 
/* calculate and allocate the needed colors */
$current_color = $background ;
for ( $i = 0 ; $i <= DS_STEPS ; $i ++) {
	$colors [ $i ] = imagecolorallocate ( $image , round ( $current_color [ "r" ]), round ( $current_color [ "g" ]), round ( $current_color [ "b" ]));
 
	$current_color [ "r" ] -= $step_offset [ "r" ];
	$current_color [ "g" ] -= $step_offset [ "g" ];
	$current_color [ "b" ] -= $step_offset [ "b" ];
}
 
// 一番外側の四角
imagefilledrectangle ( $image , 0 , 0 , $width , $height , $colors [ 0 ]);
 
// だんだん小さく、色を濃く 
for ( $i = 0 ; $i < count ( $colors ); $i ++) {
	imagefilledrectangle ( $image , DS_OFFSET , DS_OFFSET , $width , $height , $colors [ $i ]);
	$width -= DS_SPREAD ;
	$height -= DS_SPREAD ;
}
ボックスをすこしづづ小さく薄く描画して、最終的には、imageconvolution でガウス分布のぼかしを実行しています( ガウス分布のぼかしは、マニュアルのサンプルにあります )
<?php
$image = imagecreatetruecolor(180,40);

imagestring($image, 5, 10, 8, 'Gaussian Blur Text', 0x00ff00);
$gaussian = array(
	array(1.0, 2.0, 1.0),
	array(2.0, 4.0, 2.0),
	array(1.0, 2.0, 1.0)
);
imageconvolution($image, $gaussian, 16, 0);




タグ:gd
posted by at 2014-10-15 23:20 | PHP | このブログの読者になる | 更新情報をチェックする

2014年10月11日

PHP : ログインとブラウザの当日日付データ

仕様の問題ですが、出退勤の日付用としてクライアントのデバイスが持つ日付を使う為に、データベース用の書き込みデータや SELECT 文で読み出す条件としての日付を文字列で取得したいわけです。

その為に作った JavaScript のメソッド

JavaScript の String と Date オブシェクトに、9999/99/99 書式の文字列日付を取り出すメソッドを追加する

要するに『(new Date()).sdate("-")』で取得します。

でまあ、最初に仕込む場所としてログインが最も妥当かなぁと思いますし、そもそもログインでセッションとしてログインした事を保存するので、セッションに日付をセットしておく事にします。画面遷移のたびに取得してもいいですが、日付をまたぐ運用を行うようなアプリケーションでのみ、操作手順(オプション)の一つとして『再取得』を用意すればいいと思うわけです。

関連する記事

hash_hmac は秘密鍵があるので、辞書の総当りとかでパスワードは解りませんから。パスワード抜かれるのは、フィッシングがスパイウェアか、本人が口に出した場合ですね。



タグ:PHP
posted by at 2014-10-11 18:08 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2014年10月10日

hash_hmac は秘密鍵があるので、辞書の総当りとかでパスワードは解りませんから。パスワード抜かれるのは、フィッシングがスパイウェアか、本人が口に出した場合ですね。

ただの hash なら、md5 で password は 5f4dcc3b5aa765d61d8327deb882cf99 ですね(Google で 15,300 件ヒット)。サーバーのデータベースにもし生のパスワードが入ってたら大笑いですが、どんなにアホでもサーバーの責任を回避する手段として、サーバー側が解読できるパスワードなんて保存しないというか、誰が考えてもしたく無いです。
<?php

print hash_hmac("md5","password","lightbox") . "\n";

//0b8d1a7cf74154638a19eb9958b8e475

print hash_hmac("md5","password","2014") . "\n";

//27ad87de8ac47d30710f9144ba48d7fa

?>

よく、パスワードを忘れたら新しいパスワードを入力します。たまーーにパスワード送って来るシステムがありますが、暗号化してデータベースに保存しているのでしょう。余程運用に自信があるか、そこまでしてもメリットのあるサービスが運営されているはずです。
<?php
session_start();
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
// 日本語

if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

	if ( hash_hmac( 'sha256',$_POST['pass'], "himitsu" ) == 'a15c6fe4973d69106646f5304c44a03ef41490d964e9bcca4f0848431b9cfe0b' ) {
		$_SESSION['login'] = 'yes';
		header('Location: http://localhost/web/1008/005/control.php');
		exit();
	}

}

//print "<pre>";
//print_r($_SERVER);
//print "</pre>";

?>
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body>
<form method="post">
<input type="password" name="pass">
<input type="submit" name="send">
</form>
</body>
</html>



ですから、パスワードが盗まれるのはこういう経路ではなく、フィッシング詐欺です。

フィッシング詐欺の出発点は、メールから内容で不安感を煽って直接パスワードを入力させるもので、向こう側でそのパスワードがダイレクトに手に入ります。普通は気が付きますが、中には気がつかない人も居るわけで、悪い奴はハナからそういう人を狙ってます。

しかし、もっとあくどいのが、スパイウェアでして、こいつにやられたらキー入力とか全部バレたりするので正しい処理をしていてもパスワードが盗まれます。

実際は、銀行側の機能で対処します

オンラインバンキングでは、一時パスワードを処理毎に発行できるようになるのが普通で、楽天銀行だとお金を移動するのに、3つのパスワードと2つの一時パスワードが必要です。そこまでしてて盗まれたらお手あげですが、そもそもオンライン銀行にバカみたいに高額のお金を置かなければいいので、取引銀行の機能としてオンラインバンキングするのでは無く、オンラインバンキング専用の銀行を別に用意すればいいですね。

セキュリティキーボード

毎回変換配置の変わるキーボードですね。マウスでクリックするのが普通ですが、毎回変わるのでキーボードでもかまわないという特徴もあります(a と入れたい場合に x だったり 8 だったり)。これを使うと悪者はお手上げのはずです。

ワンタイムパスワードの送り先

ハードを借りるという単純なものもありますが、インターネットだとメールアドレスに送ったりするものもあります。その場合、携帯やスマホへ送るようにすれば、やはり悪者はお手上げです。



posted by at 2014-10-10 23:54 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

すごく当たり前の事なんですが、UTF-8N で保存されたテキストファイルをメモ帳で変更して保存したら先頭に EF BB BF という爆弾が仕掛けられるのでダメですよ

PHP で以下のような SQL を保存するわけです。もちろん UTF-8N で。
select 
	社員マスタ.*,
	DATE_FORMAT(生年月日,'%Y/%m/%d') as 誕生日
 from 社員マスタ
 where
	社員コード = '{$_GET['syainCode']}'

それを、メモ帳で読むと普通に読めるので、知らない初心者はそのまま SQL を変更して保存する。しかし、実行時に SQL の先頭には余計なデータが付加されているので、SQL はエラーとなる。たいていは初心者なので原因が解らず、かなり脱出困難なループに入ってしまいます。

上級者でも、まさかメモ帳で書き換えたとは気がつかずに原因を特定するのにそれなりに時間がかかる場合があります。勘のいい、もしくは運のいい先輩プログラマなら、すぐ対応できるでしょうが・・・

文字通りの BOM(B)

実際は、バイトオーダーマーク (byte order mark) というものですが、こういうシチュエーションでは爆弾の一種ですね。




確認用簡易ダンプ

「送る」に入れる簡易ダンプ




posted by at 2014-10-10 20:34 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX