source: branches/comu-ver2/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php @ 18508

Revision 18508, 22.7 KB checked in by nanasess, 12 years ago (diff)

r18501 merged

  • CSVアップロードで無限ループの可能性があるのを修正(#566)
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id Revision Date
  • 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-2007 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// {{{ requires
25require_once(CLASS_PATH . "pages/LC_Page.php");
26
27/**
28 * 商品登録CSVのページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id:LC_Page_Admin_Products_UploadCSV.php 15532 2007-08-31 14:39:46Z nanasess $
33 *
34 * FIXME 同一商品IDで商品規格違いを登録できない。(更新は可能)
35 */
36class LC_Page_Admin_Products_UploadCSV extends LC_Page {
37
38    // }}}
39    // {{{ functions
40
41    /** フォームパラメータ */
42    var $objFormParam;
43
44    /** SC_UploadFile インスタンス */
45    var $objUpfile;
46
47    /**
48     * Page を初期化する.
49     *
50     * @return void
51     */
52    function init() {
53        parent::init();
54        $this->tpl_mainpage = 'products/upload_csv.tpl';
55        $this->tpl_subnavi = 'products/subnavi.tpl';
56        $this->tpl_mainno = 'products';
57        $this->tpl_subno = 'upload_csv';
58        $this->tpl_subtitle = '商品登録CSV';
59    }
60
61    /**
62     * Page のプロセス.
63     *
64     * @return void
65     */
66    function process() {
67        $conn = new SC_DBConn();
68        $objView = new SC_AdminView();
69        $objSess = new SC_Session();
70        $objDb = new SC_Helper_DB_Ex();
71
72        // 認証可否の判定
73        SC_Utils_Ex::sfIsSuccess($objSess);
74
75        // ファイル管理クラス
76        $this->objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR);
77        // ファイル情報の初期化
78        $this->lfInitFile();
79        // パラメータ管理クラス
80        $this->objFormParam = new SC_FormParam();
81        // パラメータ情報の初期化
82        $this->lfInitParam();
83        $colmax = $this->objFormParam->getCount();
84        $this->objFormParam->setHtmlDispNameArray();
85        $this->arrTitle = $this->objFormParam->getHtmlDispNameArray();
86
87        if (!isset($_POST['mode'])) $_POST['mode'] = "";
88
89        switch($_POST['mode']) {
90        case 'csv_upload':
91            $err = false;
92            // エラーチェック
93            $arrErr['csv_file'] = $this->objUpFile->makeTempFile('csv_file');
94
95            if($arrErr['csv_file'] == "") {
96                $arrErr = $this->objUpFile->checkEXISTS();
97            }
98
99            // 実行時間を制限しない
100            set_time_limit(0);
101
102            // 出力をバッファリングしない(==日本語自動変換もしない)
103            ob_end_clean();
104
105            // IEのために256バイト空文字出力
106            echo str_pad('',256);
107
108            if(empty($arrErr['csv_file'])) {
109                // 一時ファイル名の取得
110                $filepath = $this->objUpFile->getTempFilePath('csv_file');
111                // エンコード
112                $enc_filepath = SC_Utils_Ex::sfEncodeFile($filepath,
113                                                          CHAR_CODE, CSV_TEMP_DIR);
114                $fp = fopen($enc_filepath, "r");
115
116                // 無効なファイルポインタが渡された場合はエラー表示
117                if ($fp === false) {
118                    SC_Utils_Ex::sfDispError("");
119                }
120
121                // レコード数を得る
122                $rec_count = $this->lfCSVRecordCount($fp);
123
124                $line = 0;      // 行数
125                $regist = 0;    // 登録数
126
127                $objQuery = new SC_Query();
128                $objQuery->begin();
129
130                echo "■ CSV登録進捗状況 <br/><br/>\n";
131
132                while(!feof($fp) && !$err) {
133                    $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
134
135                    // 行カウント
136                    $line++;
137
138                    if($line <= 1) {
139                        continue;
140                    }
141
142                    // 項目数カウント
143                    $max = count($arrCSV);
144
145                    // 項目数が1以下の場合は無視する
146                    if($max <= 1) {
147                        continue;
148                    }
149
150                    // 項目数チェック
151                    if($max != $colmax) {
152                        echo "※ 項目数が" . $max . "個検出されました。項目数は" . $colmax . "個になります。</br>\n";
153                        $err = true;
154                    } else {
155                        // シーケンス配列を格納する。
156                        $this->objFormParam->setParam($arrCSV, true);
157                        $arrRet = $this->objFormParam->getHashArray();
158                        $this->objFormParam->setParam($arrRet);
159                        // 入力値の変換
160                        $this->objFormParam->convParam();
161                        // <br>なしでエラー取得する。
162                        $arrCSVErr = $this->lfCheckError();
163                    }
164
165                    // 入力エラーチェック
166                    if(count($arrCSVErr) > 0) {
167                        echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\n";
168                        foreach($arrCSVErr as $val) {
169                            $this->printError($val);
170                        }
171                        $err = true;
172                    }
173
174                    if(!$err) {
175                        $this->lfRegistProduct($objQuery, $line);
176                        $regist++;
177                    }
178                    $arrParam = $this->objFormParam->getHashArray();
179
180                    if(!$err) echo $line." / ".$rec_count. "行目 (商品ID:".$arrParam['product_id']." / 商品名:".$arrParam['name'].")\n<br />";
181                    flush();
182                }
183                fclose($fp);
184
185                if(!$err) {
186                    $objQuery->commit();
187                    echo "■" . $regist . "件のレコードを登録しました。";
188                    // 商品件数カウント関数の実行
189                    $objDb->sfCategory_Count($objQuery);
190                    $objDb->sfMaker_Count($objQuery);
191                } else {
192                    $objQuery->rollback();
193                }
194            } else {
195                foreach($arrErr as $val) {
196                    $this->printError($val);
197                }
198            }
199            echo "<br/><a href=\"javascript:window.close()\">→閉じる</a>";
200            flush();
201            exit;
202            break;
203        default:
204            break;
205        }
206
207        $objView->assignobj($this);
208        $objView->display(MAIN_FRAME);
209    }
210
211    /**
212     * デストラクタ.
213     *
214     * @return void
215     */
216    function destroy() {
217        parent::destroy();
218    }
219
220
221    /**
222     * ファイル情報の初期化を行う.
223     *
224     * @return void
225     */
226    function lfInitFile() {
227        $this->objUpFile->addFile("CSVファイル", 'csv_file', array('csv'),
228                                  CSV_SIZE, true, 0, 0, false);
229    }
230
231    /**
232     * 入力情報の初期化を行う.
233     *
234     * @return void
235     */
236    function lfInitParam() {
237       
238        // 商品ステータスの上限文字数の算出
239        $masterData = new SC_DB_MasterData_Ex();
240        $arrSTATUS = $masterData->getMasterData("mtb_status");
241        $product_flag_maxlen = max(array_keys($arrSTATUS));
242        unset($arrSTATUS);
243        unset($masterData);
244
245        $this->objFormParam->addParam("商品ID", "product_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
246        $this->objFormParam->addParam("商品規格ID", "product_class_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
247
248        $this->objFormParam->addParam("規格名1", "dummy1");
249        $this->objFormParam->addParam("規格名2", "dummy2");
250
251        $this->objFormParam->addParam("商品名", "name", STEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK"));
252        $this->objFormParam->addParam("公開フラグ(1:公開 2:非公開)", "status", INT_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
253        $this->objFormParam->addParam("商品ステータス", "product_flag", $product_flag_maxlen, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
254        $this->objFormParam->addParam("商品コード", "product_code", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
255        $this->objFormParam->addParam(NORMAL_PRICE_TITLE, "price01", PRICE_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
256        $this->objFormParam->addParam(SALE_PRICE_TITLE, "price02", PRICE_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
257        $this->objFormParam->addParam("在庫数", "stock", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
258        $this->objFormParam->addParam("送料", "deliv_fee", PRICE_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
259        $this->objFormParam->addParam("ポイント付与率", "point_rate", PERCENTAGE_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
260        $this->objFormParam->addParam("購入制限", "sale_limit", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
261        $this->objFormParam->addParam("メーカーURL", "comment1", URL_LEN, "KVa", array("SPTAB_CHECK","URL_CHECK","MAX_LENGTH_CHECK"));
262        $this->objFormParam->addParam("検索ワード", "comment3", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
263        $this->objFormParam->addParam("備考欄(SHOP専用)", "note", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
264        $this->objFormParam->addParam("一覧-メインコメント", "main_list_comment", MTEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK"));
265        $this->objFormParam->addParam("一覧-メイン画像", "main_list_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
266        $this->objFormParam->addParam("メインコメント", "main_comment", LLTEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK"));
267        $this->objFormParam->addParam("メイン画像", "main_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
268        $this->objFormParam->addParam("メイン拡大画像", "main_large_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
269        $this->objFormParam->addParam("カラー比較画像", "file1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
270        $this->objFormParam->addParam("商品詳細ファイル", "file2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
271        $this->objFormParam->addParam("詳細-サブタイトル(1)", "sub_title1", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
272        $this->objFormParam->addParam("詳細-サブコメント(1)", "sub_comment1", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
273        $this->objFormParam->addParam("詳細-サブ画像(1)", "sub_image1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
274        $this->objFormParam->addParam("詳細-サブ拡大画像(1)", "sub_large_image1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
275
276        $this->objFormParam->addParam("詳細-サブタイトル(2)", "sub_title2", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
277        $this->objFormParam->addParam("詳細-サブコメント(2)", "sub_comment2", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
278        $this->objFormParam->addParam("詳細-サブ画像(2)", "sub_image2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
279        $this->objFormParam->addParam("詳細-サブ拡大画像(2)", "sub_large_image2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
280
281        $this->objFormParam->addParam("詳細-サブタイトル(3)", "sub_title3", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
282        $this->objFormParam->addParam("詳細-サブコメント(3)", "sub_comment3", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
283        $this->objFormParam->addParam("詳細-サブ画像(3)", "sub_image3", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
284        $this->objFormParam->addParam("詳細-サブ拡大画像(3)", "sub_large_image3", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
285
286        $this->objFormParam->addParam("詳細-サブタイトル(4)", "sub_title4", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
287        $this->objFormParam->addParam("詳細-サブコメント(4)", "sub_comment4", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
288        $this->objFormParam->addParam("詳細-サブ画像(4)", "sub_image4", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
289        $this->objFormParam->addParam("詳細-サブ拡大画像(4)", "sub_large_image4", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
290
291        $this->objFormParam->addParam("詳細-サブタイトル(5)", "sub_title5", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
292        $this->objFormParam->addParam("詳細-サブコメント(5)", "sub_comment5", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
293        $this->objFormParam->addParam("詳細-サブ画像(5)", "sub_image5", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
294        $this->objFormParam->addParam("詳細-サブ拡大画像(5)", "sub_large_image5", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
295
296        $this->objFormParam->addParam("発送日目安", "deliv_date_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
297
298        for ($cnt = 1; $cnt <= RECOMMEND_PRODUCT_MAX; $cnt++) {
299            $this->objFormParam->addParam("関連商品($cnt)", "recommend_product_id$cnt", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
300            $this->objFormParam->addParam("関連商品コメント($cnt)", "recommend_comment$cnt", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
301        }
302
303        $this->objFormParam->addParam("商品カテゴリ", "category_id", STEXT_LEN, "n", array("EXIST_CHECK", "SPTAB_CHECK"));
304    }
305
306    /**
307     * 商品登録を行う.
308     *
309     * @param SC_Query $objQuery SC_Queryインスタンス
310     * @param string|integer $line 処理中の行数
311     * @return void
312     */
313    function lfRegistProduct($objQuery, $line = "") {
314
315        $objDb = new SC_Helper_DB_Ex();
316
317        $arrRet = $this->objFormParam->getHashArray();
318
319        // dtb_products以外に登録される値を除外する。
320        foreach($arrRet as $key => $val) {
321            switch($key) {
322            case 'product_code':
323            case 'price01':
324            case 'price02':
325            case 'stock':
326            case 'product_class_id':
327            case 'recommend_product_id1':
328            case 'recommend_product_id2':
329            case 'recommend_product_id3':
330            case 'recommend_product_id4':
331            case 'recommend_product_id5':
332            case 'recommend_product_id6':
333            case 'recommend_comment1':
334            case 'recommend_comment2':
335            case 'recommend_comment3':
336            case 'recommend_comment4':
337            case 'recommend_comment5':
338            case 'recommend_comment6':
339            case 'category_id':
340                break;
341            default:
342                if(!ereg("^dummy", $key)) {
343                    $sqlval[$key] = $val;
344                }
345                break;
346            }
347        }
348
349        // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう)
350        $time = date("Y-m-d H:i:s");
351        // 秒以下を生成
352        if($line != "") {
353            $microtime = sprintf("%06d", $line);
354            $time .= ".$microtime";
355        }
356        $sqlval['update_date'] = $time;
357        $sqlval['creator_id'] = $_SESSION['member_id'];
358
359        if($sqlval['status'] == "") {
360            $sqlval['status'] = 2;
361        }
362
363        if($sqlval['product_id'] != "") {
364
365            // UPDATEの実行
366            $where = "product_id = ?";
367            $objQuery->update("dtb_products", $sqlval, $where, array($sqlval['product_id']));
368           
369            $product_id = $sqlval['product_id'];
370        } else {
371            // 新規登録
372
373            unset($sqlval['product_id']);
374            $sqlval['create_date'] = $time;
375           
376            // INSERTの実行
377            $objQuery->insert("dtb_products", $sqlval);
378           
379            $product_id = $objQuery->currval("dtb_products","product_id");
380        }
381
382        // カテゴリ登録
383        $arrCategory_id = explode("|", $arrRet["category_id"]);
384        $objDb->updateProductCategories($arrCategory_id, $product_id);
385
386        // 規格登録
387        $this->lfRegistProductClass($objQuery, $arrRet, $product_id, $arrRet['product_class_id']);
388
389        // 関連商品登録
390        $objQuery->delete("dtb_recommend_products", "product_id = ?", array($product_id));
391        for($i = 1; $i <= RECOMMEND_PRODUCT_MAX; $i++) {
392            $keyname = "recommend_product_id" . $i;
393            $comment_key = "recommend_comment" . $i;
394            if($arrRet[$keyname] != "") {
395                $arrProduct = $objQuery->select("product_id", "dtb_products", "product_id = ?", array($arrRet[$keyname]));
396                if($arrProduct[0]['product_id'] != "") {
397                    $arrval['product_id'] = $product_id;
398                    $arrval['recommend_product_id'] = $arrProduct[0]['product_id'];
399                    $arrval['comment'] = $arrRet[$comment_key];
400                    $arrval['update_date'] = "Now()";
401                    $arrval['create_date'] = "Now()";
402                    $arrval['creator_id'] = $_SESSION['member_id'];
403                    $arrval['rank'] = RECOMMEND_PRODUCT_MAX - $i + 1;
404                    $objQuery->insert("dtb_recommend_products", $arrval);
405                }
406            }
407        }
408    }
409
410    /**
411     * 商品規格登録を行う.
412     *
413     * @param SC_Query $objQuery SC_Queryインスタンス
414     * @param array $arrList 商品規格情報配列
415     * @param integer $product_id 商品ID
416     * @param integer $product_class_id 商品規格ID
417     * @return void
418     */
419    function lfRegistProductClass($objQuery, $arrList, $product_id, $product_class_id) {
420        $sqlval['product_code'] = $arrList["product_code"];
421        $sqlval['stock'] = $arrList["stock"];
422        if($sqlval['stock'] == "") {
423            $sqlval['stock_unlimited'] = '1';
424        } else {
425            $sqlval['stock_unlimited'] = '0';
426        }
427        $sqlval['price01'] = $arrList['price01'];
428        $sqlval['price02'] = $arrList['price02'];
429        $sqlval['creator_id'] = $_SESSION['member_id'];
430
431        // TODO $sqlval['member_id'] は何処から出てくる?
432        if($sqlval['member_id'] == "") {
433            $sqlval['creator_id'] = '0';
434        }
435
436        if($product_class_id == "") {
437            // 新規登録
438            $where = "product_id = ?";
439            // 念のために既存の規格を削除
440            $objQuery->delete("dtb_products_class", $where, array($product_id));
441            $sqlval['product_id'] = $product_id;
442            $sqlval['classcategory_id1'] = '0';
443            $sqlval['classcategory_id2'] = '0';
444            $sqlval['create_date'] = "now()";
445            $objQuery->insert("dtb_products_class", $sqlval);
446        } else {
447            // 既存編集
448            $where = "product_id = ? AND product_class_id = ?";
449            $objQuery->update("dtb_products_class", $sqlval, $where, array($product_id, $product_class_id));
450        }
451    }
452
453    /**
454     * 入力チェックを行う.
455     *
456     * @return void
457     */
458    function lfCheckError() {
459
460        // 入力データを渡す。
461        $arrRet =  $this->objFormParam->getHashArray();
462        $objErr = new SC_CheckError($arrRet);
463        $objErr->arrErr = $this->objFormParam->checkError(false);
464
465        if(count($objErr->arrErr) == 0) {
466            $objQuery = new SC_Query();
467            // 商品ID、規格IDの存在チェック
468            if($arrRet['product_id'] != "") {
469                $count = $objQuery->count("dtb_products", "product_id = ?", array($arrRet['product_id']));
470                if($count == 0) {
471                    $objErr->arrErr['product_id'] = "※ 指定の商品IDは、登録されていません。";
472                }
473            }
474
475            if($arrRet['product_class_id'] != "") {
476                $count = 0;
477                if($arrRet['product_id'] != "") {
478                    $count = $objQuery->count("dtb_products_class", "product_id = ? AND product_class_id = ?", array($arrRet['product_id'], $arrRet['product_class_id']));
479                }
480                if($count == 0) {
481                    $objErr->arrErr['product_class_id'] = "※ 指定の規格IDは、登録されていません。";
482                }
483            }
484
485            // 存在するカテゴリIDかチェック
486            $arrCategory_id = explode("|", $arrRet['category_id']);
487            foreach ($arrCategory_id as $category_id) {
488                $count = $objQuery->count("dtb_category", "category_id = ?", array($category_id));
489                if($count == 0) {
490                    $objErr->arrErr['product_id'] = "※ 指定のカテゴリIDは、登録されていません。";
491                }
492            }
493        }
494        return $objErr->arrErr;
495    }
496
497    /**
498     * CSVのカウント数を得る.
499     *
500     * @param resource $fp fopenを使用して作成したファイルポインタ
501     * @return integer CSV のカウント数
502     */
503    function lfCSVRecordCount($fp) {
504
505        $count = 0;
506        while(!feof($fp)) {
507            $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
508            $count++;
509        }
510        // ファイルポインタを戻す
511        if (rewind($fp)) {
512            return $count-1;
513        } else {
514            SC_Utils_Ex::sfDispError("");
515        }
516    }
517
518    /**
519     * 引数の文字列をエラー出力する.
520     *
521     * 引数 $val の内容は, htmlspecialchars() によってサニタイズされる
522     *
523     * @param string $val 出力する文字列
524     * @return void
525     */
526    function printError($val) {
527         echo "<font color=\"red\">"
528             . htmlspecialchars($val, ENT_QUOTES)
529             . "</font></br>\n";
530    }
531}
532?>
Note: See TracBrowser for help on using the repository browser.