2013年1月16日水曜日

1.9.0 で jQuery.browser がエラーになる


管理画面で使用している cleditor が突然動かなくなったとお客様より連絡があり調べたところ、非推奨メソッドの jQuery.browser が使用されていました。

恐らく、jQuery が 1.9.0 にバージョンアップされた際に削除されたものと思われます。

とりあえずの対応としては下記の2通りあるかと思います。

1. jquery-1.8.3.min.js を使う

2. 下記のパッチを当てる
//@@mod  ie = $.browser.msie,
  ie = (typeof($.browser.msie) != 'undefined') ? $.browser.msie : false;

//@@mod  documentClickAssigned,
  documentClickAssigned = false,

2012年12月7日金曜日

IE8 で文字化け

常識かもしれませんが、ちと引っかかったのでメモ。

ヘッダーのメタタグに下記を入れたページを作成しました。

<meta http-equiv="Content-Type" content="text/html; charset=UTF8">

これが IE8 だと見事に文字化けしました><;

Content-Type で文字セットしてしているのになんでだ!?スペルミス?

さっそくグーグル先生に問い合わせてみるとどうやら UTF-8 が正解だったようです。大文字小文字の区別はないようです。

うむむ、ちと恥ずかしいミスでした…

2012年11月14日水曜日

PHP フォームでアップロードできるファイル数の上限

ちょいとハマったので覚書です。

PHP は CentOS 5.7 の標準である 5.1.6 を使用しています。

フォームに <input type="file" /> を30個ほど並べたところ、$_FILES に20個分しか入っていません???

アップロードできるファイル数に制限があったかなぁと調べてみたのですが見当たりません???

ファイルアップロード設定オプション
名前デフォルト変更可能変更履歴
file_uploads"1"PHP_INI_SYSTEMPHP <= 4.2.3 では PHP_INI_ALL、PHP 4.0.3 以降で利用可能
upload_tmp_dirNULLPHP_INI_SYSTEM
max_input_nesting_level64PHP_INI_PERDIRPHP 5.3.9 以降で利用可能。
max_input_vars1000PHP_INI_PERDIRPHP 5.3.9 以降で利用可能。
upload_max_filesize"2M"PHP_INI_PERDIRPHP <= 4.2.3 では PHP_INI_ALL
max_file_uploads20PHP_INI_SYSTEMPHP 5.2.12 以降で利用可能。

上記を見ると 5.2.12 以降では php.ini の設定で変えられるようです。

PHP_INI_SYSTEM となっていますので、httpd.conf のバーチャルホスト設定に下記の1行を追加
php_value max_file_uploads  40

アパッチを再起動してみましたが状況が変わりません。

やっぱ、5.1.6 では実装されていないのかな?と思いましたが諦めきれずに php.ini に直接書いてやりました。

アパッチを再起動すると全部取得できるではないですか!?

max_file_uploads は 5.1.6 でも効果はあるが、php.ini に直接書かなければならないということのようです。

2012年5月11日金曜日

SJIS で HTMLPurifier を使う悩み

ひさしぶりの書き込みです^^;

今回管理画面から設定するメッセージにHTMLを使用できるようにしました。
携帯サイトがあるので文字コードは SJIS です。

管理画面からの入力なので、比較的セキュリティは緩くてもいいかなと思ったのですが、何買ったら心配なので HTML Purifier にて、ヤバいタグや属性を除去するように。

$config = HTMLPurifier_Config::createDefault();
$config->set( 'Core.Encoding', 'SJIS' );
$config->set( 'Core.Language', 'ja' );
$config->set( 'HTML.AllowedElements', $g_aryHTMLPurifierAllowTag );
$objPurifier = new HTMLPurifier( $config );
$str = $objPurifier->purify( $str );

ここで困ったのが © や ® などの HTML 特殊文字です。

フォームからはちゃんと © や ® という形で送られてくるのですが HTML Purifier を通すと消えてなくなっている・・・

で調べてみると、HTML  Purifier は、© や ® を © や ® に変換してしまうことが判明、また、set( 'Core.Encoding', 'SJIS' ); していると SJIS に変換できない文字は消してしまうようです。

