0

指定したフォルダーに CSV ファイルをアップロードするコードがありますが、データベースは更新されません。

public function do_upload()
{
    $csv_path = realpath(APPPATH . '/../assets/uploads/CSV/');
    $config['upload_path']   = $csv_path;
    $config['allowed_types'] = '*'; // All types of files allowed
    $config['overwrite']     = true; // Overwrites the existing file

    $this->upload->initialize($config);
    $this->load->library('upload', $config);

    if ( ! $this->upload->do_upload('userfile'))
    {
        $error = array('error' => $this->upload->display_errors());

        $this->layout->buffer('content', 'program/upload', $error);
        $this->layout->render();
    }
    else
    {


        $image_data = $this->upload->data();
        $fname = $image_data['file_name'];
        $fpath = $image_data['file_path'].$fname;
        $fh = fopen($fpath, "r");



        $insert_str = 'INSERT INTO wc_program (JobRef, Area, Parish, AbbrWorkType, WorkType, Timing, TrafficManagement, Location, Duration, Start, Finish) VALUES '."\n";


        if ($fh) {

            // Create each set of values.
            while (($csv_row = fgetcsv($fh, 2000, ',')) !== false) {

                foreach ($csv_row as &$row) {
                    $row = strtr($row, array("'" => "\'", '"' => '\"'));
                }

                $insert_str .= '("'
                    // Implode the array and fix pesky apostrophes.
                    .implode('","', $csv_row)
                    .'"),'."\n";
            }

            // Remove the trailing comma.
            $insert_str = rtrim($insert_str, ",\n");

            // Insert all of the values at once.
            $this->db->set($insert_str);

            echo '<script type="text/javascript">
                        alert("Document successfully uploaded and saved to the database.");
                        location = "program/index";
                </script>';
        } 
        else {
                echo '<script type="text/javascript">
                        alert("Sorry! Something went wrong please proceed to try again.");
                        location = "program/upload";
                </script>';
        } 


    }
}

var_dump($fh); を実行すると それは示しています:タイプ(ストリーム)のリソース(89)

実行すると、次のvar_dump($fpath)ように表示されます。string(66) "/Applications/MAMP/htdocs/site/assets/uploads/CSV/wc_program.csv"

それはすべてアップロードしますが、データベースを更新しないことの何が問題なのですか? 私はあらゆる種類のfopen方法を変更しようとしましたが、それでも喜びはありません.データベースに追加する必要があり、挿入クエリと設定クエリはうまくいくはずですが、そうではありません.

どんな助けでも大歓迎です!

4

1 に答える 1

1

データベースでクエリを実行していません。アクティブ レコード構文と単純なクエリ構文が混在しています。アクティブなレコードの挿入クエリは、呼び出しによって実行されます。

$this->db->insert('my_table');

db::set()実際にはデータベースを照会しません。db::insert()またはdb::update()が呼び出された後に挿入または更新されるキーと値のペアを受け取ります。自分でクエリを作成する場合は、db::query()関数を使用する必要があります。

Active Directoryのドキュメントを確認してください。

を使用できます$this->db->query('put your query here')が、CodeIgniter の組み込みセキュリティの利点が失われます。CodeIgniter のクエリ関数を確認します。

CodeIgniter を使用してデータベースに挿入できる多くの方法のほんの一部の例を示します。例では、コメントからクエリが生成されます。それに応じてコードを調整する必要があります。

例 1 :

$result = $this->db
    ->set('JobRef', 911847)
    ->set('Area', 'Coastal')
    ->set('Parish', 'Yapton')
    ->set('AbbrWorkType', 'Micro')
    ->set('WorkType', 'Micro-Asphalt Surfacing')
    ->set('Timing', 'TBC')
    ->set('TrafficManagement', 'No Positive Traffic Management')
    ->set('Location', 'Canal Road (added PMI 16/07/12)')
    ->set('Duration', '2 days')
    ->set('Start', '0000-00-00')
    ->set('Finish', '0000-00-00') 
    ->insert('wc_program');

echo $this->db->last_query() . "\n\n";
echo "RESULT: \n\n";
print_r($result);

例 2 (連想配列を使用):

$row = array(
    'JobRef' => 911847,
    'Area' => 'Coastal',
    'Parish' => 'Yapton',
    'AbbrWorkType' => 'Micro',
    'WorkType' => 'Micro-Asphalt Surfacing',
    'Timing' => 'TBC',
    'TrafficManagement' => 'No Positive Traffic Management',
    'Location' => 'Canal Road (added PMI 16/07/12)',
    'Duration' => '2 days',
    'Start' => '0000-00-00',
    'Finish' => '0000-00-00'
);
$this->db->insert('wc_program', $row);
// This will do the same thing
// $this->db->set($row);
// $this->db->insert('wc_program');
echo $this->db->last_query();

例 1 と 2 は Active Record を使用しています。情報は 1 つずつ保存され、最後の呼び出しを行うときにクエリが作成されます。これにはいくつかの利点があります。SQL 構文やキーワードの順序を気にすることなく、クエリを動的に作成できます。また、データをエスケープします。

例 3 (単純なクエリ):

$query = 'INSERT INTO 
    wc_program 
        (JobRef, Area, Parish, AbbrWorkType, WorkType, Timing, TrafficManagement, Location, Duration, Start, Finish) 
    VALUES 
        ("911847","Coastal","Yapton","Micro","Micro-Asphalt Surfacing","TBC","No Positive Traffic Management","Canal Road (added PMI 16/07/12)","2 days","0000-00-00","0000-00-00")';
$result = $this->db->query($query);
echo $this->db->last_query() . "\n\n";
echo "RESULT: \n";
print_r($result);

この方法では、インジェクションに対するすべての保護がユーザーに委ねられ、エラーが増える可能性があり、変更/保守が難しくなります。

この方法で行う場合は、次の構文を使用する必要があります。これにより、インジェクションから保護されます。

例 4 :

$query = 'INSERT INTO 
    wc_program 
        (JobRef, Area, Parish, AbbrWorkType, WorkType, Timing, TrafficManagement, Location, Duration, Start, Finish) 
    VALUES 
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);';

$row = array(
    911847,
    'Coastal',
    'Yapton',
    'Micro',
    'Micro-Asphalt Surfacing',
    'TBC',
    'No Positive Traffic Management',
    'Canal Road (added PMI 16/07/12)',
    '2 days',
    '0000-00-00',
    '0000-00-00'
);

$result = $this->db->query($query, $row);
echo $this->db->last_query() . "\n\n";
echo "RESULT: \n";
print_r($result);

CodeIgniter はそれぞれの「?」を置き換えます。エスケープされた後の配列からの対応する値を持つクエリで。これを使用して、配列を更新するだけでデータが異なる同じ形式の多くのクエリを実行でき、$rowCI の組み込みセキュリティを利用できます。

于 2013-04-04T20:10:14.280 に答える