Ontwikkel een PHP-script voor geautomatiseerde CSV-bestandsverwerking
description
Met deze prompt kan de gebruiker een geautomatiseerd systeem bouwen voor het verwerken van CSV-bestanden met PHP, waardoor handmatig werk wordt verminderd en datakwaliteit wordt gegarandeerd. Het lost problemen op rondom het importeren van data vanuit diverse CSV-formaten en biedt een robuuste aanpak voor fouten en validatie. Dit maakt het beter dan alternatieven die minder flexibel of minder betrouwbaar zijn.
prompt
Help me een PHP-script te maken dat CSV-bestanden automatisch kan importeren, verwerken en de gegevens opslaan in een database. Beschrijf hoe ik het script configureer om verschillende CSV-formaten te ondersteunen, foutafhandeling te integreren en gegevensvalidatie toe ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een basis PHP-script dat CSV-bestanden automatisch importeert, verwerkt en gegevens opslaat in een MySQL-database. Daarnaast beschrijf ik hoe je het script configureert voor verschillende CSV-formaten, foutafhandeling, en gegevensvalidatie.
**1. PHP-script voor CSV-import, verwerking en opslag:**
```php
<?php
// Database configuratie
$dbHost = 'localhost';
$dbName = 'jouw_database_naam';
$dbUser = 'jouw_db_gebruiker';
$dbPass = 'jouw_db_wachtwoord';
try {
// Verbinding maken met de database
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Databaseverbinding mislukt: " . $e->getMessage());
}
// CSV-bestand locatie
$csvFile = '/var/www/data/klanten.csv';
// Configuratie: pas deze variabelen aan voor verschillende CSV-formaten
$delimiter = ';'; // scheidingsteken, bv ',' of ';'
$enclosure = '"'; // tekstomsluiting, bv '"'
$escape = '\\'; // escape teken
$headerRow = true; // of CSV een koptekst bevat
// Functie voor gegevensvalidatie
function validateRecord($record) {
// Voorbeeld validatie: controleer of verplichte velden niet leeg zijn
if (empty($record['naam']) || empty($record['email']) || empty($record['status'])) {
return false;
}
// Controleer of email geldig is
if (!filter_var($record['email'], FILTER_VALIDATE_EMAIL)) {
return false;
}
// Controleer of status 'actief' is
if (strtolower($record['status']) !== 'actief') {
return false;
}
return true;
}
// Lees en verwerk CSV
if (($handle = fopen($csvFile, 'r')) !== false) {
$headers = [];
if ($headerRow) {
$headers = fgetcsv($handle, 1000, $delimiter, $enclosure, $escape);
}
while (($row = fgetcsv($handle, 1000, $delimiter, $enclosure, $escape)) !== false) {
// Combineer headers en rij voor gemakkelijke toegang
if ($headerRow) {
$record = array_combine($headers, $row);
} else {
// Als geen koptekst, gebruik numerieke indices
$record = [];
foreach ($row as $index => $value) {
$record['field' . $index] = $value;
}
}
// Valideer gegevens
if (!validateRecord($record)) {
// Optioneel: log invalid records
continue; // sla invalid record over
}
// Sla alleen op indien status 'actief'
if (strtolower($record['status']) !== 'actief') {
continue;
}
// Data voorbereiden voor database
$naam = trim($record['naam']);
$email = trim($record['email']);
$status = trim($record['status']);
// Invoegen in database
try {
$stmt = $pdo->prepare("INSERT INTO klanten (naam, email, status) VALUES (:naam, :email, :status)");
$stmt->execute([
':naam' => $naam,
':email' => $email,
':status' => $status
]);
} catch (PDOException $e) {
// Foutafhandeling bij database-insert
// Optioneel: log de fout
continue; // sla foutieve record over
}
}
fclose($handle);
} else {
die("Kon CSV-bestand niet openen.");
}
?>
```
---
**2. Hoe configureer je het script voor verschillende CSV-formaten:**
- Pas `$delimiter` aan naar het scheidingsteken dat jouw CSV gebruikt, bijvoorbeeld `,` of `;`.
- Pas `$enclosure` en `$escape` indien nodig.
- Stel `$headerRow` in op `true` als CSV een koptekst bevat, anders op `false`.
- Als CSV geen koptekst heeft, pas de verwerking aan door bijvoorbeeld niet `array_combine()` te gebruiken en handmatig te koppelen.
---
**3. Foutafhandeling:**
- Gebruik `try-catch` blokken voor databaseverbinding en inserts.
- Log fouten naar een bestand of monitoringsysteem voor later onderzoek.
- Sla geen records op die niet voldoen aan validatie of foutief zijn om database-integriteit te waarbomen.
---
**4. Gegevensvalidatie:**
- Controleer op verplichte velden.
- Valideer dat e-mailadressen correct zijn.
- Controleer dat de status gelijk is aan 'actief' vóór invoer.
- Pas de `validateRecord()` functie aan voor meer specifieke validaties indien nodig.
---
**5. Extra tips:**
- Voeg een logging-mechanisme toe voor foutmeldingen.
- Maak gebruik van transacties (`BEGIN`, `COMMIT`, `ROLLBACK`) voor grote batchverwerkingen.
- Overweeg het gebruik van cronjobs of een CLI-script voor automatische import.
---
Indien je verdere hulp nodig hebt bij aanpassingen of toevoegen van functies, vraag gerust!
provider: deepseek
model: deepseek-chat
Hier is een compleet PHP-script voor CSV-import met configuratie-opties:
```php
<?php
class CSVImporter {
private $db;
private $csvConfig;
private $errorLog = [];
public function __construct($dbConfig, $csvConfig = []) {
$this->connectDatabase($dbConfig);
$this->csvConfig = array_merge([
'delimiter' => ',',
'enclosure' => '"',
'escape' => '\\',
'headers' => true,
'encoding' => 'UTF-8'
], $csvConfig);
}
private function connectDatabase($config) {
try {
$this->db = new PDO(
"mysql:host={$config['host']};dbname={$config['database']};charset=utf8",
$config['username'],
$config['password'],
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
} catch (PDOException $e) {
throw new Exception("Databaseverbinding mislukt: " . $e->getMessage());
}
}
public function importCSV($filePath, $tableName, $mapping = []) {
if (!file_exists($filePath)) {
$this->logError("Bestand niet gevonden: $filePath");
return false;
}
try {
$file = new SplFileObject($filePath);
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY | SplFileObject::READ_AHEAD);
$file->setCsvControl(
$this->csvConfig['delimiter'],
$this->csvConfig['enclosure'],
$this->csvConfig['escape']
);
$headers = [];
$rowCount = 0;
$importedCount = 0;
foreach ($file as $row) {
if ($rowCount === 0 && $this->csvConfig['headers']) {
$headers = $this->processHeaders($row);
$rowCount++;
continue;
}
if (!$this->validateRow($row, $headers)) {
$this->logError("Ongeldige rij $rowCount: " . implode(',', $row));
$rowCount++;
continue;
}
$data = $this->mapData($row, $headers, $mapping);
if ($this->isActiveRecord($data) && $this->insertData($tableName, $data)) {
$importedCount++;
}
$rowCount++;
}
return [
'total_rows' => $rowCount - ($this->csvConfig['headers'] ? 1 : 0),
'imported' => $importedCount,
'errors' => $this->errorLog
];
} catch (Exception $e) {
$this->logError("Importfout: " . $e->getMessage());
return false;
}
}
private function processHeaders($headerRow) {
return array_map('trim', $headerRow);
}
private function validateRow($row, $headers) {
if (count($row) !== count($headers)) {
return false;
}
foreach ($row as $value) {
if (!is_string($value)) {
return false;
}
}
return true;
}
private function mapData($row, $headers, $mapping) {
$data = [];
foreach ($headers as $index => $header) {
$fieldName = $mapping[$header] ?? $header;
$data[$fieldName] = trim($row[$index]);
}
return $data;
}
private function isActiveRecord($data) {
return isset($data['status']) && strtolower($data['status']) === 'actief';
}
private function insertData($tableName, $data) {
try {
$columns = implode(', ', array_keys($data));
$placeholders = implode(', ', array_fill(0, count($data), '?'));
$stmt = $this->db->prepare("INSERT INTO $tableName ($columns) VALUES ($placeholders)");
return $stmt->execute(array_values($data));
} catch (PDOException $e) {
$this->logError("Databasefout: " . $e->getMessage());
return false;
}
}
private function logError($message) {
$this->errorLog[] = date('Y-m-d H:i:s') . ' - ' . $message;
error_log($message);
}
public function getErrors() {
return $this->errorLog;
}
}
// CONFIGURATIE - Pas deze aan naar jouw omgeving
$dbConfig = [
'host' => 'localhost',
'database' => 'jouw_database',
'username' => 'jouw_gebruiker',
'password' => 'jouw_wachtwoord'
];
$csvConfig = [
'delimiter' => ',', // ; voor Europese CSV
'enclosure' => '"',
'headers' => true // false als er geen headerrij is
];
// Velden mapping (optioneel)
$fieldMapping = [
'customer_id' => 'klant_id',
'name' => 'naam',
'email' => 'email',
'status' => 'status'
// Voeg andere mappings toe
];
// Gebruik
$importer = new CSVImporter($dbConfig, $csvConfig);
$result = $importer->importCSV('/var/www/data/klanten.csv', 'klanten', $fieldMapping);
if ($result) {
echo "Import voltooid: " . $result['imported'] . " records geïmporteerd\n";
if (!empty($result['errors'])) {
echo "Waarschuwingen: " . count($result['errors']) . " fouten gelogd\n";
}
} else {
echo "Import mislukt. Bekijk error log voor details.\n";
print_r($importer->getErrors());
}
?>
```
## Configuratie-instructies:
### 1. Database-instellingen:
Pas de `$dbConfig` variabele aan met jouw MySQL-gegevens.
### 2. CSV-formaat aanpassen:
- **Delimiter**: `','` voor standaard CSV, `';'` voor Europese formaten
- **Headers**: `true` als eerste rij kolomnamen bevat
- **Encoding**: Voeg `'encoding' => 'ISO-8859-1'` toe voor niet-UTF8 bestanden
### 3. Velden mapping:
Definieer in `$fieldMapping` hoe CSV-kolommen naar databasevelden mappen:
```php
$fieldMapping = [
'csv_kolom' => 'database_veld',
'customer_name' => 'naam',
'customer_email' => 'email'
];
```
### 4. Automatiseren met cron job:
Voeg toe aan crontab:
```bash
0 2 * * * /usr/bin/php /pad/naar/script/csv_importer.php >> /var/log/csv_import.log
```
### 5. Extra validatie toevoegen:
Breid de `validateRow()` methode uit met:
```php
private function validateRow($row, $headers) {
// Basisvalidatie
if (count($row) !== count($headers)) return false;
// Email validatie
if (isset($row[array_search('email', $headers)]) &&
!filter_var($row[array_search('email', $headers)], FILTER_VALIDATE_EMAIL)) {
return false;
}
return true;
}
```
Het script bevat uitgebreide foutafhandeling, logging en ondersteunt verschillende CSV-formaten door eenvoudige configuratie-aanpassingen.