Ignore:
Timestamp:
2010/01/22 11:59:55 (11 years ago)
Author:
nanasess
bzr:base-revision:
svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_4-dev:18500
bzr:committer:
Kentaro Ohkouchi <Kentaro_Ohkouchi@lockon.co.jp>
bzr:file-ids:

data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php 15472@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fpages%2Fadmin%2Fproducts%2FLC_Page_Admin_Products_UploadCSV.php
data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php 17047@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Fversion-2%2Fdata%2Fclass%2Fpages%2Fadmin%2Fproducts%2FLC_Page_Admin_Products_UploadCSVCategory.php
bzr:mapping-version:
v4
bzr:repository-uuid:
1e3b908f-19a9-db11-a64c-001125224ba8
bzr:revision-id:
kentaro_ohkouchi@lockon.co.jp-20100122025953-sc9ark00ws992l3f
bzr:revno:
1910
bzr:revprop:branch-nick:
branches/version-2_4-dev
bzr:root:
branches/version-2_4-dev
bzr:text-parents:

data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_4:17941
data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_4-dev:18477
bzr:timestamp:
2010-01-22 11:59:53.355999947 +0900
bzr:user-agent:
bzr2.0.1+bzr-svn1.0.1
svn:original-date:
2010-01-22T02:59:53.356000Z
Message:

