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

Revision 23647, 56.2 KB checked in by Seasoft, 10 years ago (diff)

#2635 (無駄な処理を改善する for 2.13.4)

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