source: branches/version-2_13-dev/data/class/SC_CheckError.php @ 23577

Revision 23577, 56.2 KB checked in by shutta, 12 years ago (diff)

#2448 (typo修正・ソース整形・ソースコメントの改善 for 2.13.3)
可読性を向上

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2014 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24/*----------------------------------------------------------------------
25 * [名称] SC_CheckError
26 * [概要] エラーチェッククラス
27 *----------------------------------------------------------------------
28 */
29class SC_CheckError
30{
31    public $arrErr = array();
32    public $arrParam;
33
34    // チェック対象の値が含まれる配列をセットする。
35    public function __construct($array = '')
36    {
37        if ($array != '') {
38            $this->arrParam = $array;
39        } else {
40            $this->arrParam = $_POST;
41        }
42
43    }
44
45    public function doFunc($value, $arrFunc)
46    {
47        foreach ($arrFunc as $key) {
48            $this->$key($value);
49        }
50    }
51
52    /**
53     * HTMLのタグをチェックする
54     *
55     * @param  array $value value[0] = 項目名
56     *                      value[1] = 判定対象
57     *                      value[2] = 許可するタグが格納された配列
58     * @return void
59     */
60    public function HTML_TAG_CHECK($value)
61    {
62        $disp_name = $value[0];
63        $keyname = $value[1];
64        $arrAllowedTag = $value[2];
65
66        if (isset($this->arrErr[$keyname])) {
67            return;
68        }
69
70        $this->createParam($value);
71
72        // HTMLに含まれているタグを抽出する
73        $match = array();
74        preg_match_all('/<\/?([a-z]+)/i', $this->arrParam[$keyname], $match);
75        $arrTagIncludedHtml = $match[1];
76        // 抽出結果を小文字に変換
77        foreach ($arrTagIncludedHtml as $key => $matchedTag) {
78            $arrTagIncludedHtml[$key] = strtolower($matchedTag);
79        }
80        $arrDiffTag = array_diff($arrTagIncludedHtml, $arrAllowedTag);
81
82        if (empty($arrDiffTag)) return;
83
84        // 少々荒っぽいが、表示用 HTML に変換する
85        foreach ($arrDiffTag as &$tag) {
86            $tag = '[' . htmlspecialchars($tag) . ']';
87        }
88        $html_diff_tag_list = implode(', ', $arrDiffTag);
89
90        $this->arrErr[$keyname] = sprintf(
91            '※ %sに許可されていないタグ %s が含まれています。<br />',
92            $disp_name,
93            $html_diff_tag_list
94        );
95    }
96
97    /**
98     * 必須入力の判定
99     *
100     * 受け取りがない場合エラーを返す
101     * @param  array $value value[0] = 項目名 value[1] = 判定対象
102     * @return void
103     */
104    public function EXIST_CHECK($value)
105    {
106        $disp_name = $value[0];
107        $keyname = $value[1];
108
109        if (isset($this->arrErr[$keyname])) {
110            return;
111        }
112
113        $this->createParam($value);
114
115        $input_var = $this->arrParam[$keyname];
116        if (is_array($input_var)) {
117            if (count($input_var) == 0) {
118                $this->arrErr[$keyname] =
119                    "※ {$disp_name}が選択されていません。<br />";
120            }
121        } else {
122            if (strlen($input_var) == 0) {
123                $this->arrErr[$keyname] =
124                    "※ {$disp_name}が入力されていません。<br />";
125            }
126        }
127    }
128
129    /**
130     * 必須入力の判定(逆順)
131     *
132     * 受け取りがない場合エラーを返す
133     * @param  array $value value[0] = 判定対象 value[1] = 項目名
134     * @return void
135     */
136    public function EXIST_CHECK_REVERSE($value)
137    {
138        $keyname = $value[0];
139        $disp_name = $value[1];
140
141        if (isset($this->arrErr[$keyname])) {
142            return;
143        }
144
145        // $this->createParam($value);
146
147        if (strlen($this->arrParam[$keyname]) == 0) {
148            $this->arrErr[$keyname] =
149                "※ {$disp_name}が入力されていません。<br />";
150        }
151    }
152
153    /**
154     * スペース、タブの判定
155     *
156     * 受け取りがない場合エラーを返す
157     * @param  array $value value[0] = 項目名 value[1] = 判定対象
158     * @return void
159     */
160    public function SPTAB_CHECK($value)
161    {
162        $disp_name = $value[0];
163        $keyname = $value[1];
164
165        if (isset($this->arrErr[$keyname])) {
166            return;
167        }
168
169        $this->createParam($value);
170
171        $input_var = $this->arrParam[$keyname];
172        if (strlen($input_var) != 0
173            && preg_match("/^[  \t\r\n]+$/", $input_var)
174        ) {
175            $this->arrErr[$keyname] = sprintf(
176                '※ %sにスペース、タブ、改行のみの入力はできません。<br />',
177                $disp_name
178            );
179        }
180    }
181
182    /**
183     * スペース、タブの判定
184     *
185     * 受け取りがない場合エラーを返す
186     * @param  array $value value[0] = 項目名 value[1] = 判定対象
187     * @return void
188     */
189    public function NO_SPTAB($value)
190    {
191        $disp_name = $value[0];
192        $keyname = $value[1];
193
194        if (isset($this->arrErr[$keyname])) {
195            return;
196        }
197
198        $this->createParam($value);
199
200        $input_var = $this->arrParam[$keyname];
201        if (strlen($input_var) != 0
202            && preg_match("/[  \t\r\n]+/u", $input_var)
203        ) {
204            $this->arrErr[$keyname] = sprintf(
205                '※ %sにスペース、タブ、改行は含めないで下さい。<br />',
206                $disp_name
207            );
208        }
209    }
210
211    /**
212     * ゼロで開始されている数値の判定
213     *
214     * ゼロで始まる数値の場合エラーを返す
215     * @param  array $value value[0] = 項目名 value[1] = 判定対象
216     * @return void
217     */
218    public function ZERO_START($value)
219    {
220        $disp_name = $value[0];
221        $keyname = $value[1];
222
223        if (isset($this->arrErr[$keyname])) {
224            return;
225        }
226
227        $this->createParam($value);
228
229        $input_var = $this->arrParam[$keyname];
230        if (strlen($input_var) != 0
231            && preg_match("/^[0]+[0-9]+$/", $input_var)
232        ) {
233            $this->arrErr[$keyname] =
234                "※ {$disp_name}に0で始まる数値が入力されています。<br />";
235        }
236    }
237
238    /**
239     * 必須選択の判定
240     *
241     * プルダウンなどで選択されていない場合エラーを返す
242     * @param  array $value value[0] = 項目名 value[1] = 判定対象
243     * @return void
244     */
245    public function SELECT_CHECK($value)
246    {
247        $disp_name = $value[0];
248        $keyname = $value[1];
249
250        if (isset($this->arrErr[$keyname])) {
251            return;
252        }
253
254        $this->createParam($value);
255
256        if (strlen($this->arrParam[$keyname]) == 0) {
257            $this->arrErr[$keyname] =
258                "※ {$disp_name}が選択されていません。<br />";
259        }
260    }
261
262    /**
263     * 同一性の判定
264     *
265     * 入力が指定文字数以上ならエラーを返す
266     * @param  array $value value[0] = 項目名1
267     *                      value[1] = 項目名2
268     *                      value[2] = 判定対象文字列1
269     *                      value[3] = 判定対象文字列2
270     * @return void
271     */
272    public function EQUAL_CHECK($value)
273    {
274        $disp_name1 = $value[0];
275        $disp_name2 = $value[1];
276        $keyname1 = $value[2];
277        $keyname2 = $value[3];
278
279        if (isset($this->arrErr[$keyname1])
280            || isset($this->arrErr[$keyname2])
281        ) {
282            return;
283        }
284
285        // $this->createParam($value);
286
287        // 文字数の取得
288        if ($this->arrParam[$keyname1] !== $this->arrParam[$keyname2]) {
289            $this->arrErr[$keyname1] =
290                "※{$disp_name1}と{$disp_name2}が一致しません。<br />";
291        }
292    }
293
294    /**
295     * 値が異なることの判定
296     *
297     * 入力が指定文字数以上ならエラーを返す
298     * @param  array $value value[0] = 項目名1
299     *                      value[1] = 項目名2
300     *                      value[2] = 判定対象文字列1
301     *                      value[3] = 判定対象文字列2
302     * @return void
303     */
304    public function DIFFERENT_CHECK($value)
305    {
306        $disp_name1 = $value[0];
307        $disp_name2 = $value[1];
308        $keyname1 = $value[2];
309        $keyname2 = $value[3];
310
311        if (isset($this->arrErr[$keyname1])
312            || isset($this->arrErr[$keyname2])
313        ) {
314            return;
315        }
316
317        // $this->createParam($value);
318
319        // 文字数の取得
320        if ($this->arrParam[$keyname1] == $this->arrParam[$keyname2]) {
321            $this->arrErr[$keyname1] = sprintf(
322                '※ %sと%sは、同じ値を使用できません。<br />',
323                $disp_name1,
324                $disp_name2
325            );
326        }
327    }
328
329    /**
330     * 値の大きさを比較する value[2] < value[3]でなければエラー
331     *
332     * 入力が指定文字数以上ならエラーを返す
333     * @param  array $value value[0] = 項目名1
334     *                      value[1] = 項目名2
335     *                      value[2] = 判定対象文字列1
336     *                      value[3] = 判定対象文字列2
337     * @return void
338     */
339    public function GREATER_CHECK($value)
340    {
341        $disp_name1 = $value[0];
342        $disp_name2 = $value[1];
343        $keyname1 = $value[2];
344        $keyname2 = $value[3];
345
346        if (isset($this->arrErr[$keyname1])
347            || isset($this->arrErr[$keyname2])
348        ) {
349            return;
350        }
351
352        // $this->createParam($value);
353
354        // 文字数の取得
355        $input_var1 = $this->arrParam[$keyname1];
356        $input_var2 = $this->arrParam[$keyname2];
357        if ($input_var1 != ''
358            && $input_var2 != ''
359            && ($input_var1 > $input_var2)
360        ) {
361            $this->arrErr[$keyname1] = sprintf(
362                '※ %sは%sより大きい値を入力できません。<br />',
363                $disp_name1,
364                $disp_name1
365            );
366        }
367    }
368
369    /**
370     * 最大文字数制限の判定
371     *
372     * 入力が指定文字数以上ならエラーを返す
373     * @param  array $value value[0] = 項目名
374     *                      value[1] = 判定対象文字列
375     *                      value[2] = 最大文字数(半角も全角も1文字として数える)
376     * @return void
377     */
378    public function MAX_LENGTH_CHECK($value)
379    {
380        $disp_name = $value[0];
381        $keyname = $value[1];
382        $max_str_len = $value[2];
383
384        if (isset($this->arrErr[$keyname])) {
385            return;
386        }
387
388        $this->createParam($value);
389
390        // 文字数の取得
391        if (mb_strlen($this->arrParam[$keyname]) > $max_str_len) {
392            $this->arrErr[$keyname] = sprintf(
393                '※ %sは%d字以下で入力してください。<br />',
394                $disp_name,
395                $max_str_len
396            );
397        }
398    }
399
400    /**
401     * 最小文字数制限の判定
402     *
403     * 入力が指定文字数未満ならエラーを返す
404     * @param  array $value value[0] = 項目名
405     *                      value[1] = 判定対象文字列
406     *                      value[2] = 最小文字数(半角も全角も1文字として数える)
407     * @return void
408     */
409    public function MIN_LENGTH_CHECK($value)
410    {
411        $disp_name = $value[0];
412        $keyname = $value[1];
413        $min_str_len = $value[2];
414
415        if (isset($this->arrErr[$keyname])) {
416            return;
417        }
418
419        $this->createParam($value);
420
421        // 文字数の取得
422        if (mb_strlen($this->arrParam[$keyname]) < $min_str_len) {
423            $this->arrErr[$keyname] = sprintf(
424                '※ %sは%d字以上で入力してください。<br />',
425                $disp_name,
426                $min_str_len
427            );
428        }
429    }
430
431    /**
432     * 最大文字数制限の判定
433     *
434     * 入力が最大数以上ならエラーを返す
435     * @param  array $value value[0] = 項目名
436     *                      value[1] = 判定対象文字列
437     *                      value[2] = 最大数
438     * @return void
439     */
440    public function MAX_CHECK($value)
441    {
442        $disp_name = $value[0];
443        $keyname = $value[1];
444        $max_threshold = $value[2];
445
446        if (isset($this->arrErr[$keyname])) {
447            return;
448        }
449
450        $this->createParam($value);
451
452        // 文字数の取得
453        if ($this->arrParam[$keyname] > $max_threshold) {
454            $this->arrErr[$keyname] = sprintf(
455                '※ %sは%d以下で入力してください。<br />',
456                $disp_name,
457                $max_threshold
458            );
459        }
460    }
461
462    /**
463     * 最小数値制限の判定
464     *
465     * 入力が最小数未満ならエラーを返す
466     * @param  array $value value[0] = 項目名
467     *                      value[1] = 判定対象文字列
468     *                      value[2] = 最小数
469     * @return void
470     */
471    public function MIN_CHECK($value)
472    {
473        $disp_name = $value[0];
474        $keyname = $value[1];
475        $min_threshold = $value[2];
476
477        if (isset($this->arrErr[$keyname])) {
478            return;
479        }
480
481        $this->createParam($value);
482
483        if ($this->arrParam[$keyname] < $min_threshold) {
484            $this->arrErr[$keyname] = sprintf(
485                '※ %sは%d以上で入力してください。<br />',
486                $disp_name,
487                $min_threshold
488            );
489        }
490    }
491
492    /**
493     * 数字の判定
494     *
495     * 入力文字が数字以外ならエラーを返す
496     * @param  array $value value[0] = 項目名 value[1] = 判定対象文字列
497     * @return void
498     */
499    public function NUM_CHECK($value)
500    {
501        $disp_name = $value[0];
502        $keyname = $value[1];
503
504        if (isset($this->arrErr[$keyname])) {
505            return;
506        }
507
508        $this->createParam($value);
509
510        if ($this->numelicCheck($this->arrParam[$keyname])) {
511            $this->arrErr[$keyname] =
512                "※ {$disp_name}は数字で入力してください。<br />";
513        }
514    }
515
516    /**
517     * 小数点を含む数字の判定
518     *
519     * 入力文字が数字以外ならエラーを返す
520     * @param  array $value value[0] = 項目名 value[1] = 判定対象文字列
521     * @return void
522     */
523    public function NUM_POINT_CHECK($value)
524    {
525        $disp_name = $value[0];
526        $keyname = $value[1];
527
528        if (isset($this->arrErr[$keyname])) {
529            return;
530        }
531
532        $this->createParam($value);
533
534        if (strlen($this->arrParam[$keyname]) > 0
535            && !is_numeric($this->arrParam[$keyname])
536        ) {
537            $this->arrErr[$keyname] =
538                "※ {$disp_name}は数字で入力してください。<br />";
539        }
540    }
541
542    public function ALPHA_CHECK($value)
543    {
544        $disp_name = $value[0];
545        $keyname = $value[1];
546
547        if (isset($this->arrErr[$keyname])) {
548            return;
549        }
550
551        $this->createParam($value);
552
553        if (strlen($this->arrParam[$keyname]) > 0
554            && !ctype_alpha($this->arrParam[$keyname])
555        ) {
556            $this->arrErr[$keyname] =
557                "※ {$disp_name}は半角英字で入力してください。<br />";
558        }
559    }
560
561    /**
562     * 電話番号の判定
563     *
564     * 数字チェックと文字数チェックを実施する。
565     * @param array $value 各要素は以下の通り。<br>
566     *     [0]: 項目名<br>
567     *     [1]: 電番1項目目<br>
568     *     [2]: 電番2項目目<br>
569     *     [3]: 電番3項目目<br>
570     *     [4]: 電話番号各項目制限 (指定なしの場合、TEL_ITEM_LEN)<br>
571     *     [5]: 電話番号総数 (指定なしの場合、TEL_LEN)
572     * @return void
573     */
574    public function TEL_CHECK($value)
575    {
576        $disp_name = $value[0];
577        $keyname1 = $value[1];
578        $keyname2 = $value[2];
579        $keyname3 = $value[3];
580
581        $telItemLen = isset($value[4]) ? $value[4] : TEL_ITEM_LEN;
582        $telLen = isset($value[5]) ? $value[5] : TEL_LEN;
583
584        if (isset($this->arrErr[$keyname1])
585            || isset($this->arrErr[$keyname2])
586            || isset($this->arrErr[$keyname3])
587        ) {
588            return;
589        }
590
591        $this->createParam($value);
592
593        $cnt = 0;
594        for ($i = 1; $i <= 3; $i++) {
595            $keyname = ${"keyname{$i}"};
596            if (strlen($this->arrParam[$keyname]) > 0) {
597                $cnt++;
598            }
599        }
600
601        // 全ての項目が満たされていない場合を判定(一部だけ入力されている状態)
602        if ($cnt > 0 && $cnt < 3) {
603            $this->arrErr[$keyname1] .=
604                "※ {$disp_name}は全ての項目を入力してください。<br />";
605        }
606
607        $total_count = 0;
608        for ($i = 1; $i <= 3; $i++) {
609            $keyname = ${"keyname{$i}"};
610            $input_var = $this->arrParam[$keyname];
611
612            if (strlen($input_var) > 0 && strlen($input_var) > $telItemLen) {
613                $this->arrErr[$keyname] .= sprintf(
614                    '※ %sは%d字以内で入力してください。<br />',
615                    $disp_name . $i,
616                    $telItemLen
617                );
618            } elseif ($this->numelicCheck($input_var)) {
619                $this->arrErr[$keyname] .=
620                    "※ {$disp_name}{$i}は数字で入力してください。<br />";
621            }
622
623            $total_count += strlen($input_var);
624        }
625
626        // 合計値チェック
627        if ($total_count > $telLen) {
628            $this->arrErr[$keyname3] .=
629                "※ {$disp_name}は{$telLen}文字以内で入力してください。<br />";
630        }
631    }
632
633    /* 関連項目が完全に満たされているか判定
634        value[0]    : 項目名
635        value[1]    : 判定対象要素名
636    */
637    public function FULL_EXIST_CHECK($value)
638    {
639        $disp_name = $value[0];
640        $keyname = $value[1];
641
642        $this->createParam($value);
643
644        // 既に該当項目にエラーがある場合は、判定しない。
645        $max = count($value);
646        for ($i = 1; $i < $max; $i++) {
647            if (isset($this->arrErr[$value[$i]])) {
648                return;
649            }
650        }
651
652        // 全ての項目が入力されていない場合はエラーとする。
653        $blank = false;
654
655        for ($i = 1; $i < $max; $i++) {
656            if (strlen($this->arrParam[$value[$i]]) <= 0) {
657                $blank = true;
658            }
659        }
660
661        if ($blank) {
662            $this->arrErr[$keyname] =
663                "※ {$disp_name}が入力されていません。<br />";
664        }
665    }
666
667    /* 関連項目が全て満たされているか判定
668        value[0]    : 項目名
669        value[1]    : 判定対象要素名
670    */
671    public function ALL_EXIST_CHECK($value)
672    {
673        $disp_name = $value[0];
674        $keyname = $value[1];
675
676        // 既に該当項目にエラーがある場合は、判定しない。
677        $max = count($value);
678        for ($i = 1; $i < $max; $i++) {
679            if (isset($this->arrErr[$value[$i]])) {
680                return;
681            }
682        }
683
684        $blank = false;
685        $input = false;
686
687        // 全ての項目がブランクでないか、全ての項目が入力されていない場合はエラーとする。
688        for ($i = 1; $i < $max; $i++) {
689            if (strlen($this->arrParam[$value[$i]]) <= 0) {
690                $blank = true;
691            } else {
692                $input = true;
693            }
694        }
695
696        if ($blank && $input) {
697            $this->arrErr[$keyname] =
698                "※ {$disp_name}は全ての項目を入力して下さい。<br />";
699        }
700    }
701
702    /* 関連項目がどれか一つ満たされているか判定
703        value[0]    : 項目名
704        value[1]    : 判定対象要素名
705    */
706    public function ONE_EXIST_CHECK($value)
707    {
708        $disp_name = $value[0];
709        $keyname = $value[1];
710
711        $this->createParam($value);
712
713        // 既に該当項目にエラーがある場合は、判定しない。
714        $max = count($value);
715        for ($i = 1; $i < $max; $i++) {
716            if (isset($this->arrErr[$value[$i]])) {
717                return;
718            }
719        }
720
721        $input = false;
722
723        // 全ての項目がブランクでないか、全ての項目が入力されていない場合はエラーとする。
724        for ($i = 1; $i < $max; $i++) {
725            if (strlen($this->arrParam[$value[$i]]) > 0) {
726                $input = true;
727            }
728        }
729
730        if (!$input) {
731            $this->arrErr[$keyname] =
732                "※ {$disp_name}が入力されていません。<br />";
733        }
734    }
735
736    /* 上位の項目が満たされているか判定
737        value[0]    : 項目名
738        value[1]    : 判定対象要素名
739    */
740    public function TOP_EXIST_CHECK($value)
741    {
742        $disp_name = $value[0];
743        $keyname = $value[1];
744
745        $this->createParam($value);
746
747        // 既に該当項目にエラーがある場合は、判定しない。
748        $max = count($value);
749        for ($i = 1; $i < $max; $i++) {
750            if (isset($this->arrErr[$value[$i]])) {
751                return;
752            }
753        }
754
755        $blank = false;
756        $error = false;
757
758        // 全ての項目がブランクでないか、全ての項目が入力されていない場合はエラーとする。
759        for ($i = 1; $i < $max; $i++) {
760            if (strlen($this->arrParam[$value[$i]]) <= 0) {
761                $blank = true;
762            } else {
763                if ($blank) {
764                    $error = true;
765                }
766            }
767        }
768
769        if ($error) {
770            $this->arrErr[$keyname] =
771                "※ {$disp_name}は先頭の項目から順番に入力して下さい。<br />";
772        }
773    }
774
775    /* カタカナの判定 */
776    // 入力文字がカナ以外ならエラーを返す
777    // value[0] = 項目名 value[1] = 判定対象文字列
778    public function KANA_CHECK($value)
779    {
780        $disp_name = $value[0];
781        $keyname = $value[1];
782
783        if (isset($this->arrErr[$keyname])) {
784            return;
785        }
786
787        $this->createParam($value);
788
789        $input_var = $this->arrParam[$keyname];
790        $pattern = "/^[ァ-ヶヲ-゚ー]+$/u";
791        if (strlen($input_var) > 0 && !preg_match($pattern, $input_var)) {
792            $this->arrErr[$keyname] =
793                "※ {$disp_name}はカタカナで入力してください。<br />";
794        }
795    }
796
797    /* カタカナの判定2 (タブ、スペースは許可する) */
798    // 入力文字がカナ以外ならエラーを返す
799    // value[0] = 項目名 value[1] = 判定対象文字列
800    public function KANABLANK_CHECK($value)
801    {
802        $disp_name = $value[0];
803        $keyname = $value[1];
804
805        if (isset($this->arrErr[$keyname])) {
806            return;
807        }
808
809        $this->createParam($value);
810
811        $input_var = $this->arrParam[$keyname];
812        $pattern = "/^([  \t\r\n]|[ァ-ヶ]|[ー])+$/u";
813        if (strlen($input_var) > 0 && !preg_match($pattern, $input_var)) {
814            $this->arrErr[$keyname] =
815                "※ {$disp_name}はカタカナで入力してください。<br />";
816        }
817    }
818
819    /* 英数字の判定 */
820    // 入力文字が英数字以外ならエラーを返す
821    // value[0] = 項目名 value[1] = 判定対象文字列
822    public function ALNUM_CHECK($value)
823    {
824        $disp_name = $value[0];
825        $keyname = $value[1];
826
827        if (isset($this->arrErr[$keyname])) {
828            return;
829        }
830
831        $this->createParam($value);
832
833        $input_var = $this->arrParam[$keyname];
834        if (strlen($input_var) > 0 && !ctype_alnum($input_var)) {
835            $this->arrErr[$keyname] =
836                "※ {$disp_name}は英数字で入力してください。<br />";
837        }
838    }
839
840    /* 英数記号の判定 */
841    // 入力文字が英数記号以外ならエラーを返す
842    // value[0] = 項目名 value[1] = 判定対象文字列
843    public function GRAPH_CHECK($value)
844    {
845        $disp_name = $value[0];
846        $keyname = $value[1];
847
848        if (isset($this->arrErr[$keyname])) {
849            return;
850        }
851
852        $this->createParam($value);
853
854        $input_var = $this->arrParam[$keyname];
855        $pattern = "/^[[:graph:][:space:]]+$/i";
856        if (strlen($input_var) > 0 && !preg_match($pattern, $input_var)) {
857            $this->arrErr[$keyname] =
858                "※ {$disp_name}は英数記号で入力してください。<br />";
859        }
860    }
861
862    /* 必須選択の判定 */
863    // 入力値で0が許されない場合エラーを返す
864    // value[0] = 項目名 value[1] = 判定対象
865    public function ZERO_CHECK($value)
866    {
867        $disp_name = $value[0];
868        $keyname = $value[1];
869
870        $this->createParam($value);
871
872        if ($this->arrParam[$keyname] == '0') {
873            $this->arrErr[$keyname] =
874                "※ {$disp_name}は1以上を入力してください。<br />";
875        }
876    }
877
878    /* 桁数の判定 (最小最大)*/
879    // 入力文字の桁数判定 → 最小桁数<入力文字列<最大桁数
880    // value[0] = 項目名 value[1] = 判定対象文字列 value[2] = 最小桁数 value[3] = 最大桁数
881    public function NUM_RANGE_CHECK($value)
882    {
883        $disp_name = $value[0];
884        $keyname = $value[1];
885        $min_digit = $value[2];
886        $max_digit = $value[3];
887
888        if (isset($this->arrErr[$keyname])) {
889            return;
890        }
891
892        $this->createParam($value);
893
894        // $this->arrParam[$keyname] = mb_convert_kana($this->arrParam[$keyname], 'n');
895        $count = strlen($this->arrParam[$keyname]);
896        if (($count > 0) && $min_digit > $count || $max_digit < $count) {
897            $this->arrErr[$keyname] = sprintf(
898                '※ %sは%d桁~%d桁で入力して下さい。<br />',
899                $disp_name,
900                $min_digit,
901                $max_digit
902            );
903        }
904    }
905
906    /* 桁数の判定 */
907    // 入力文字の桁数判定 → 入力文字列 = 桁数 以外はNGの場合
908    // value[0] = 項目名 value[1] = 判定対象文字列 value[2] = 桁数
909    public function NUM_COUNT_CHECK($value)
910    {
911        $disp_name = $value[0];
912        $keyname = $value[1];
913        $digit = $value[2];
914
915        if (isset($this->arrErr[$keyname])) {
916            return;
917        }
918
919        $this->createParam($value);
920
921        $count = strlen($this->arrParam[$keyname]);
922        if (($count > 0) && $count != $digit) {
923            $this->arrErr[$keyname] =
924                "※ {$disp_name}は{$digit}桁で入力して下さい。<br />";
925        }
926    }
927
928    /**
929     * メールアドレス形式の判定
930     *
931     * @param array $value 各要素は以下の通り。<br>
932     *     [0]: 項目名<br>
933     *     [1]: 判定対象を格納している配列キー
934     * @return void
935     */
936    public function EMAIL_CHECK($value)
937    {
938        $disp_name = $value[0];
939        $keyname = $value[1];
940
941        if (isset($this->arrErr[$keyname])) {
942            return;
943        }
944
945        $this->createParam($value);
946
947        // 入力がない場合処理しない
948        if (strlen($this->arrParam[$keyname]) === 0) {
949            return;
950        }
951
952        $wsp           = '[\x20\x09]';
953        $vchar         = '[\x21-\x7e]';
954        $quoted_pair   = "\\\\(?:$vchar|$wsp)";
955        $qtext         = '[\x21\x23-\x5b\x5d-\x7e]';
956        $qcontent      = "(?:$qtext|$quoted_pair)";
957        $quoted_string = "\"$qcontent*\"";
958        $atext         = '[a-zA-Z0-9!#$%&\'*+\-\/\=?^_`{|}~]';
959        $dot_atom      = "$atext+(?:[.]$atext+)*";
960        $local_part    = "(?:$dot_atom|$quoted_string)";
961        $domain        = $dot_atom;
962        $addr_spec     = "{$local_part}[@]$domain";
963
964        $dot_atom_loose   = "$atext+(?:[.]|$atext)*";
965        $local_part_loose = "(?:$dot_atom_loose|$quoted_string)";
966        $addr_spec_loose  = "{$local_part_loose}[@]$domain";
967
968        if (RFC_COMPLIANT_EMAIL_CHECK) {
969            $regexp = "/\A{$addr_spec}\z/";
970        } else {
971            // 携帯メールアドレス用に、..や.@を許容する。
972            $regexp = "/\A{$addr_spec_loose}\z/";
973        }
974
975        if (!preg_match($regexp, $this->arrParam[$keyname])) {
976            $this->arrErr[$keyname] = "※ {$disp_name}の形式が不正です。<br />";
977
978            return;
979        }
980
981        // 最大文字数制限の判定 (#871)
982        $arrValueTemp = $value;
983        $arrValueTemp[2] = 256;
984        $this->MAX_LENGTH_CHECK($arrValueTemp);
985    }
986
987    /* メールアドレスに使用できる文字の判定 */
988    // メールアドレスに使用する文字を正規表現で判定する
989    //  value[0] = 項目名 value[1] = 判定対象メールアドレス
990    public function EMAIL_CHAR_CHECK($value)
991    {
992        $disp_name = $value[0];
993        $keyname = $value[1];
994
995        if (isset($this->arrErr[$keyname])) {
996            return;
997        }
998
999        $this->createParam($value);
1000
1001        $input_var = $this->arrParam[$keyname];
1002        $pattern = "/^[a-zA-Z0-9_\.@\+\?-]+$/i";
1003        if (strlen($input_var) > 0 && !preg_match($pattern, $input_var)) {
1004            $this->arrErr[$keyname] =
1005                "※ {$disp_name}に使用する文字を正しく入力してください。<br />";
1006        }
1007    }
1008
1009    /* URL形式の判定 */
1010    // URLを正規表現で判定する。デフォルトでhttp://があってもOK
1011    //  value[0] = 項目名 value[1] = 判定対象URL
1012    public function URL_CHECK($value)
1013    {
1014        $disp_name = $value[0];
1015        $keyname = $value[1];
1016
1017        if (isset($this->arrErr[$keyname])) {
1018            return;
1019        }
1020
1021        $input_var = $this->arrParam[$keyname];
1022        $pattern = "@^https?://+($|[a-zA-Z0-9_~=:&\?\.\/-])+$@i";
1023        if (strlen($input_var) > 0 && !preg_match($pattern, $input_var)) {
1024            $this->arrErr[$keyname] =
1025                "※ {$disp_name}を正しく入力してください。<br />";
1026        }
1027    }
1028
1029    /* IPアドレスの判定 */
1030    //  value[0] = 項目名 value[1] = 判定対象IPアドレス文字列
1031    public function IP_CHECK($value)
1032    {
1033        $disp_name = $value[0];
1034        $keyname = $value[1];
1035
1036        if (isset($this->arrErr[$keyname])) {
1037            return;
1038        }
1039
1040        //改行コードが含まれている場合には配列に変換
1041        $params = str_replace("\r", '', $this->arrParam[$keyname]);
1042        if (!empty($params)) {
1043            if (strpos($params, "\n") === false) {
1044                $params .= "\n";
1045            }
1046            $params = explode("\n", $params);
1047            foreach ($params as $param) {
1048                $param = trim($param);
1049                if (long2ip(ip2long($param)) != trim($param) && !empty($param)) {
1050                    $this->arrErr[$keyname] =
1051                        "※ {$disp_name}に正しい形式のIPアドレスを入力してください。<br />";
1052                }
1053            }
1054        }
1055    }
1056
1057    /* 拡張子の判定 */
1058    // 受け取りがない場合エラーを返す
1059    // value[0] = 項目名 value[1] = 判定対象 value[2]=array(拡張子)
1060    public function FILE_EXT_CHECK($value)
1061    {
1062        $disp_name = $value[0];
1063        $keyname = $value[1];
1064        $arrExtension = $value[2];
1065
1066        if (isset($this->arrErr[$keyname]) || count($arrExtension) == 0) {
1067            return;
1068        }
1069
1070        $this->createParam($value);
1071
1072        $match = false;
1073        $filename = $_FILES[$keyname]['name'];
1074        if (strlen($filename) >= 1) {
1075            foreach ($arrExtension as $check_ext) {
1076                $pattern = '/' . preg_quote('.' . $check_ext) . '$/i';
1077                $match = preg_match($pattern, $filename) >= 1;
1078                if ($match === true) {
1079                    break 1;
1080                }
1081            }
1082        }
1083        if ($match === false) {
1084            $str_ext = implode('・', $arrExtension);
1085            $this->arrErr[$keyname] =
1086                "※ {$disp_name}で許可されている形式は、{$str_ext}です。<br />";
1087        }
1088    }
1089
1090    /* ファイルが存在するかチェックする */
1091    // 受け取りがない場合エラーを返す
1092    // value[0] = 項目名 value[1] = 判定対象  value[2] = 指定ディレクトリ
1093    public function FIND_FILE($value)
1094    {
1095        $disp_name = $value[0];
1096        $keyname = $value[1];
1097        $target_dir = $value[2];
1098
1099        if (isset($this->arrErr[$keyname])) {
1100            return;
1101        }
1102
1103        // $this->createParam($value);
1104
1105        if ($target_dir != '') {
1106            $dir = $target_dir;
1107        } else {
1108            $dir = IMAGE_SAVE_REALDIR;
1109        }
1110
1111        $path = $dir . '/' . $this->arrParam[$keyname];
1112        $path = str_replace('//', '/', $path);
1113
1114        if ($this->arrParam[$keyname] != '' && !file_exists($path)) {
1115            $this->arrErr[$keyname] = "※ {$path}が見つかりません。<br />";
1116        }
1117    }
1118
1119    /* ファイルが上げられたか確認 */
1120    // 受け取りがない場合エラーを返す
1121    // value[0] = 項目名 value[1] = 判定対象  value[2] = 指定サイズ(KB)
1122    public function FILE_EXIST_CHECK($value)
1123    {
1124        $disp_name = $value[0];
1125        $keyname = $value[1];
1126
1127        if (isset($this->arrErr[$keyname])) {
1128            return;
1129        }
1130
1131        $this->createParam($value);
1132
1133        $file_size = $_FILES[$keyname]['size'];
1134        if ($file_size == '' || !($file_size > 0)) {
1135            $this->arrErr[$keyname] =
1136                "※ {$disp_name}をアップロードして下さい。<br />";
1137        }
1138    }
1139
1140    /* ファイルサイズの判定 */
1141    // 受け取りがない場合エラーを返す
1142    // value[0] = 項目名 value[1] = 判定対象  value[2] = 指定サイズ(KB)
1143    public function FILE_SIZE_CHECK($value)
1144    {
1145        $disp_name = $value[0];
1146        $keyname = $value[1];
1147        $max_file_size = $value[2];
1148
1149        if (isset($this->arrErr[$keyname])) {
1150            return;
1151        }
1152
1153        $this->createParam($value);
1154
1155        if ($_FILES[$keyname]['size'] > $max_file_size *  1024) {
1156            $byte = 'KB';
1157            if ($max_file_size >= 1000) {
1158                $max_file_size = $max_file_size / 1000;
1159                $byte = 'MB';
1160            }
1161            $this->arrErr[$keyname] = sprintf(
1162                '※ %sのファイルサイズは%d%s以下のものを使用してください。<br />',
1163                $disp_name,
1164                $max_file_size,
1165                $byte
1166            );
1167        }
1168    }
1169
1170    /* ファイル名の判定 */
1171    // 入力文字が英数字,'_','-','.'以外ならエラーを返す
1172    // value[0] = 項目名 value[1] = 判定対象文字列
1173    public function FILE_NAME_CHECK($value)
1174    {
1175        $disp_name = $value[0];
1176        $keyname = $value[1];
1177
1178        if (isset($this->arrErr[$keyname])) {
1179            return;
1180        }
1181
1182        $this->createParam($value);
1183
1184        $filename = $_FILES[$keyname]['name'];
1185        $pattern = "/^[[:alnum:]_\.-]+$/i";
1186        if (strlen($filename) > 0 && !preg_match($pattern, $filename)) {
1187            $this->arrErr[$keyname] =
1188                "※ {$disp_name}のファイル名には、英数字、記号(_ - .)のみを入力して下さい。<br />";
1189        }
1190    }
1191
1192    /* ファイル名の判定(アップロード以外の時) */
1193    // 入力文字が英数字,'_','-','.'以外ならエラーを返す
1194    // value[0] = 項目名 value[1] = 判定対象文字列
1195    public function FILE_NAME_CHECK_BY_NOUPLOAD($value)
1196    {
1197        $disp_name = $value[0];
1198        $keyname = $value[1];
1199
1200        if (isset($this->arrErr[$keyname])) {
1201            return;
1202        }
1203
1204        $this->createParam($value);
1205
1206        $filename = $this->arrParam[$keyname];
1207        $pattern = "/[^[:alnum:]_.\\-]/";
1208        if (strlen($filename) > 0 && preg_match($pattern, $filename)) {
1209            $this->arrErr[$keyname] =
1210                "※ {$disp_name}のファイル名には、英数字、記号(_ - .)のみを入力して下さい。<br />";
1211        }
1212    }
1213
1214    //日付チェック
1215    // value[0] = 項目名
1216    // value[1] = YYYY
1217    // value[2] = MM
1218    // value[3] = DD
1219    public function CHECK_DATE($value)
1220    {
1221        $disp_name = $value[0];
1222        $keyname = $value[1];
1223
1224        if (isset($this->arrErr[$keyname])) {
1225            return;
1226        }
1227
1228        $this->createParam($value);
1229
1230        $input_year = $this->arrParam[$value[1]];
1231        $input_month = $this->arrParam[$value[2]];
1232        $input_day = $this->arrParam[$value[3]];
1233        // 少なくともどれか一つが入力されている。
1234        if ($input_year > 0 || $input_month > 0 || $input_day > 0) {
1235            // 年月日のどれかが入力されていない。
1236            if (!(strlen($input_year) > 0 && strlen($input_month) > 0 && strlen($input_day) > 0)) {
1237                $this->arrErr[$keyname] =
1238                    "※ {$disp_name}は全ての項目を入力して下さい。<br />";
1239            } elseif (!checkdate($input_month, $input_day, $input_year)) {
1240                $this->arrErr[$keyname] =
1241                    "※ {$disp_name}が正しくありません。<br />";
1242            }
1243        }
1244    }
1245
1246    //日付チェック
1247    // value[0] = 項目名
1248    // value[1] = YYYY
1249    // value[2] = MM
1250    // value[3] = DD
1251    // value[4] = HH
1252    // value[5] = mm
1253    public function CHECK_DATE2($value)
1254    {
1255        $disp_name = $value[0];
1256        $keyname = $value[1];
1257
1258        if (isset($this->arrErr[$keyname])) {
1259            return;
1260        }
1261
1262        $this->createParam($value);
1263
1264        $input_year = $this->arrParam[$value[1]];
1265        $input_month = $this->arrParam[$value[2]];
1266        $input_day = $this->arrParam[$value[3]];
1267        $input_hour = $this->arrParam[$value[4]];
1268        $input_minute = $this->arrParam[$value[5]];
1269        // 少なくともどれか一つが入力されている。
1270        if ($input_year > 0 || $input_month > 0 || $input_day > 0
1271            || $input_hour >= 0 || $input_minute >= 0
1272        ) {
1273            // 年月日時のどれかが入力されていない。
1274            if (!(strlen($input_year) > 0 && strlen($input_month) > 0 && strlen($input_day) > 0 && strlen($input_hour) > 0 && strlen($input_minute) > 0)) {
1275                $this->arrErr[$keyname] =
1276                    "※ {$disp_name}は全ての項目を入力して下さい。<br />";
1277            } elseif (! checkdate($input_month, $input_day, $input_year)) {
1278                $this->arrErr[$keyname] =
1279                    "※ {$disp_name}が正しくありません。<br />";
1280            }
1281        }
1282    }
1283
1284    //日付チェック
1285    // value[0] = 項目名
1286    // value[1] = YYYY
1287    // value[2] = MM
1288    public function CHECK_DATE3($value)
1289    {
1290        $disp_name = $value[0];
1291        $keyname = $value[1];
1292
1293        if (isset($this->arrErr[$keyname])) {
1294            return;
1295        }
1296
1297        $this->createParam($value);
1298
1299        $input_year = $this->arrParam[$value[1]];
1300        $input_month = $this->arrParam[$value[2]];
1301        // 少なくともどれか一つが入力されている。
1302        if ($input_year > 0 || $input_month > 0) {
1303            // 年月日時のどれかが入力されていない。
1304            if (!(strlen($input_year) > 0 && strlen($input_month) > 0)) {
1305                $this->arrErr[$keyname] =
1306                    "※ {$disp_name}は全ての項目を入力して下さい。<br />";
1307            } elseif (! checkdate($input_month, 1, $input_year)) {
1308                $this->arrErr[$keyname] =
1309                    "※ {$disp_name}が正しくありません。<br />";
1310            }
1311        }
1312    }
1313
1314    //誕生日チェック
1315    // value[0] = 項目名
1316    // value[1] = YYYY
1317    // value[2] = MM
1318    // value[3] = DD
1319    public function CHECK_BIRTHDAY($value)
1320    {
1321        $disp_name = $value[0];
1322        $keyname = $value[1];
1323
1324        if (isset($this->arrErr[$keyname])) {
1325            return;
1326        }
1327
1328        $this->createParam($value);
1329
1330        // 年が入力されている。
1331        if (strlen($this->arrParam[$keyname]) >= 1) {
1332            // 年の数字チェック、最小数値制限チェック
1333            $this->doFunc(array("{$disp_name}(年)", $keyname, BIRTH_YEAR),
1334                array('NUM_CHECK', 'MIN_CHECK'));
1335            // 上のチェックでエラーある場合、中断する。
1336            if (isset($this->arrErr[$keyname])) {
1337                return;
1338            }
1339
1340            // 年の最大数値制限チェック
1341            $current_year = date('Y', strtotime('now'));
1342            $this->doFunc(array("{$disp_name}(年)", $keyname, $current_year),
1343                array('MAX_CHECK'));
1344            // 上のチェックでエラーある場合、中断する。
1345            if (isset($this->arrErr[$keyname])) {
1346                return;
1347            }
1348        }
1349
1350        // XXX createParam() が二重に呼ばれる問題を抱える
1351        $this->CHECK_DATE($value);
1352    }
1353
1354    /*-----------------------------------------------------------------*/
1355    /*  CHECK_SET_TERM
1356    /*  年月日に別れた2つの期間の妥当性をチェックし、整合性と期間を返す
1357    /*  引数 (開始年,開始月,開始日,終了年,終了月,終了日)
1358    /*  戻値 array(1,2,3)
1359    /*          1.開始年月日 (YYYYMMDD 000000)
1360    /*          2.終了年月日 (YYYYMMDD 235959)
1361    /*          3.エラー (0 = OK, 1 = NG)
1362    /*-----------------------------------------------------------------*/
1363    // value[0] = 項目名1
1364    // value[1] = 項目名2
1365    // value[2] = start_year
1366    // value[3] = start_month
1367    // value[4] = start_day
1368    // value[5] = end_year
1369    // value[6] = end_month
1370    // value[7] = end_day
1371    public function CHECK_SET_TERM($value)
1372    {
1373        $disp_name1 = $value[0];
1374        $disp_name2 = $value[1];
1375        $keyname1 = $value[2];
1376        $keyname2 = $value[5];
1377
1378        // 期間指定
1379        if (isset($this->arrErr[$keyname1]) || isset($this->arrErr[$keyname2])) {
1380            return;
1381        }
1382
1383        // $this->createParam($value);
1384
1385        $start_year = $this->arrParam[$value[2]];
1386        $start_month = $this->arrParam[$value[3]];
1387        $start_day = $this->arrParam[$value[4]];
1388        $end_year = $this->arrParam[$value[5]];
1389        $end_month = $this->arrParam[$value[6]];
1390        $end_day = $this->arrParam[$value[7]];
1391        if ((strlen($start_year) > 0 || strlen($start_month) > 0 || strlen($start_day) > 0)
1392            && ! checkdate($start_month, $start_day, $start_year)
1393        ) {
1394            $this->arrErr[$keyname1] =
1395                "※ {$disp_name1}を正しく指定してください。<br />";
1396        }
1397        if ((strlen($end_year) > 0 || strlen($end_month) > 0 || strlen($end_day) > 0)
1398            && ! checkdate($end_month, $end_day, $end_year)
1399        ) {
1400            $this->arrErr[$keyname2] =
1401                "※ {$disp_name2}を正しく指定してください。<br />";
1402        }
1403        if ((strlen($start_year) > 0 && strlen($start_month) > 0 && strlen($start_day) > 0)
1404            && (strlen($end_year) > 0 || strlen($end_month) > 0 || strlen($end_day) > 0)
1405        ) {
1406            $date1 = sprintf('%d%02d%02d000000', $start_year, $start_month, $start_day);
1407            $date2 = sprintf('%d%02d%02d235959', $end_year, $end_month, $end_day);
1408
1409            if (($this->arrErr[$keyname1] == '' && $this->arrErr[$keyname2] == '') && $date1 > $date2) {
1410                $this->arrErr[$keyname1] =
1411                    "※ {$disp_name1}と{$disp_name2}の期間指定が不正です。<br />";
1412            }
1413        }
1414    }
1415
1416    /*-----------------------------------------------------------------*/
1417    /*  CHECK_SET_TERM2
1418    /*  年月日時に別れた2つの期間の妥当性をチェックし、整合性と期間を返す
1419    /*  引数 (開始年,開始月,開始日,開始時間,開始分,開始秒,
1420    /*        終了年,終了月,終了日,終了時間,終了分,終了秒)
1421    /*  戻値 array(1,2,3)
1422    /*          1.開始年月日 (YYYYMMDDHHmmss)
1423    /*          2.終了年月日 (YYYYMMDDHHmmss)
1424    /*          3.エラー (0 = OK, 1 = NG)
1425    /*-----------------------------------------------------------------*/
1426    // value[0] = 項目名1
1427    // value[1] = 項目名2
1428    // value[2] = start_year
1429    // value[3] = start_month
1430    // value[4] = start_day
1431    // value[5] = start_hour
1432    // value[6] = start_minute
1433    // value[7] = start_second
1434    // value[8] = end_year
1435    // value[9] = end_month
1436    // value[10] = end_day
1437    // value[11] = end_hour
1438    // value[12] = end_minute
1439    // value[13] = end_second
1440
1441    /*-----------------------------------------------------------------*/
1442    public function CHECK_SET_TERM2($value)
1443    {
1444        $disp_name1 = $value[0];
1445        $disp_name2 = $value[1];
1446        $keyname1 = $value[2];
1447        $keyname2 = $value[8];
1448
1449        // 期間指定
1450        if (isset($this->arrErr[$keyname1]) || isset($this->arrErr[$keyname2])) {
1451            return;
1452        }
1453
1454        // $this->createParam($value);
1455
1456        $start_year = $this->arrParam[$value[2]];
1457        $start_month = $this->arrParam[$value[3]];
1458        $start_day = $this->arrParam[$value[4]];
1459        $start_hour = $this->arrParam[$value[5]];
1460        $start_minute = $this->arrParam[$value[6]];
1461        $start_second = $this->arrParam[$value[7]];
1462        $end_year = $this->arrParam[$value[8]];
1463        $end_month = $this->arrParam[$value[9]];
1464        $end_day = $this->arrParam[$value[10]];
1465        $end_hour = $this->arrParam[$value[11]];
1466        $end_minute = $this->arrParam[$value[12]];
1467        $end_second = $this->arrParam[$value[13]];
1468        if ((strlen($start_year) > 0 || strlen($start_month) > 0 || strlen($start_day) > 0 || strlen($start_hour) > 0)
1469            && ! checkdate($start_month, $start_day, $start_year)
1470        ) {
1471            $this->arrErr[$keyname1] =
1472                "※ {$disp_name1}を正しく指定してください。<br />";
1473        }
1474        if ((strlen($end_year) > 0 || strlen($end_month) > 0 || strlen($end_day) > 0 || strlen($end_hour) > 0)
1475            && ! checkdate($end_month, $end_day, $end_year)
1476        ) {
1477            $this->arrErr[$keyname2] =
1478                "※ {$disp_name2}を正しく指定してください。<br />";
1479        }
1480        if ((strlen($start_year) > 0 && strlen($start_month) > 0 && strlen($start_day) > 0 && strlen($start_hour) > 0)
1481            && (strlen($end_year) > 0 || strlen($end_month) > 0 || strlen($end_day) > 0 || strlen($end_hour) > 0)
1482        ) {
1483            $date1 = sprintf('%d%02d%02d%02d%02d%02d',
1484                $start_year, $start_month, $start_day,
1485                $start_hour, $start_minute, $start_second);
1486            $date2 = sprintf('%d%02d%02d%02d%02d%02d',
1487                $end_year, $end_month, $end_day,
1488                $end_hour, $end_minute, $end_second);
1489
1490            if (($this->arrErr[$keyname1] == '' && $this->arrErr[$keyname2] == '') && $date1 > $date2) {
1491                $this->arrErr[$keyname1] =
1492                    "※ {$disp_name1}と{$disp_name2}の期間指定が不正です。<br />";
1493            }
1494            if ($date1 == $date2) {
1495                $this->arrErr[$keyname1] =
1496                    "※ {$disp_name1}と{$disp_name2}の期間指定が不正です。<br />";
1497            }
1498
1499        }
1500    }
1501
1502    /*-----------------------------------------------------------------*/
1503    /*  CHECK_SET_TERM3
1504    /*  年月に別れた2つの期間の妥当性をチェックし、整合性と期間を返す
1505    /* 引数 (開始年,開始月,終了年,終了月)
1506    /* 戻値 array(1,2,3)
1507    /*          1.開始年月日 (YYYYMMDD 000000)
1508    /*          2.終了年月日 (YYYYMMDD 235959)
1509    /*          3.エラー (0 = OK, 1 = NG)
1510    /*-----------------------------------------------------------------*/
1511    // value[0] = 項目名1
1512    // value[1] = 項目名2
1513    // value[2] = start_year
1514    // value[3] = start_month
1515    // value[4] = end_year
1516    // value[5] = end_month
1517    public function CHECK_SET_TERM3($value)
1518    {
1519        $disp_name1 = $value[0];
1520        $disp_name2 = $value[1];
1521        $keyname1 = $value[2];
1522        $keyname2 = $value[4];
1523
1524        // 期間指定
1525        if (isset($this->arrErr[$keyname1]) || isset($this->arrErr[$keyname2])) {
1526            return;
1527        }
1528
1529        // $this->createParam($value);
1530
1531        $start_year = $this->arrParam[$value[2]];
1532        $start_month = $this->arrParam[$value[3]];
1533        $end_year = $this->arrParam[$value[4]];
1534        $end_month = $this->arrParam[$value[5]];
1535        if ((strlen($start_year) > 0 || strlen($start_month) > 0)
1536            && ! checkdate($start_month, 1, $start_year)
1537        ) {
1538            $this->arrErr[$keyname1] =
1539                "※ {$disp_name1}を正しく指定してください。<br />";
1540        }
1541        if ((strlen($end_year) > 0 || strlen($end_month) > 0)
1542            && ! checkdate($end_month, 1, $end_year)
1543        ) {
1544            $this->arrErr[$keyname2] =
1545                "※ {$disp_name2}を正しく指定してください。<br />";
1546        }
1547        if ((strlen($start_year) > 0 && strlen($start_month) > 0 && (strlen($end_year) > 0 || strlen($end_month) > 0))) {
1548            $date1 = sprintf('%d%02d', $start_year, $start_month);
1549            $date2 = sprintf('%d%02d', $end_year, $end_month);
1550
1551            if (($this->arrErr[$keyname1] == '' && $this->arrErr[$keyname2] == '') && $date1 > $date2) {
1552                $this->arrErr[$keyname1] =
1553                    "※ {$disp_name1}と{$disp_name2}の期間指定が不正です。<br />";
1554            }
1555        }
1556    }
1557
1558    //ディレクトリ存在チェック
1559    public function DIR_CHECK($value)
1560    {
1561        $disp_name = $value[0];
1562        $keyname = $value[1];
1563
1564        if (isset($this->arrErr[$keyname])) {
1565            return;
1566        }
1567
1568        $this->createParam($value);
1569
1570        if (!is_dir($this->arrParam[$keyname])) {
1571            $this->arrErr[$keyname] =
1572                "※ 指定した{$disp_name}は存在しません。<br />";
1573        }
1574    }
1575
1576    // ドメインチェック
1577    public function DOMAIN_CHECK($value)
1578    {
1579        $disp_name = $value[0];
1580        $keyname = $value[1];
1581
1582        if (isset($this->arrErr[$keyname])) {
1583            return;
1584        }
1585
1586        $input_var = $this->arrParam[$keyname];
1587        $pattern = "/^\.[^.]+\..+/i";
1588        if (strlen($input_var) > 0 && !preg_match($pattern, $input_var)) {
1589            $this->arrErr[$keyname] = "※ {$disp_name}の形式が不正です。<br />";
1590        }
1591    }
1592
1593    /* 携帯メールアドレスの判定 */
1594    // メールアドレスを正規表現で判定する
1595    // value[0] = 項目名 value[1] = 判定対象メールアドレス
1596    public function MOBILE_EMAIL_CHECK($value)
1597    {
1598        $disp_name = $value[0];
1599        $keyname = $value[1];
1600
1601        if (isset($this->arrErr[$keyname])) {
1602            return;
1603        }
1604
1605        $this->createParam($value);
1606
1607        $objMobile = new SC_Helper_Mobile_Ex();
1608        $input_var = $this->arrParam[$keyname];
1609        if (strlen($input_var) > 0
1610            &&!$objMobile->gfIsMobileMailAddress($input_var)
1611        ) {
1612            $this->arrErr[$keyname] =
1613                "※ {$disp_name}は携帯電話のものではありません。<br />";
1614        }
1615    }
1616
1617    /**
1618     * CHECK_REGIST_CUSTOMER_EMAIL
1619     *
1620     * メールアドレスが会員登録されているか調べる
1621     * @param array $value value[0] = 項目名 value[1] = 判定対象メールアドレス
1622     * @access public
1623     * @return void
1624     */
1625    public function CHECK_REGIST_CUSTOMER_EMAIL($value)
1626    {
1627        $disp_name = $value[0];
1628        $keyname = $value[1];
1629
1630        if (isset($this->arrErr[$keyname])) {
1631            return;
1632        }
1633
1634        $this->createParam($value);
1635
1636        $register_user_flg = SC_Helper_Customer_Ex::sfCheckRegisterUserFromEmail($this->arrParam[$keyname]);
1637        switch ($register_user_flg) {
1638            case 1:
1639                $this->arrErr[$keyname] .=
1640                    "※ すでに会員登録で使用されている{$disp_name}です。<br />";
1641                break;
1642            case 2:
1643                $this->arrErr[$keyname] .=
1644                    "※ 退会から一定期間の間は、同じ{$disp_name}を使用することはできません。<br />";
1645                break;
1646            default:
1647                break;
1648        }
1649    }
1650
1651    /**
1652     * 禁止文字列のチェック
1653     * value[0] = 項目名 value[1] = 判定対象文字列
1654     * value[2] = 入力を禁止する文字列(配列)
1655     *
1656     * @example $objErr->doFunc(array('URL', 'contents', $arrReviewDenyURL), array('PROHIBITED_STR_CHECK'));
1657     */
1658    public function PROHIBITED_STR_CHECK($value)
1659    {
1660        $disp_name = $value[0];
1661        $keyname = $value[1];
1662        $arrProhibitedStr = $value[2];
1663
1664        if (isset($this->arrErr[$keyname]) || empty($this->arrParam[$keyname])) {
1665            return;
1666        }
1667
1668        $this->createParam($value);
1669
1670        $targetStr     = $this->arrParam[$keyname];
1671        $prohibitedStr = str_replace(array('|', '/'), array('\|', '\/'), $arrProhibitedStr);
1672
1673        $pattern = '/' . join('|', $prohibitedStr) . '/i';
1674        if (preg_match_all($pattern, $targetStr, $matches)) {
1675            $this->arrErr[$keyname] =
1676                "※ {$disp_name}は入力できません。<br />";
1677        }
1678    }
1679
1680    /**
1681     * パラメーターとして適切な文字列かチェックする.
1682     *
1683     * @access private
1684     * @param  array $value [0] => 項目名, [1] => 評価する文字列
1685     * @return void
1686     */
1687    public function EVAL_CHECK($value)
1688    {
1689        $keyname = $value[0];
1690        $input_var = $value[1];
1691
1692        if (isset($this->arrErr[$keyname])) {
1693            return;
1694        }
1695
1696        // $this->createParam($value);
1697
1698        if ($this->evalCheck($input_var) === false) {
1699            $this->arrErr[$keyname] =
1700                "※ {$keyname} の形式が不正です。<br />";
1701        }
1702    }
1703
1704    /**
1705     * パラメーターとして適切な文字列かチェックする.(サブルーチン)
1706     *
1707     * 下記を満たす場合を真とする。
1708     * ・PHPコードとして評価可能であること。
1709     * ・評価した結果がスカラデータ(定数に指定できる値)であること。
1710     * 本メソッドの利用や改訂にあたっては、eval 関数の危険性を意識する必要がある。
1711     * @access private
1712     * @param string 評価する文字列
1713     * @return bool パラメーターとして適切な文字列か
1714     */
1715    public function evalCheck($value)
1716    {
1717        return @eval('return is_scalar(' . $value . ');');
1718    }
1719
1720    /**
1721     * 未定義の $this->arrParam に空要素を代入する.
1722     *
1723     * @access private
1724     * @param  array $value 配列
1725     * @return void
1726     */
1727    public function createParam($value)
1728    {
1729        foreach ($value as $val_key => $key) {
1730            if ($val_key != 0 && (is_string($key) || is_int($key))) {
1731                if (!is_numeric($key) && preg_match('/^[a-z0-9_]+$/i', $key)) {
1732                    if (!isset($this->arrParam[$key])) $this->arrParam[$key] = '';
1733                    if (strlen($this->arrParam[$key]) > 0
1734                          && (preg_match('/^[[:alnum:]\-\_]*[\.\/\\\\]*\.\.(\/|\\\\)/', $this->arrParam[$key]) || !preg_match('/\A[^\x00-\x08\x0b\x0c\x0e-\x1f\x7f]+\z/u', $this->arrParam[$key]))) {
1735                        $this->arrErr[$value[1]] = '※ ' . $value[0] . 'に禁止された記号の並びまたは制御文字が入っています。<br />';
1736                    }
1737                } elseif (preg_match('/[^a-z0-9_]/i', $key)) {
1738                    trigger_error('', E_USER_ERROR);
1739                }
1740            }
1741        }
1742    }
1743
1744    /**
1745     * 値が数字だけかどうかチェックする
1746     *
1747     * @access private
1748     * @param  string  $string チェックする文字列
1749     * @return boolean 値が10進数の数値表現のみの場合 true
1750     */
1751    public function numelicCheck($string)
1752    {
1753        /*
1754         * XXX 10進数の数値表現か否かを調べたいだけだが,
1755         * ctype_digit() は文字列以外 false を返す.
1756         * string ではなく int 型の数値が入る場合がある.
1757         */
1758        $string = (string) $string;
1759
1760        return strlen($string) > 0 && !ctype_digit($string);
1761    }
1762}
Note: See TracBrowser for help on using the repository browser.