Categories
PHP+MySQL

PHP でのスマホ判定

タブレットの普及や新しい OS の誕生など時代の流れにあわせないと・・・。

function isSmart(){
	$useragents = array(
					'iPhone',			// iPhone
					'iPod',				// iPod touch
					'Android.*Mobile',	// 1.5+ Android *** Only mobile
					'Windows.*Phone',	// Windows Phone
					'firefox.*Mobile',	// Firefox *** Only mobile
					'blackberry',		// Blackberry
					'incognito',		// Other iPhone browser
					'webmate'			// Other iPhone browser
	);
	$pattern = '/'.implode( '|', $useragents ).'/i';
	$bool = preg_match( $pattern, $_SERVER['HTTP_USER_AGENT'] ) ? TRUE : FALSE;
	return( $bool );
}

[mokurenCB]

Categories
PHP+MySQL

SplFileObject で Shift_JIS の CSVファイルを読み込む

PHP で CSVファイルといえば、fopen() で指定して fgetcsv() でデータを取得する方法がすぐに頭に浮かび、検索してもその方法が多くヒットされます。で、途中に改行が含まれる CSVファイルを取り扱う場合は・・・。お断りしたいくらいです。

そんな思いに反して「途中に改行が含まれる CSVファイル(Shift_JIS)をPHP(UTF-8)でデータベース(utf8)に保存」というステキなご要望があり、奮闘した記録をここに載せようかと。

SplFileObject

冒頭にも記載した通り、PHP で CSVファイルといえば、fgetcsv() ばかりなのですが、そんな中、見つけたのが「SplFileObject クラス」。そうです。オブジェクト指向です! 5.1 から! 知りませんでした。(^^;
早速、様々なサンプルを拝見し、次のように組んでみました。

$file = new SplFileObject( 'exp.csv' );
$file -> setFlags( SplFileObject::READ_CSV );
$file -> setCsvControl( ',', '"' );
foreach( $file as $key => $line ){
	foreach( $line as $str ){
		$records[$key][] = strlen( $str ) > 0 ? mb_convert_encoding( $str, 'UTF-8', 'Shift_JIS' ) : '';
	}
}
var_dump( $records );

上のスクリプトで、ほとんどは意図した通りに動きました。「ほとんど」・・・です。
希に隣り合う項目が結合されることが見受けられます。
具体的には、「”試験”,”動作”,”042-812-7728″,”神奈川県”」が正しいところ「”試験”,”動作”,042-812-7728″”,”神奈川県”」となり「”動作”,042-812-7728″”」が1つのデータと認識されてしまうことがあります。

原因は、Shift_JIS

ローカルでCSVファイルを UTF-8 で保存し、上のスクリプトで mb_convert_encoding を外して動作チェックを行ったところ、全て意図した通りに動きましたので、原因は文字コードの変換部分。しかも、上記の現象ですから、疑うのは1~2行目の部分。PHP が UTF-8 で CSVファイルが Shift_JIS なのだから、無理があるのは当然かと。

$file = new SplFileObject( 'exp.csv' );
$file -> setFlags( SplFileObject::READ_CSV );

対応策

はじめに一時保存用のファイルを作成し、サーバーにアップ。適切なパーミッションに設定。
csvファイルを file_get_contents で読み込み、文字コードを変換。その後、一時保存用のファイルに保存。
一時保存用のファイルで上のスクリプトを実行させる。
一時保存用のファイルの中身を空にする。

Excel や Access からの CSVファイルは、UTF-8 にして欲しいと思うこの頃です。

[mokurenCB]

Categories
PHP+MySQL WordPress プラグイン ホームページ制作・作成

お問い合わせフォームを WordPress のプラグインとして制作

当オフィスの既存のお問い合わせフォームの仕様と同じく WordPress のプラグインとしてお問い合わせフォームを制作しました。

お問い合わせフォーム for WordPress

入力項目毎に正規表現による入力内容のチェックを実施するなどで汎用性がないことから、WordPress の公式ディレクトリへの登録は実施しない予定です。

当お問い合わせフォームは、同じ URL で「入力」→「確認」→「送信」の流れになっています。また、フォームに入力されたデータは、指定のメールアドレス宛にメールを送信するだけです。データベースへの保存は行っておりません。

WordPress でお問い合わせや資料請求などのフォームでこだわったものをお探しの際は、当オフィスまでお気軽にご相談ください

[mokurenCB]

Categories
PHP+MySQL

DateTime で 0000-00-00

PHP で日時を取り扱う場合、DateTime を使用するわけですが、日付の入力必須や登録して当然のシステムを多く携わっていたためか、入力が任意のケースにあたってしまい戸惑ったので忘れないようここに載せます。

調べるとすぐに見つけることができるのですが、MySQL にありがちな ‘0000-00-00’ および ‘0000-00-00 00:00:00’ の場合、DateTime を使うと format( ‘Y-m-d’ ) で ‘-0001-11-30’ が出力されます。エラーや空白などではないのですよね。

‘-0001-11-30′ が画面に表示されては困りますので、’0000-00-00’ および ‘0000-00-00 00:00:00’ は、if文で分岐させた処理が必要になります。

[mokurenCB]

Categories
PHP+MySQL ホームページ制作・作成

お問合わせなどのフォーム

先日、あるホームページのお問い合わせフォームが以下のように組まれていることに気が付きまして。。。
メールの文章や項目は最低限にしまして、そのコードの概要が以下の通りです。
ちなみに「入力フォーム」「入力内容の確認」「送信」は、それぞれ個々のファイルとなっており、下記の「送信」に該当するファイルでは、リファラーチェックやトークンはなし。URLを直接入力した場合、当該ファイルに直接アクセスすることが可能。当ホームページの公開は2年前。PHP のバージョンは 5.3。

if( $_REQUEST['send'] ){
	$name		= $_POST["name"];
	$email		= $_POST["email"];
	$subject	= $_POST["subject"];
	$message	= $_POST["message"];

	$date = date( 'Y-m-d H:i:s' );

	$msg = <<<EOD
	{$data}
	[お名前]{$name}
	[E-Mail]{$email}
	[件名]{$subject}
	[内容]
	{$message}
	EOD;

	mb_language( 'ja' );
	mb_internal_encoding( 'UTF-8' );
	$ret = @mb_send_mail( $email, 'お問い合わせ', $msg, 'From: ***@***.***' );
	$ret = @mb_send_mail( '***@***.***', 'お問い合わせ', $msg, 'From: '.$email );
}

恐らく、入門書やそれに類するホームページから拾ってきたのではないかと思われるのですが、メールヘッダインジェクション対策をはじめとしたセキュリティを全く考慮していません。ついでに 2038年問題も。更新(F5)連打、各項目が空のケース、その他ツッコミどころ満載のコードです。

これで制作会社を名乗りお金を貰ったのかと考えると真面目に制作している者としてはホントに憤慨です。
当事務所では、上記のような「入門者を教えるためのコードで構築したシステム」を納品することは決してございません。
この記事をお読みで、ご自分のホームページのお問合わせやご予約などのフォームがご心配の場合は当事務所までお気軽にご相談ください。

[mokurenCB]