slogan3

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

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.