CSVアップロードで無限ループの可能性があるのを修正(#566)

Location:
branches/version-2_4-dev
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_4-dev

    • Property bzr:see-revprops set to 18501
  • branches/version-2_4-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php

    r17941 r18501  
    109109                $enc_filepath = SC_Utils_Ex::sfEncodeFile($filepath, 
    110110                                                          CHAR_CODE, CSV_TEMP_DIR); 
     111                $fp = fopen($enc_filepath, "r"); 
     112 
     113                // 無効なファイルポインタが渡された場合はエラー表示 
     114                if ($fp === false) { 
     115                    SC_Utils_Ex::sfDispError(""); 
     116                } 
    111117 
    112118                // レコード数を得る 
    113                 $rec_count = $this->lfCSVRecordCount($enc_filepath); 
    114  
    115                 $fp = fopen($enc_filepath, "r"); 
     119                $rec_count = $this->lfCSVRecordCount($fp); 
     120 
    116121                $line = 0;      // 行数 
    117122                $regist = 0;    // 登録数 
     
    490495     * CSVのカウント数を得る. 
    491496     * 
    492      * @param string $file_name ファイルパス 
     497     * @param resource $fp fopenを使用して作成したファイルポインタ 
    493498     * @return integer CSV のカウント数 
    494499     */ 
    495     function lfCSVRecordCount($file_name) { 
     500    function lfCSVRecordCount($fp) { 
    496501 
    497502        $count = 0; 
    498         $fp = fopen($file_name, "r"); 
    499503        while(!feof($fp)) { 
    500504            $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
    501505            $count++; 
    502506        } 
    503  
    504         return $count-1; 
     507        // ファイルポインタを戻す 
     508        if (rewind($fp)) { 
     509            return $count-1; 
     510        } else { 
     511            SC_Utils_Ex::sfDispError(""); 
     512        } 
    505513    } 
    506514 
  • branches/version-2_4-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php

    r18477 r18501  
    106106                    CHAR_CODE, CSV_TEMP_DIR); 
    107107 
     108                    $fp = fopen($enc_filepath, "r"); 
     109 
     110                    // 無効なファイルポインタが渡された場合はエラー表示 
     111                    if ($fp === false) { 
     112                        SC_Utils_Ex::sfDispError(""); 
     113                    } 
     114 
    108115                    // レコード数を得る 
    109                     $rec_count = $this->lfCSVRecordCount($enc_filepath); 
    110                     $fp = fopen($enc_filepath, "r"); 
    111  
    112                     if ($rec_count === false || $fp === false) { 
    113                         $err = false; 
    114                         $arrErr['bad_file_pointer'] = "※ 不正なファイルポインタが検出されました"; 
    115                     } 
     116                    $rec_count = $this->lfCSVRecordCount($fp); 
    116117 
    117118                    $line = 0;      // 行数 
     
    122123 
    123124                    echo "■ CSV登録進捗状況 <br/><br/>\n"; 
    124                     if ($fp !== false) { 
    125                         while (!feof($fp) && !$err) { 
    126                             $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
    127  
    128                             // 行カウント 
    129                             $line++; 
    130  
    131                             if ($line <= 1) { 
    132                                 continue; 
     125                    while (!feof($fp) && !$err) { 
     126                        $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
     127 
     128                        // 行カウント 
     129                        $line++; 
     130 
     131                        if ($line <= 1) { 
     132                            continue; 
     133                        } 
     134 
     135                        // 項目数カウント 
     136                        $max = count($arrCSV); 
     137 
     138                        // 項目数が1以下の場合は無視する 
     139                        if ($max <= 1) { 
     140                            continue; 
     141                        } 
     142 
     143                        // 項目数チェック 
     144                        if ($max != $colmax) { 
     145                            echo "※ 項目数が" . $max . "個検出されました。項目数は" . $colmax . "個になります。</br>\n"; 
     146                            $err = true; 
     147                        } else { 
     148                            // シーケンス配列を格納する。 
     149                            $this->objFormParam->setParam($arrCSV, true); 
     150                            $arrRet = $this->objFormParam->getHashArray(); 
     151                            $this->objFormParam->setParam($arrRet); 
     152                            // 入力値の変換 
     153                            $this->objFormParam->convParam(); 
     154                            // <br>なしでエラー取得する。 
     155                            $arrCSVErr = $this->lfCheckError(); 
     156                        } 
     157 
     158                        // 入力エラーチェック 
     159                        if (count($arrCSVErr) > 0) { 
     160                            echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\n"; 
     161                            foreach($arrCSVErr as $val) { 
     162                                $this->printError($val); 
    133163                            } 
    134  
    135                             // 項目数カウント 
    136                             $max = count($arrCSV); 
    137  
    138                             // 項目数が1以下の場合は無視する 
    139                             if ($max <= 1) { 
    140                                 continue; 
    141                             } 
    142  
    143                             // 項目数チェック 
    144                             if ($max != $colmax) { 
    145                                 echo "※ 項目数が" . $max . "個検出されました。項目数は" . $colmax . "個になります。</br>\n"; 
    146                                 $err = true; 
    147                             } else { 
    148                                 // シーケンス配列を格納する。 
    149                                 $this->objFormParam->setParam($arrCSV, true); 
    150                                 $arrRet = $this->objFormParam->getHashArray(); 
    151                                 $this->objFormParam->setParam($arrRet); 
    152                                 // 入力値の変換 
    153                                 $this->objFormParam->convParam(); 
    154                                 // <br>なしでエラー取得する。 
    155                                 $arrCSVErr = $this->lfCheckError(); 
    156                             } 
    157  
    158                             // 入力エラーチェック 
    159                             if (count_chars(string[, int mode])($arrCSVErr) > 0) { 
    160                                 echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\n"; 
    161                                 foreach($arrCSVErr as $val) { 
    162                                     $this->printError($val); 
    163                                 } 
    164                                 $err = true; 
    165                             } 
    166  
    167                             if (!$err) { 
    168                                 $this->lfRegistProduct($objQuery, $rec_count, $line); 
    169                                 $regist++; 
    170                             } 
    171                             $arrParam = $this->objFormParam->getHashArray(); 
    172  
    173                             if (!$err) echo $line." / ".$rec_count. "行目 (カテゴリID:".$arrParam['category_id']." / カテゴリ名:".$arrParam['category_name'].")\n<br />"; 
    174                             flush(); 
    175                         } 
    176                         fclose($fp); 
     164                            $err = true; 
     165                        } 
     166 
     167                        if (!$err) { 
     168                            $this->lfRegistProduct($objQuery, $rec_count, $line); 
     169                            $regist++; 
     170                        } 
     171                        $arrParam = $this->objFormParam->getHashArray(); 
     172 
     173                        if (!$err) echo $line." / ".$rec_count. "行目 (カテゴリID:".$arrParam['category_id']." / カテゴリ名:".$arrParam['category_name'].")\n<br />"; 
     174                        flush(); 
    177175                    } 
     176                    fclose($fp); 
    178177 
    179178                    if (!$err) { 
     
    344343     * CSVのカウント数を得る. 
    345344     * 
    346      * @param string $file_name ファイルパス 
    347      * @return mixed CSV のカウント数; $file_name が無効な場合は false 
    348      */ 
    349     function lfCSVRecordCount($file_name) { 
     345     * @param resource $fp fopenを使用して作成したファイルポインタ 
     346     * @return integer CSV のカウント数 
     347     */ 
     348    function lfCSVRecordCount($fp) { 
    350349        $count = 0; 
    351         $fp = fopen($file_name, "r"); 
    352         if ($fp !== false) { 
    353             while(!feof($fp)) { 
    354                 $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
    355                 $count++; 
    356             } 
    357         } else { 
    358             return false; 
    359         } 
    360         return $count-1; 
     350        while(!feof($fp)) { 
     351            $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
     352            $count++; 
     353        } 
     354        // ファイルポインタを戻す 
     355        if (rewind($fp)) { 
     356            return $count-1; 
     357        } else { 
     358            SC_Utils_Ex::sfDispError(""); 
     359        } 
    361360    } 
    362361 
Note: See TracChangeset for help on using the changeset viewer.