· 9 years ago · Dec 28, 2016, 11:38 AM
1<?php
2 set_time_limit(0);
3
4
5 private $_normalizeChars = array(
6 'Å '=>'S', 'Å¡'=>'s', 'Ã'=>'Dj','Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Ã'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A',
7 'Ã…'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'ÃŒ'=>'I', 'Ã'=>'I', 'ÃŽ'=>'I',
8 'Ã'=>'I', 'Ñ'=>'N', 'Ã’'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U',
9 'Û'=>'U', 'Ü'=>'U', 'Ã'=>'Y', 'Þ'=>'B', 'ß'=>'Ss','à '=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a',
10 'Ã¥'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'Ã'=>'i', 'î'=>'i',
11 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u',
12 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'ƒ'=>'f'
13 );
14
15
16 //CSV TO Database
17 private function toDatabaseKey($var) {
18 $var = utf8_encode($var); //encode pour strtr
19
20 $var = strtr($var, $this->_normalizeChars); //remplace accents
21 $var = preg_replace('/\s+/', '_', $var); //remplace espaces par _
22 $var = preg_replace('/[^\w\d_ -]/si', '', $var); //remplace les autres caractères
23
24 $var = strtolower(utf8_decode($var));
25
26 return $var;
27 }
28
29 private function escape($text)
30 {
31 if (is_int($text) || is_float($text))
32 {
33 return $text;
34 }
35
36 $text = str_replace("'", "''", $text);
37
38 return addcslashes($text, "\000\n\r\\\032");
39 }
40
41 private function CSVToDatabase($csv_path, $db_table_name, $prefix = null, $way = 'REPLACE') {
42
43 $fields = array();
44
45 $table_name = $prefix === null ? $db_table_name : $prefix . '_'. $db_table_name;
46
47 //Could add an option to truncate table first
48 /*$this->execQuery('TRUNCATE #__vehicules_options_id') or die('Impossible de vider la table options_id');*/
49
50 if (($handle = fopen($csv_path, "r")) !== FALSE) {
51 $row = 0;
52 $nb_requetes = 0;
53
54 while (($data = fgetcsv($handle, filesize($csv_path), ";")) !== FALSE) {
55 if ($row == 0)
56 {
57 //Definition des champs
58 $num = count($data);
59
60 for ($c=0; $c < $num; $c++)
61 $fields[$c] = $this->toDatabaseKey($data[$c]);
62
63
64 $sql = "CREATE TABLE IF NOT EXISTS ".$table_name." (id_".$db_table_name." INT not null AUTO_INCREMENT, ";
65
66
67 foreach ($fields as $key => $field)
68 $sql .= $field . " VARCHAR (255) null, ";
69
70 $sql .= " PRIMARY KEY (id_".$db_table_name."))";
71
72
73 $this->execSQL($sql);
74
75 } else {
76
77 $num = count($data);
78
79 $q = " INTO ".$table_name." (";
80
81 foreach ($fields as $key => $value) {
82 $q .= ($key == $num - 1) ? $value . ')' : $value . ', ';
83 }
84
85 $q .= " VALUES (";
86
87 for ($c=0; $c < $num; $c++) {
88
89 $q .= "'".$this->escape(utf8_encode($data[$c]))."'";
90 if($c < $num - 1)
91 $q .= ", ";
92
93 }
94
95 $q .= ($q) ? ');' : '';
96
97 if($q) {
98 if($this->execSQL($way . $q))
99 $nb_requetes++;
100 }
101
102 }
103 $row++;
104 }
105 } else {
106 $this->displayError('Fichier non compatible');
107 }
108
109 unset($data);
110 unset($fields);
111
112 return $nb_requetes;
113 }
114
115
116 private function execSQL($sql) {
117
118 $db = Db::getInstance();
119
120 return $db->Execute($sql);
121 }