とりあえず、© ® を別のキーワード(全角が安全?)に変換してから purify() してその後に戻してやるというヤクザな方法で逃げました^^;

2011年11月4日金曜日

JSON を使って配列の初期化

JSON の使い方のページを見るとオブジェクトの初期化方法を書かれているものが多く、単なるの配列の初期化方法はあまり書かれていません。 備忘録として記しておきます。

 1. 単純な配列を初期化
var a = ["abc", "def"];

2. 連想配列(オブジェクト)を初期化
var a = {"a":"abc", "b":"def"};

2011年10月6日木曜日

PHP HTMLタグの属性をパースする

HTMLタグの属性をパースする関数を作って見ました。
//====================================================================
//! タグの属性をパースする
//! 属性名はアルファベット, 記号(-_), 数字を認めます。
//! 値は "' での括りを認めます。
//! @param string $str タグの属性文字列
//! 例 type=submit type="submit" type='submit' checked
//! @return array キーが属性名の配列
//====================================================================
function aryParseTagAttribute( $str )
{
 //=== 正規表現 ===================================================
// $ma の要素番号
//  1                2 34                  5 67                    8 9
 $re = <<<_EOL_
/\s*([A-Za-z0-9_\-]+)(=(([^"'][^\s]*[^"'])|('(([^'\\\\]|\\\\.)*)')|("(([^"\\\\]|\\\\.)*)")))?/
_EOL_;
 $iMatches = preg_match_all( $re, $str, $ma );

 $aryAttr = array( );
 for ( $i = 0; $i < $iMatches; ++ $i )
 {
  //=== 属性名 =================================================
  $strName = $ma[1][$i];

  //=== 値を取得 ===========================================
  // type="submit"
  // $ma[] は (かっこの順にサブ文字列を格納している
  if ( !empty( $ma[4][$i] ) )
   $strValue = $ma[4][$i]; // 括り無し
  else if ( !empty( $ma[6][$i] ) )
   $strValue = $ma[6][$i]; // '' 括り
  elseif ( !empty( $ma[9][$i] ) )
   $strValue = $ma[9][$i]; // "" 括り
  else
   $strValue = '';   // 値なし

  //============================================================
  $aryAttr[$strName] = $strValue;
 }

 //================================================================
 return $aryAttr;
}

◆テスト
$s = <<<_EOL_
type="text" name='DATE' onclick="func( '\"test\"' ); return" width=100
_EOL_;

$a = aryParseTagAttribute( $s );
print_r( $a );

◆実行結果
Array
(
    [type] => text
    [name] => DATE
    [onclick] => func( '\"test\"' ); return
    [width] => 100
)

2011年7月14日木曜日

PHP 住所から緯度/経度を取得

Google Geocoding API を使って住所から緯度経度を求めます。(めちゃめちゃ簡単です)

Windows 環境ですので文字コードは SJIS です。API呼び出し時に UTF-8 に変換しています。

APIのレザルトは JSON で受け取って配列にデコードしています。

このレザルトには住所などの情報も含まれていますが JSON ですので Windows で使用する場合は SJIS への変換が必要となります。

<?php
//================================================
// 住所 → 緯度/経度変換
//================================================
function strAddrToLatLng( $strAddr )
{
    $strRes = file_get_contents(
         'http://maps.google.com/maps/api/geocode/json'
        . '?address=' . urlencode( mb_convert_encoding( $strAddr, 'UTF-8' ) )
        . '&sensor=false'
    );
    $aryGeo = json_decode( $strRes, TRUE );
    if ( !isset( $aryGeo['results'][0] ) )
        return '';


    $strLat = (string)$aryGeo['results'][0]['geometry']['location']['lat'];
    $strLng = (string)$aryGeo['results'][0]['geometry']['location']['lng'];
    return $strLat . ',' . $strLng;
}


//================================================
echo strAddrToLatLng( '東京都青梅市' );
?>

実行結果

35.7879958,139.2758298

詳しい情報は Google Geocoding API サービス をご覧ください。