|
9 | 9 |
|
10 | 10 | use PhpMyAdmin\DatabaseInterface; |
11 | 11 | use PhpMyAdmin\Dbal\Connection; |
| 12 | +use PhpMyAdmin\Dbal\ResultInterface; |
12 | 13 | use PhpMyAdmin\Plugins\ExportPlugin; |
13 | 14 | use PhpMyAdmin\Properties\Options\Groups\OptionsPropertyMainGroup; |
14 | 15 | use PhpMyAdmin\Properties\Options\Groups\OptionsPropertyRootGroup; |
|
18 | 19 | use PhpMyAdmin\Properties\Plugins\ExportPluginProperties; |
19 | 20 |
|
20 | 21 | use function __; |
| 22 | +use function implode; |
21 | 23 | use function mb_strtolower; |
22 | | -use function mb_substr; |
23 | 24 | use function preg_replace; |
24 | 25 | use function str_replace; |
25 | | -use function trim; |
26 | 26 |
|
27 | 27 | use const PHP_EOL; |
28 | 28 |
|
@@ -214,115 +214,112 @@ public function exportData( |
214 | 214 | ): bool { |
215 | 215 | $GLOBALS['what'] = $GLOBALS['what'] ?? null; |
216 | 216 | $GLOBALS['csv_terminated'] = $GLOBALS['csv_terminated'] ?? null; |
217 | | - $GLOBALS['csv_separator'] = $GLOBALS['csv_separator'] ?? null; |
| 217 | + $GLOBALS['csv_separator'] = $GLOBALS['csv_separator'] ?? ''; |
218 | 218 | $GLOBALS['csv_enclosed'] = $GLOBALS['csv_enclosed'] ?? null; |
219 | 219 | $GLOBALS['csv_escaped'] = $GLOBALS['csv_escaped'] ?? null; |
220 | 220 |
|
221 | 221 | $db_alias = $db; |
222 | 222 | $table_alias = $table; |
223 | 223 | $this->initAlias($aliases, $db_alias, $table_alias); |
224 | 224 |
|
225 | | - // Gets the data from the database |
| 225 | + /** |
| 226 | + * Gets the data from the database |
| 227 | + * |
| 228 | + * @var ResultInterface $result |
| 229 | + * @psalm-ignore-var |
| 230 | + */ |
226 | 231 | $result = $GLOBALS['dbi']->query( |
227 | 232 | $sqlQuery, |
228 | 233 | Connection::TYPE_USER, |
229 | 234 | DatabaseInterface::QUERY_UNBUFFERED |
230 | 235 | ); |
231 | | - $fields_cnt = $result->numFields(); |
232 | 236 |
|
233 | 237 | // If required, get fields name at the first line |
234 | 238 | if (isset($GLOBALS['csv_columns']) && $GLOBALS['csv_columns']) { |
235 | | - $schema_insert = ''; |
| 239 | + $insertFields = []; |
236 | 240 | foreach ($result->getFieldNames() as $col_as) { |
237 | 241 | if (! empty($aliases[$db]['tables'][$table]['columns'][$col_as])) { |
238 | 242 | $col_as = $aliases[$db]['tables'][$table]['columns'][$col_as]; |
239 | 243 | } |
240 | 244 |
|
241 | 245 | if ($GLOBALS['csv_enclosed'] == '') { |
242 | | - $schema_insert .= $col_as; |
| 246 | + $insertFields[] = $col_as; |
243 | 247 | } else { |
244 | | - $schema_insert .= $GLOBALS['csv_enclosed'] |
| 248 | + $insertFields[] = $GLOBALS['csv_enclosed'] |
245 | 249 | . str_replace( |
246 | 250 | $GLOBALS['csv_enclosed'], |
247 | 251 | $GLOBALS['csv_escaped'] . $GLOBALS['csv_enclosed'], |
248 | 252 | $col_as |
249 | 253 | ) |
250 | 254 | . $GLOBALS['csv_enclosed']; |
251 | 255 | } |
252 | | - |
253 | | - $schema_insert .= $GLOBALS['csv_separator']; |
254 | 256 | } |
255 | 257 |
|
256 | | - $schema_insert = trim(mb_substr($schema_insert, 0, -1)); |
| 258 | + $schema_insert = implode($GLOBALS['csv_separator'], $insertFields); |
257 | 259 | if (! $this->export->outputHandler($schema_insert . $GLOBALS['csv_terminated'])) { |
258 | 260 | return false; |
259 | 261 | } |
260 | 262 | } |
261 | 263 |
|
262 | 264 | // Format the data |
263 | 265 | while ($row = $result->fetchRow()) { |
264 | | - $schema_insert = ''; |
265 | | - for ($j = 0; $j < $fields_cnt; $j++) { |
266 | | - if (! isset($row[$j])) { |
267 | | - $schema_insert .= $GLOBALS[$GLOBALS['what'] . '_null']; |
268 | | - } elseif ($row[$j] == '0' || $row[$j] != '') { |
| 266 | + $insertValues = []; |
| 267 | + foreach ($row as $field) { |
| 268 | + if ($field === null) { |
| 269 | + $insertValues[] = $GLOBALS[$GLOBALS['what'] . '_null']; |
| 270 | + } elseif ($field !== '') { |
269 | 271 | // always enclose fields |
270 | 272 | if ($GLOBALS['what'] === 'excel') { |
271 | | - $row[$j] = preg_replace("/\015(\012)?/", "\012", $row[$j]); |
| 273 | + $field = preg_replace("/\015(\012)?/", "\012", $field); |
272 | 274 | } |
273 | 275 |
|
274 | 276 | // remove CRLF characters within field |
275 | 277 | if ( |
276 | 278 | isset($GLOBALS[$GLOBALS['what'] . '_removeCRLF']) && $GLOBALS[$GLOBALS['what'] . '_removeCRLF'] |
277 | 279 | ) { |
278 | | - $row[$j] = str_replace( |
| 280 | + $field = str_replace( |
279 | 281 | [ |
280 | 282 | "\r", |
281 | 283 | "\n", |
282 | 284 | ], |
283 | 285 | '', |
284 | | - $row[$j] |
| 286 | + $field |
285 | 287 | ); |
286 | 288 | } |
287 | 289 |
|
288 | 290 | if ($GLOBALS['csv_enclosed'] == '') { |
289 | | - $schema_insert .= $row[$j]; |
| 291 | + $insertValues[] = $field; |
290 | 292 | } else { |
291 | 293 | // also double the escape string if found in the data |
292 | 294 | if ($GLOBALS['csv_escaped'] != $GLOBALS['csv_enclosed']) { |
293 | | - $schema_insert .= $GLOBALS['csv_enclosed'] |
| 295 | + $insertValues[] = $GLOBALS['csv_enclosed'] |
294 | 296 | . str_replace( |
295 | 297 | $GLOBALS['csv_enclosed'], |
296 | 298 | $GLOBALS['csv_escaped'] . $GLOBALS['csv_enclosed'], |
297 | 299 | str_replace( |
298 | 300 | $GLOBALS['csv_escaped'], |
299 | 301 | $GLOBALS['csv_escaped'] . $GLOBALS['csv_escaped'], |
300 | | - $row[$j] |
| 302 | + $field |
301 | 303 | ) |
302 | 304 | ) |
303 | 305 | . $GLOBALS['csv_enclosed']; |
304 | 306 | } else { |
305 | 307 | // avoid a problem when escape string equals enclose |
306 | | - $schema_insert .= $GLOBALS['csv_enclosed'] |
| 308 | + $insertValues[] = $GLOBALS['csv_enclosed'] |
307 | 309 | . str_replace( |
308 | 310 | $GLOBALS['csv_enclosed'], |
309 | 311 | $GLOBALS['csv_escaped'] . $GLOBALS['csv_enclosed'], |
310 | | - $row[$j] |
| 312 | + $field |
311 | 313 | ) |
312 | 314 | . $GLOBALS['csv_enclosed']; |
313 | 315 | } |
314 | 316 | } |
315 | 317 | } else { |
316 | | - $schema_insert .= ''; |
| 318 | + $insertValues[] = ''; |
317 | 319 | } |
318 | | - |
319 | | - if ($j >= $fields_cnt - 1) { |
320 | | - continue; |
321 | | - } |
322 | | - |
323 | | - $schema_insert .= $GLOBALS['csv_separator']; |
324 | 320 | } |
325 | 321 |
|
| 322 | + $schema_insert = implode($GLOBALS['csv_separator'], $insertValues); |
326 | 323 | if (! $this->export->outputHandler($schema_insert . $GLOBALS['csv_terminated'])) { |
327 | 324 | return false; |
328 | 325 | } |
|
0 commit comments