2013-04-04 4 views
0

У меня есть код, который загружает CSV-файл в указанную папку, но он не обновляет базу данных.Codeigniter CSV upload then explode

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, но до сих пор не радуюсь, мне действительно нужно его добавить в базу данных, а запрос на ввод и задание запроса должно сделать трюк, но это не так.

Любая помощь очень ценится!

+0

У вас установлен 'db_debug'' TRUE' в 'config/database.php'? В нем будут отображаться ошибки базы данных. Вы также можете попробовать выполнить эхо-запрос '$ this-> db-> last_query()', чтобы увидеть последний запрошенный запрос. –

ответ

1

У вас нет запросов к базе данных. Вы смешиваете активный синтаксис записи с простым синтаксисом запроса. Запрос активной записи вставки будет выполнен путем вызова.

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

db::set() фактически не запрос к базе данных. Он принимает пару ключ/значение, которая будет вставлена ​​или обновлена ​​после вызова db::insert() или db::update(). Если вы сами создаете запрос, вам нужно использовать функцию db::query().

Отзыв active directory documentation.

Вы можете использовать $this->db->query('put your query here'), но вы потеряете преимущество встроенной безопасности CodeIgniter. Обзор CodeIgniter's query функции.

Я приведу вам примеры нескольких способов, которые вы можете вставить в базу данных с помощью 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 (используя ассоциативный массив):

Пример 1 и 2 используют Active Record. Информация хранится по частям, и затем запрос строится, когда вы делаете окончательный вызов. Это имеет ряд преимуществ. Он позволяет создавать запросы динамически, не беспокоясь о синтаксисе SQL и порядке ключевых слов. Это также ускользает от ваших данных.

Пример 3 (Simple Query):

$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 заменит каждый "?" в запросе с соответствующим значением из массива после его экранирования. Вы можете использовать это для запуска многих запросов, имеющих одну и ту же форму, но имеющих разные данные, просто обновляя массив $row и извлекайте выгоду из встроенной безопасности CI.

+0

$ this-> db-> query() отбрасывает назад и говорит о том, что мне нужно использовать set и $ this-> db-> insert() также указывает, что вы должны использовать метод set для обновления записи. –

+0

Итак, чтобы уточнить, что он загружает файл, но на самом деле не вставляет/не обновляет базу данных, это похоже на то, что он не читает csv или запрос неверен. –

+0

Сделал var_dump прямо после последнего запроса, и я получаю следующее: string (269504) «INSERT INTO wc_program (JobRef, Area, Parish, AbbrWorkType, WorkType, Timing, TrafficManagement, Location, Duration, Start, Finish) VALUES (" 911847 " «Побережье», «Яптон», «Микро», «Микро-асфальтовое покрытие», «ТПК», «Без положительного управления трафиком», «Канал-роуд (добавлено PMI 16/07/12)», «2 дня», "0000-00-00", "0000-00-00 .... blah blah blah слишком большой файл, чтобы опубликовать его все, но запрос на вставку есть –