Source for file SC_Utils.php
Documentation is available at SC_Utils.php
* This file is part of EC-CUBE
* Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
* http://www.lockon.co.jp/
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 主に static 参照するユーティリティ系の関数群
* :XXX: 内部でインスタンスを生成している関数は, Helper クラスへ移動するべき...
* @author LOCKON CO.,LTD.
* @version $Id:SC_Utils.php 15532 2007-08-31 14:39:46Z nanasess $
$phpself = $_SERVER['PHP_SELF'];
if( strpos('/install/', $phpself) === false ) {
$install_url = SC_Utils_Ex::searchInstallerPath($path);
header('Location: ' . $install_url);
$path = HTML_REALDIR . 'install/' . DIR_INDEX_FILE;
SC_Utils_Ex::sfErrorHeader('>> /install/' . DIR_INDEX_FILE . ' は、インストール完了後にファイルを削除してください。');
* インストーラのパスを検索し, URL を返す.
* $path と同階層に install/index.php があるか検索する.
* インストーラのパスが見つかった場合は, その URL を返す.
* DocumentRoot まで検索しても見つからない場合は /install/index.php を返す.
* @param string $path 検索対象のパス
* @return string インストーラの URL
$installer = 'install/' . DIR_INDEX_PATH;
if (SC_Utils_Ex::sfIsHTTPS()) {
$host = $proto . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'];
return $host . $path . $installer;
if (substr($path, - 1, 1) != '/') {
$installer_url = $host . $path . $installer;
$resources = fopen(SC_Utils_Ex::getRealURL($installer_url), 'r');
if ($resources === false) {
$installer_url = SC_Utils_Ex::searchInstallerPath($path . '../');
* 相対パスで記述された URL から絶対パスの URL を取得する.
* この関数は, http(s):// から始まる URL を解析し, 相対パスで記述されていた
* http://www.example.jp/aaa/../index.php
* http://www.example.jp/index.php
* @param string $url http(s):// から始まる URL
* @return string $url を絶対パスに変換した URL
$tmp = explode('/', $parse['path']);
if ($v == '' || $v == '.') {
$path = join('/', $results);
return $parse['scheme'] . '://' . $parse['host'] . ':' . $parse['port'] . '/' . $path;
$GLOBAL_ERR.= '<div id="errorHeader">';
require_once CLASS_EX_REALDIR . 'page_extends/error/LC_Page_Error_DispError_Ex.php';
$objPage = new LC_Page_Error_DispError_Ex();
function sfDispSiteError($type, $objSiteSess = "", $return_top = false, $err_msg = "") {
require_once CLASS_EX_REALDIR . 'page_extends/error/LC_Page_Error_Ex.php';
$objPage = new LC_Page_Error_Ex();
$objPage->objSiteSess = $objSiteSess;
$objPage->return_top = $return_top;
$objPage->err_msg = $err_msg;
$objPage->is_mobile = SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE;
* @param string $debugMsg デバッグ用のメッセージ
require_once CLASS_EX_REALDIR . 'page_extends/error/LC_Page_Error_SystemError_Ex.php';
$objPage = new LC_Page_Error_SystemError_Ex();
$objPage->addDebugMsg($debugMsg);
GC_Utils_Ex::gfPrintLog($objPage->sfGetErrMsg());
$ret = $objSess->IsSuccess();
SC_Utils_Ex::sfDispError($ret);
// リファラーチェック(CSRFの暫定的な対策)
// 「リファラ有」 かつ 「管理画面からの遷移でない」 場合にエラー画面を表示する
if ( empty($_SERVER['HTTP_REFERER']) ) {
// sfErrorHeader('>> referrerが無効になっています。');
$domain = SC_Utils_Ex::sfIsHTTPS() ? HTTPS_URL : HTTP_URL;
$pattern = sprintf('|^%s.*|', $domain);
$referer = $_SERVER['HTTP_REFERER'];
// 管理画面から以外の遷移の場合はエラー画面を表示
if ($disp_error) SC_Utils_Ex::sfDispError(INVALID_MOVE_ERRORR);
* @param string $passlen 変換する文字列
* @return string アスタリスクへ変換した文字列
for ($i= 0;$i< $passlen;true){
// HTTPS時には$_SERVER['HTTPS']には空でない値が入る
// $_SERVER['HTTPS'] != 'off' はIIS用
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
* 前画面でuniqidを埋め込んでおく必要がある
* @param obj SC_Session, SC_SiteSession
// 前画面からPOSTされるuniqidが正しいものかどうかをチェック
$uniqid = $objSess->getUniqId();
if ( !empty($_POST['uniqid']) && ($_POST['uniqid'] === $uniqid) ) {
if($year != "" && $month != "" && $day != "") {
$date = $year. "-". $month. "-". $day. " ". $time;
* ・XXX: INT_LENには収まるが、INT型の範囲を超えるケースに対応できないのでは?
* @param string $value 検査対象
* @return boolean 0で埋められている
if (strlen($value) > 1 && $value{0} === '0')
$dir_name = SC_Utils_Ex::sfUpDirName();
$file_name = $dir_name . date('ymdHis') . ".csv";
$file_name = $prefix . date('ymdHis') . ".csv";
if (mb_internal_encoding() == CHAR_CODE){
$data = mb_convert_encoding($data,'SJIS-Win',CHAR_CODE);
return array($file_name, $data);
$path = $_SERVER['PHP_SELF'];
return $arrVal[($cnt - 2)];
for($cnt = 1; $cnt <= $max; $cnt++ ) {
if ($_POST[$keyname . $cnt] == "1") {
// html_checkboxesの値をマージして2進数形式に変更する。
foreach($array as $val) {
for($i = 1; $i <= $max; $i++ ) {
if(isset ($arrTmp[$i]) && $arrTmp[$i] == "1") {
// html_checkboxesの値をマージして「-」でつなげる。
foreach($array as $val) {
// html_checkboxesの値をマージしてSQL検索用に変更する。
for ($i = 1; $i <= $max; $i++ ) {
$ret .= in_array($i, $array) ? '1' : '_';
// 2進数形式の値をhtml_checkboxes対応の値に切り替える
for($i = 0; $i < $len; $i++ ) {
if(substr($val, $i, 1) == "1") {
for($cnt = 1; $cnt <= $max; $cnt++ ) {
if ($_POST[$keyname . $cnt] == "1") {
for ($cnt = 0; $cnt < $len; $cnt++ ) {
$arr[$keyname . $no] = substr($val, $cnt, 1);
$arr[] = substr($val, $cnt, 1);
function sfArrKeyValue($arrList, $keyname, $valname, $len_max = "", $keysize = "") {
if($len_max != "" && $max > $len_max) {
for($cnt = 0; $cnt < $max; $cnt++ ) {
$key = SC_Utils_Ex::sfCutString($arrList[$cnt][$keyname], $keysize);
$key = $arrList[$cnt][$keyname];
$val = $arrList[$cnt][$valname];
if(!isset ($arrRet[$key])) {
// キーと値をセットした配列を取得(値が複数の場合)
function sfArrKeyValues($arrList, $keyname, $valname, $len_max = "", $keysize = "", $connect = "") {
if($len_max != "" && $max > $len_max) {
for($cnt = 0; $cnt < $max; $cnt++ ) {
$key = SC_Utils_Ex::sfCutString($arrList[$cnt][$keyname], $keysize);
$key = $arrList[$cnt][$keyname];
$val = $arrList[$cnt][$valname];
$arrRet[$key].= "$val". $connect;
foreach($array as $val) {
/* 配列の要素をCSVフォーマットで出力する。*/
foreach($array as $key => $val) {
$val = mb_convert_encoding($val, CHAR_CODE, CHAR_CODE);
$line .= "\"". $val. "\",";
/*-----------------------------------------------------------------*/
/* 年月日に別れた2つの期間の妥当性をチェックし、整合性と期間を返す
/* 引数 (開始年,開始月,開始日,終了年,終了月,終了日)
/* 1.開始年月日 (YYYY/MM/DD 000000)
/* 2.終了年月日 (YYYY/MM/DD 235959)
/* 3.エラー ( 0 = OK, 1 = NG )
/*-----------------------------------------------------------------*/
function sfCheckSetTerm ( $start_year, $start_month, $start_day, $end_year, $end_month, $end_day ) {
if ( $start_month || $start_day || $start_year){
if ( ! checkdate($start_month, $start_day , $start_year) ) $error = 1;
if ( $end_month || $end_day || $end_year){
if ( ! checkdate($end_month ,$end_day ,$end_year) ) $error = 2;
$date1 = $start_year . "/". sprintf("%02d",$start_month) . "/". sprintf("%02d",$start_day) . " 000000";
$date2 = $end_year . "/". sprintf("%02d",$end_month) . "/". sprintf("%02d",$end_day) . " 235959";
if ($date1 > $date2) $error = 3;
return array($date1, $date2, $error);
// エラー箇所の背景色を変更するためのfunction SC_Viewで読み込む
return 'style="background-color:'. ERR_COLOR. '"';
foreach($array as $key => $val) {
return "background-color:" . ERR_COLOR;
return " disabled=\"disabled\"";
if ((string) $param === (string) $value) {
return "checked=\"checked\"";
$ret = mb_ereg_replace("^[ \n\r]*", "", $str);
$ret = mb_ereg_replace("[ \n\r]*$", "", $ret);
* ・店舗基本情報に基づいた計算は SC_Helper_DB::sfTax() を使用する
* @param integer $price 計算対象の金額
* @param integer $tax 税率(%単位)
* @param integer $tax_rule 端数処理
function sfTax($price, $tax, $tax_rule) {
$ret = $price * $real_tax;
* ・店舗基本情報に基づいた計算は SC_Helper_DB::sfTax() を使用する
* @param integer $price 計算対象の金額
* @param integer $tax 税率(%単位)
* @param integer $tax_rule 端数処理
* @return integer 税金付与した金額
return $price + SC_Utils_Ex::sfTax($price, $tax, $tax_rule);
function sfRound($value, $pow = 0){
$adjust = pow(10 ,$pow- 1);
if(SC_Utils_Ex::sfIsInt($adjust) and $pow > 1){
$ret = (round($value * $adjust)/ $adjust);
function sfPrePoint($price, $point_rate, $rule = POINT_RULE, $product_id = "") {
$real_point = $point_rate / 100;
$ret = $price * $real_point;
$sql = "select count(dtb_class.class_id) as count, dtb_class.class_id ";
$sql.= "from dtb_class inner join dtb_classcategory on dtb_class.class_id = dtb_classcategory.class_id ";
$sql.= "where dtb_class.del_flg = 0 AND dtb_classcategory.del_flg = 0 ";
$sql.= "group by dtb_class.class_id, dtb_class.name";
$objQuery = new SC_Query_Ex();
$arrList = $objQuery->getAll($sql);
$arrRet = SC_Utils_Ex::sfArrKeyValue($arrList, 'class_id', 'count');
$where = "product_id = ?";
$objQuery = new SC_Query_Ex();
$ret = $objQuery->get("product_class_id", "dtb_products_class", $where, Array($product_id));
/* DBから取り出した日付の文字列を調整する。*/
list ($y, $m, $d, $H, $M) = preg_split("/[- :]/", $dbdate);
$str = sprintf("%04d/%02d/%02d %02d:%02d", $y, $m, $d, $H, $M);
$str = sprintf("%04d/%02d/%02d", $y, $m, $d, $H, $M);
foreach($array as $key1 => $arr1) {
foreach($arr1 as $key2 => $val) {
$arrRet[$key2][$key1] = $val;
$arrRet[$index++ ][$key1] = $val;
* $requires が指定された場合, $requires に含まれるキーの値のみを返す.
* @return array 連想配列の値のみの配列
foreach ($hash as $key => $val) {
* ・店舗基本情報に基づいた計算は SC_Helper_DB::sfGetAddPoint() を使用する
* @param integer $totalpoint
* @param integer $use_point
* @param integer $point_rate
// 購入商品の合計ポイントから利用したポイントのポイント換算価値を引く方式
$add_point = $totalpoint - intval($use_point * ($point_rate / 100));
// 予測されないようにランダム文字列を付与する。
$random = GC_Utils_Ex::gfMakePassword(8);
if(strlen($line[$cnt]) > $size) {
// 二回以上繰り返されているスラッシュ[/]を一つに変換する。
if(ereg("^http://", $istr)) {
} else if(ereg("^https://", $istr)) {
* テキストファイルの文字エンコーディングを変換する.
* $filepath に存在するテキストファイルの文字エンコーディングを変換する.
* 変換前の文字エンコーディングは, mb_detect_order で設定した順序で自動検出する.
* 変換後は, 変換前のファイル名に「enc_」というプレフィクスを付与し,
* $out_dir で指定したディレクトリへ出力する
* TODO $filepath のファイルがバイナリだった場合の扱い
* TODO fwrite などでのエラーハンドリング
* @param string $filepath 変換するテキストファイルのパス
* @param string $enc_type 変換後のファイルエンコーディングの種類を表す文字列
* @param string $out_dir 変換後のファイルを出力するディレクトリを表す文字列
* @return string 変換後のテキストファイルのパス
$ifp = fopen($filepath, 'r');
$outpath = $out_dir . "enc_" . $basename;
$ofp = fopen($outpath, "w+");
$line = mb_convert_encoding($line, $enc_type, 'auto');
// ファイルが開けなかった場合はエラーページを表示
SC_Utils_Ex::sfDispError('');
function sfCutString($str, $len, $byte = true, $commadisp = true) {
if(strlen($str) > ($len + 2)) {
if(mb_strlen($str) > ($len + 1)) {
$ret = mb_substr($str, 0, $len);
$cut = mb_substr($str, $len);
// 分割位置より前の最後の [ 以降を取得する。
// 分割位置より後の最初の ] 以前を取得する。
$tail_pos = strpos($cut, ']');
if ($tail_pos !== false) {
$tail = substr($cut, 0, $tail_pos + 1);
// 分割位置より前に [、後に ] が見つかった場合は、[ から ] までを
// 接続して絵文字タグ1個分になるかどうかをチェックする。
if ($head !== false && $tail_pos !== false) {
$subject = $head . $tail;
if (preg_match('/^\[emoji:e?\d+\]$/', $subject)) {
// 年、月、締め日から、先月の締め日+1、今月の締め日を求める。
$end_last_day = date('d', mktime(0, 0, 0, $month + 1, 0, $year));
if($end_last_day < $close_day) {
$end_day = $end_last_day;
$tmp_year = date('Y', mktime(0, 0, 0, $month, 0, $year));
$tmp_month = date('m', mktime(0, 0, 0, $month, 0, $year));
$start_last_day = date('d', mktime(0, 0, 0, $month, 0, $year));
if ($start_last_day < $close_day) {
$tmp_day = $start_last_day;
$start_year = date('Y', mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year));
$start_month = date('m', mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year));
$start_day = date('d', mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year));
$start_date = sprintf("%d/%d/%d 00:00:00", $start_year, $start_month, $start_day);
$end_date = sprintf("%d/%d/%d 23:59:59", $end_year, $end_month, $end_day);
return array($start_date, $end_date);
// 再帰的に多段配列を検索して一次元配列(Hidden引渡し用配列)に変換する。
foreach($arrSrc as $key => $val) {
$keyname = $parent_key . "[". $key . "]";
$arrDst = SC_Utils_Ex::sfMakeHiddenArray($val, $arrDst, $keyname);
$arrDst[$keyname] = $val;
// PHPのmb_convert_encoding関数をSmartyでも使えるようにする
return mb_convert_encoding($str, $encode);
if(count($arrKeys) <= 0 and count($arrValues) <= 0) return array();
for($i= 0; $i< $max; $i++ ) {
$combine_ary[$keys[$i]] = $vals[$i];
if(is_array($combine_ary)) return $combine_ary;
/* 階層構造のテーブルから与えられたIDの兄弟を取得する */
foreach($arrPID as $id) {
for($i = 0; $i < $max; $i++ ) {
if($arrData[$i][$id_name] == $id) {
$parent = $arrData[$i][$pid_name];
for($i = 0; $i < $max; $i++ ) {
if($arrData[$i][$pid_name] == $parent) {
$arrBrothers[] = $arrData[$i][$id_name];
/* 階層構造のテーブルから与えられたIDの直属の子を取得する */
for($i = 0; $i < $max; $i++ ) {
if($arrData[$i][$pid_name] == $parent) {
$arrChildren[] = $arrData[$i][$id_name];
* @deprecated SC_Query::quote() を使用すること
if(ereg("^[/]$", $dir) || ereg("^[A-Z]:[\\]$", $dir) || $count > 256) {
GC_Utils_Ex::gfPrintLog("mkdir $dir");
SC_Utils_Ex::sfMakeDir($dir);
GC_Utils_Ex::gfPrintLog("mkdir $dir");
function sfCopyDir($src, $des, $mess = "", $override = false){
if(!mkdir($des, $mod[2])) {
$fileArray= glob( $src. "*" );
foreach( $fileArray as $key => $data_ ){
if(ereg("/CVS/Entries", $data_)) {
if(ereg("/CVS/Repository", $data_)) {
if(ereg("/CVS/Root", $data_)) {
mb_ereg("^(.*[\/])(.*)",$data_, $matches);
$mess = SC_Utils_Ex::sfCopyDir( $data_. '/', $des. $data. '/', $mess);
$mess.= $des. $data . ":ファイルが存在します\n";
if(@copy( $data_, $des. $data)) {
$mess.= $des. $data . ":コピー成功\n";
$mess.= $des. $data . ":コピー失敗\n";
if ($file == "." or $file == "..") continue;
$del_file = $dir . "/" . $file;
$ret = unlink($dir . "/" . $file);
$ret = SC_Utils_Ex::sfDelFile($del_file);
* 戻り値:結果フラグ 成功なら true 失敗なら false
function sfWriteFile($str, $path, $type, $permission = "") {
if (!($file = fopen ($path, $type))) {
chmod($path, $permission);
* @param boolean|string$output 半角スペース256文字+改行を出力するか。または、送信する文字列を指定。
function sfFlush($output = false, $sleep = 0){
// 出力をバッファリングしない(==日本語自動変換もしない)
// IEのために半角スペース256文字+改行を出力
//echo str_repeat(' ', 256) . "\n";
} else if ($output !== false) {
// @versionの記載があるファイルからバージョンを取得する。
$src_fp = fopen($path, 'rb');
if(ereg("@version", $line)) {
* $array の要素を $arrConvList で指定した方式で mb_convert_kana を適用する.
* @param array $array 変換する文字列の配列
* @param array $arrConvList mb_convert_kana の適用ルール
foreach ($arrConvList as $key => $val) {
if(isset ($array[$key])) {
$array[$key] = mb_convert_kana($array[$key] ,$val);
* 配列の添字が未定義の場合は空文字を代入して定義する.
* @param array $array 添字をチェックする配列
* @param array $defineIndexes チェックする添字
* @return array 添字を定義した配列
foreach ($defineIndexes as $key) {
if (!isset ($array[$key])) $array[$key] = "";
* $arrSrc のうち、キーが $arrKey に含まれるものを返す
foreach ($arrKey as $key) {
if (isset ($arrSrc[$key])) $arrRet[$key] = $arrSrc[$key];
* XML宣言があると問題が発生する UA は出力しない.
* @return string XML宣言の文字列
$ua = $_SERVER['HTTP_USER_AGENT'];
echo '<?xml version="1.0" encoding="' . CHAR_CODE . '"?>' . "\n";
while (($file = readdir($dh)) !== false) $arrDir[] = $file;
foreach($arrDir as $file) {
if($file != "." && $file != "..") {
// SELECT内の見た目を整えるため指定文字数で切る
$file_name = SC_Utils_Ex::sfCutString($file, FILE_NAME_LEN);
$file_size = SC_Utils_Ex::sfCutString(SC_Utils_Ex::sfGetDirSize($path), FILE_NAME_LEN);
$arrDirList[$cnt]['file_name'] = $file;
$arrDirList[$cnt]['file_path'] = $path;
$arrDirList[$cnt]['file_size'] = $file_size;
$arrDirList[$cnt]['file_time'] = $file_time;
$arrDirList[$cnt]['is_dir'] = true;
$arrFileList[$cnt]['file_name'] = $file;
$arrFileList[$cnt]['file_path'] = $path;
$arrFileList[$cnt]['file_size'] = $file_size;
$arrFileList[$cnt]['file_time'] = $file_time;
$arrFileList[$cnt]['is_dir'] = false;
if ($file != '..' && $file != '.' && !is_dir($path)) {
} else if (is_dir($path) && $file != '..' && $file != '.') {
// 下層ファイルのバイト数を取得する為、再帰的に呼び出す。
$bytes += SC_Utils_Ex::sfGetDirSize($path);
// ディレクトリ(ファイル)が存在しない場合は0byteを返す
if($bytes == "") $bytes = 0;
while (false !== ($item = readdir($handle))) {
if ($item != "." && $item != "..") {
$arrResult[$cnt]['result'] = @unlink("$dir/$item");
$arrResult[$cnt]['file_name'] = "$dir/$item";
$arrResult[$cnt]['result'] = @rmdir($dir);
$arrResult[$cnt]['file_name'] = "$dir/$item";
$arrResult[0]['result'] = @unlink("$dir");
$arrResult[0]['file_name'] = "$dir";
* 説明 :ツリー生成用配列取得(javascriptに渡す用)
* 引数2 :現在のツリーの状態開いているフォルダのパスが | 区切りで格納
$arrTree[$cnt]['type'] = "_parent";
$arrTree[$cnt]['type'] = "_child";
$arrTree[$cnt]['path'] = $dir;
$arrTree[$cnt]['rank'] = 0;
$arrTree[$cnt]['count'] = $cnt;
if($_POST['mode'] != '') {
$arrTree[$cnt]['open'] = true;
* 説明 :ツリー生成用配列取得(javascriptに渡す用)
* 引数2 :デフォルトの階層(/区切りで 0,1,2・・・とカウント)
* 引数4 :現在のツリーの状態開いているフォルダのパスが | 区切りで格納
function sfGetFileTreeSub($dir, $default_rank, &$cnt, &$arrTree, $tree_status) {
while (false !== ($item = readdir($handle))) $arrDir[] = $item;
foreach($arrDir as $item) {
if ($item != "." && $item != "..") {
$arrTree[$cnt]['path'] = $path;
$arrTree[$cnt]['type'] = "_parent";
$arrTree[$cnt]['type'] = "_child";
$arrTree[$cnt]['rank'] = $rank - $default_rank + 1;
$arrTree[$cnt]['count'] = $cnt;
* 説明 :指定したディレクトリ配下にファイルがあるか
if ($file != '..' && $file != '.' && is_dir($path)) {
* 説明 :指定したファイルが前回開かれた状態にあったかチェック
* 引数2 :現在のツリーの状態開いているフォルダのパスが | 区切りで格納
$arrTreeStatus = explode('\|', $tree_status);
Header("Content-disposition: attachment; filename=". basename($file));
Header("Content-type: application/octet-stream; name=". basename($file));
Header("Cache-Control: ");
$ret = @mkdir($file, $mode);
$fp = @fopen($filename, 'rb' );
for ($i = 0; $i < count($array); $i++ ){
for ($j = 0; $j < count($arrayIndex); $j++ ){
if ( $j > 0 ) $return .= ",";
$return .= mb_ereg_replace("<","<",mb_ereg_replace( "\"","\"\"",$array[$i][$arrayIndex[$j]] )) . "\"";
for ($j = 0; $j < count($array[$i]); $j++ ){
if ( $j > 0 ) $return .= ",";
$return .= mb_ereg_replace("<","<",mb_ereg_replace( "\"","\"\"",$array[$i][$j] )) . "\"";
foreach($array[0] as $key => $val) {
for($i = 0; $i < $cnt; $i++ ) {
foreach($array[$i] as $val) {
* 一覧-メイン画像のファイル指定がない場合、専用の画像ファイルに書き換える。
* @param string &$filename ファイル名
if (strlen($filename) == 0 || substr($filename, - 1, 1) == '/') {
$filename .= 'noimage_main_list.jpg';
* 詳細-メイン画像のファイル指定がない場合、専用の画像ファイルに書き換える。
* @param string &$filename ファイル名
if (strlen($filename) == 0 || substr($filename, - 1, 1) == '/') {
$filename .= 'noimage_main.png';
/* デバッグ用 ------------------------------------------------------------------------------------------------*/
echo '<div style="font-size: 12px;color: #00FF00;">' . "\n";
echo '<strong>**デバッグ中**</strong><br />' . "\n";
echo '<strong>**デバッグ中**</strong></div>' . "\n";
* @param integer $length 文字数
* @return string ランダムな文字列
require_once dirname(__FILE__ ) . '/../../module/Text/Password.php';
return Text_Password::create($length);
if (SC_Utils_Ex::sfIsHTTPS()) {
$url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '?' . $_SERVER['QUERY_STRING'];
* @return string テキストで表現したバックトレース
if (strlen($backtrace['class']) >= 1) {
$func = $backtrace['class'] . $backtrace['type'] . $backtrace['function'];
$func = $backtrace['function'];
$string .= $backtrace['file'] . " " . $backtrace['line'] . ":" . $func . "\n";
return defined('ADMIN_FUNCTION') && ADMIN_FUNCTION;
return defined('FRONT_FUNCTION') && FRONT_FUNCTION;
return defined('INSTALL_FUNCTION') && INSTALL_FUNCTION;
$objQuery = new SC_Query_Ex(ZIP_DSN);
$masterData = new SC_DB_MasterData_Ex();
$arrPref = $masterData->getMasterData('mtb_pref');
$zipcode = mb_convert_kana($zipcode ,'n');
$sqlse = "SELECT state, city, town FROM mtb_zip WHERE zipcode = ?";
$data_list = $objQuery->getAll($sqlse, array($zipcode));
if (empty($data_list)) return array();
総務省からダウンロードしたデータをそのままインポートすると
$town = $data_list[0]['town'];
$data_list[0]['town'] = $town;
$data_list[0]['state'] = $arrREV_PREF[$data_list[0]['state']];
* プラグインが配置されているディレクトリ(フルパス)を取得する
* @param string $file プラグイン情報ファイル(info.php)のパス
* @return SimpleXMLElement プラグイン XML
* @param string $pluginFullPath プラグインが配置されているディレクトリ(フルパス)
* @return SimpleXMLElement プラグイン XML
* @param string $file プラグイン情報ファイル(info.php)のパス
* @return array プラグイン情報配列
$fullPath = SC_Utils_Ex::sfGetPluginFullPathByRequireFilePath($file);
'path' => SC_Utils_Ex::sfGetPluginPathByPluginFullPath($fullPath),
* TODO include_once を利用することで例外対応をサボタージュしているのを改善する。
* @param string $path プラグインのディレクトリ名
* @return array プラグイン情報配列
return (array) include_once(PLUGIN_REALDIR . "$path/plugin_info.php");
* @return SimpleXMLElement プラグイン XML
* @param SimpleXMLElement $pluginsXml プラグイン XML
* @return integer ファイルに書き込まれたバイト数を返します。
$xml = $pluginsXml->asXML();
if (strlen($xml) == 0) SC_Utils_Ex::sfDispException();
if ($return === false) SC_Utils_Ex::sfDispException();
return (array) include_once $filenamePluginInfo;
* 現在の Unix タイムスタンプを float (秒単位) でマイクロ秒まで返す
* FIXME PHP4でテストする。(現状全くテストしていない。)
* @param SimpleXMLElement $pluginsXml プラグイン XML
* @return integer ファイルに書き込まれたバイト数を返します。
return (float) $usec + (float) $sec;
* 引数 $val が空白かどうかをチェックする. 空白の場合は true.
* - " " (ASCII 32 (0x20)), 通常の空白
* - "\t" (ASCII 9 (0x09)), タブ
* - "\n" (ASCII 10 (0x0A)), リターン
* - "\r" (ASCII 13 (0x0D)), 改行
* - "\0" (ASCII 0 (0x00)), NULバイト
* - "\x0B" (ASCII 11 (0x0B)), 垂直タブ
* 引数 $val が配列の場合は, 空の配列の場合 true を返す.
* 引数 $greedy が true の場合は, 全角スペース, ネストした空の配列も
* @param mixed $val チェック対象の変数
* @param boolean $greedy "貧欲"にチェックを行う場合 true
* @return boolean $val が空白と判断された場合 true
function isBlank($val, $greedy = true) {
* SC_Utils_Ex への再帰は無限ループやメモリリークの懸念
* 戻り値:一致(true) 不一致(false)
$netURL = new Net_URL(HTTP_URL);
if (!$host) return false;
if (!preg_match("#^(http|https)://{$host}#i", $url)) return false;
* @param string $str 暗号化したい文言
* @param string $salt salt
* @return string ハッシュ暗号化された文字列
if ( AUTH_TYPE == 'PLAIN') {
$res = hash_hmac(PASSWORD_HASH_ALGOS, $str . ":" . AUTH_MAGIC, $salt);
* @param string $pass 確認したいパスワード文字列
* @param string $hashpass 確認したいパスワードハッシュ文字列
* @param string $salt salt
if (AUTH_TYPE == 'PLAIN') {
if($pass === $hashpass) {
// 旧バージョン(2.11未満)からの移行を考慮
$hash = sha1($pass . ":" . AUTH_MAGIC);
$hash = SC_Utils_Ex::sfGetHashString($pass, $salt);
if($hash === $hashpass) {
* 検索結果の1ページあたりの最大表示件数を取得する
* 取得できなかった場合は, 定数 SEARCH_PMAX の値を返す
* @param string $search_page_max 表示件数の選択値
* @return integer 1ページあたりの最大表示件数
if (SC_Utils_Ex::sfIsInt($search_page_max) && $search_page_max > 0) {
$page_max = intval($search_page_max);
* この関数は, json_encode() 又は Services_JSON::encode() のラッパーです.
* json_encode() 関数が使用可能な場合は json_encode() 関数を使用する.
* 使用できない場合は, Services_JSON::encode() 関数を使用する.
* @param mixed $value JSON 形式にエンコードする値
* @return string JSON 形式にした文字列
* @see Services_JSON::encode()
require_once dirname(__FILE__ ) . '/../../module/Services/JSON.php';
GC_Utils_Ex::gfPrintLog(' *use Services_JSON::encode(). faster than using the json_encode!');
$objJson = new Services_JSON();
return $objJson->encode($value);
* この関数は, json_decode() 又は Services_JSON::decode() のラッパーです.
* json_decode() 関数が使用可能な場合は json_decode() 関数を使用する.
* 使用できない場合は, Services_JSON::decode() 関数を使用する.
* @param string $json JSON 形式にエンコードされた文字列
* @return mixed デコードされた PHP の型
* @see Services_JSON::decode()
require_once dirname(__FILE__ ) . '/../../module/Services/JSON.php';
GC_Utils_Ex::gfPrintLog(' *use Services_JSON::decode(). faster than using the json_decode!');
$objJson = new Services_JSON();
return $objJson->decode($json);
* 引数のパスが絶対パスの場合は true を返す.
* この関数は, パスの存在チェックを行なわないため注意すること.
* @param string チェック対象のパス
* @return boolean 絶対パスの場合 true
if (strpos(PHP_OS, 'WIN') === false) {
return (substr($realpath, 0, 1) == '/');
return preg_match('/^[a-zA-Z]:(\\\|\/)/', $realpath) ? true : false;
* mkdir 関数の $recursive パラメーターを PHP4 でサポートする.
* @param string $pathname ディレクトリのパス
* @param integer $mode 作成するディレクトリのパーミッション
* @return boolean 作成に成功した場合 true; 失敗した場合 false
* @see http://jp.php.net/mkdir
* SC_Utils_Ex への再帰は無限ループやメモリリークの懸念
Documentation generated on Fri, 24 Feb 2012 14:03:03 +0900 by Seasoft
|