Wat is de bedoeling? Een csv file met daarin Naam, Voornaam, geboortedatum, bestandsnaam. Er is een bestaande database waarin die Naam al dan niet voorkomt. Zit die Naam, geboortedatum al in de database dan moet die geupdated worden met de bestandsnaam (een pdf file). Indien niet dan moet er een nieuw record aangemaakt worden met de gegeven variabelen.
Code staat hieronder. Ik krijg geen foutmeldingen. Het script wordt blijkbaar uitgevoerd. Ik zie al de lijnen die in de csv zitten maar geen enkel wordt geupdated of bijgevoegd. Ziet er iemand waar ik in de fout ga? Alvast bedankt voor eventuele tips

<?php
// inladen instellingen
include '../instellingen.php';
$conn = new mysqli($database_adres, $database_login_naam, $database_login_wachtwoord, $database_naam);
//connectie testen
if ($conn->connect_error)
{
	die("verbinding mislukt: ".$conn->connect_error);
}

if(isset($_POST['importSubmit'])){
    
    // Toestane mime types
    $csvMimes = array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain');
    
    // Valideren als het een toegestane csv file is.
    if(!empty($_FILES['file']['name']) && in_array($_FILES['file']['type'], $csvMimes)){
        
        // If the file is uploaded
        if(is_uploaded_file($_FILES['file']['tmp_name'])){
            
            // Open uploaded CSV file in read-only mode
            $csvFile = fopen($_FILES['file']['tmp_name'], 'r');
            
            // Skip the first line
            fgetcsv($csvFile);
            
            // Haal data uit CSV file lijn per lijn
            while(($line = fgetcsv($csvFile)) !== FALSE){ 
                // Get rij data
                $naam   = $line[0]; 
                $voornaam  = $line[1];
                $gebdatum = $line[2];
                $bestand = $line[3];
				// Hier worden nog enkele vaste variabelen gemaakt.
                $gebgem = "/";
				$overldatum = "00-00-0000";
				$overlgem = "/";
				$site = "https://****.be/";
				$map = "weterring/hk-wr-data/";
				$verz = "hk-westerring";
				$type = "RB";
				// Uitlezen van de gegevens in de csv
				echo $naam." ".$voornaam." ".$gebdatum." ".$bestand."<br>";
			
                // Check of er reeds records zijn met dezelfde Naam, Voornaam, gebdatum
                $sqlprev = "SELECT IDR FROM rouwbrief WHERE Naam LIKE '$naam%' AND Voornaam LIKE '%$voornaam%' AND gebdatum LIKE '$gebdatum%'";
                $result = $conn->query($sqlprev);
				//$prevResult = $db->query($prevQuery);
                
                if ($result->num_rows >= 0)
					{
                    // Update member data in the database
                    $sqlupd = "UPDATE rouwbrief SET bestandsnaam = '".$bestand."' WHERE Naam LIKE '".$naam."' AND gebdatum LIKE '".$gebdatum."'";
                }else{
                    /*Insert member data in the database
					Teller start op 13018685 omdat IDR telkens 1 moet verhoogt worden per nieuw record. Kan niet met autincrement.
					Omdat de eerste 2 cijfers van IDR ook een verwijzing zijn naar een verzameling.
					*/

					$mijnbestand = fopen("telleridr.txt", "w") or die("Kan bestand niet openen!");	
					$idr=fgets($mijnbestand);
					echo $idr;
                    $sqlins = "INSERT INTO rouwbrief (IDR, Naam, Voornaam, gebdatum, GebGemeente, overldatum, OverlGemeente, site, map, bestandsnaam, verzameling, Type) 
					VALUES ('".$idr."',
							'".$naam."',
							'".$voornaam."',
							'".$gebdatum."',
							'".$gebgem."',
							'".$overldatum."',
							'".$overlgem."',
							'".$site."',
							'".$map."',
							'".$bestand."',
							'".$verz."',
							'".$type."')";
					
					
					$idr=$idr+1;
					fwrite($mijnbestand, $idr);
					fclose($mijnbestand);
                }
				
            }
            
            // Close opened CSV file
            fclose($csvFile);
            
            $qstring = '?status=succ';
        }else{
            $qstring = '?status=err';
        }
    }else{
        $qstring = '?status=invalid_file';
    }
}

// Redirect to the listing page
// header("Location: csvupload.php".$qstring);
voortbouwend op de CREATE query van Adoptive op 11:02:


ALTER TABLE `rouwbrief`
	CHANGE COLUMN `Naam` `Naam` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_general_ci' AFTER `IDR`,
	ADD UNIQUE INDEX `Index 2` (`Naam`, `Geboortedatum`);


Ik hb de lengte van de kolom Naam ingekort tot 100 letters (leek me genoeg en 255 gaf problemen met het maken van een unique-index.

NB: ik ben zelf voorstander van de INSERT INTO tabel (kolommen) VALUES (waarden) syntax. Die werkt in meer databases dan alleen mysql. Maar vereist wel meer tellen van de kolommen en opletten met de volgorde.

Daarna wordt het PHP script vanaf de while regel:

<?php
           while( ( $line = fgetcsv($csvFile ) ) !== FALSE )
            {
                echo '<pre>' . print_r( $line, TRUE ) . '</pre>';
                // Get rij data
                $Naam          = $line[0];
                $Voornaam      = $line[1];
                $Geboortedatum = $line[2];
                $Bestandsnaam  = $line[3];

                // Hier worden nog enkele vaste variabelen gemaakt.
                $GeboorteGemeente  = "/";
                $OverledenDatum    = "0000-00-00";
                $OverledenGemeente = "/";
                $Site              = "https://****.be/";
                $Map               = "weterring/hk-wr-data/";
                $Verzameling       = "hk-westerring";
                $Type              = "RB";

                $sqlinsert = "INSERT INTO rouwbrief SET
                        Naam          = '$Naam',
                        Voornaam      = '$Voornaam',
                        Geboortedatum = '$Geboortedatum',
                        GeboorteGemeente  = '$GeboorteGemeente',
                        OverledenDatum    = '$OverledenDatum',
                        OverledenGemeente = '$OverledenGemeente',
                        Site          = '$Site',
                        Map           = '$Map',
                        Bestandsnaam  = '$Bestandsnaam',
                        Verzameling   = '$Verzameling',
                        Type          = '$Type'
                      ON DUPLICATE UPDATE Bestandsnaam  = '$Bestandsnaam';";

                    echo '<p>' . $sqlinsert . '</p>';
                    $result = $db->query( $sqlinsert );

            } // end while
?>


Enne:
Dit blijft misgaan als er in je invoer ergens een ' staat.
Ondertussen heb ik mijn eigen script draaiend gekregen en werkt het naar behoren. Na wat bijkomende moeilijkheden die opdoken. Zoals een bestandsnaam met spaties bijvoorbeeld "naam voornaam cijfers.pdf" wordt wel in de database gestoken maar als je dit wil uitlezen krijg je de foutmelding bestand niet gevonden. Dus alle bestandsnamen moeten aanpassen naar "naam_voornaam_cijfers.pdf". Dus geen spaties in bestandsnamen. En ook alle letters zoals é, è, ç, à en dergelijke vervangen door de pure letter. Blijkbaar worstelt MariaDB met dergelijke letters of is het de browser. Ik heb in elk geval nog niet gevonden wat de juiste UTF zou moeten zijn. Dit terzijde.
In elk geval aan iedereen bedankt voor de voorbeelden. Ik neem in ieder geval die ON DUPLICATE UPDATE mee naar de toekomst.
Ik heb in elk geval nu een oplossing om een index van ruim 20000 records te updaten met de bestandsnaam. Het spaart enorm vel werk ten opzichte van het manueel aanpassen en toevoegen.
Ikzelf gebruik utf8mb4, die ook ondersteuning voor emoji's heeft. Als je die gebruikt moet je afhankelijk van je serversetting deze collation ook gebruiken in de charset functie van MySQLi. En uiteraard moet het hele script ook UTF-8 headers hebben.
Spaties in filenames is zelden een goed idee.
Maar als je dat hebt: zorg dat je html in elkgeval een link tussen "" heeft staan.

Dus niet <a href=bestand.pdf> maar <a href="bestand.php"> want anders snapt je browser niet waar je linkje eindigt.
<a href=bestand met spaties.pdf> zal zoeken naar een bestand genaamd "bestand" en "met" is kennelijk een property die de browser niet kent en dus negeert.

Maar met een _ is een stabielere oplossing.

daarbij is het ook zo, dat het liefst jouw script en niet de uploader kiest voor de bestandsnaam.

Een é in een bestandsnaam gaat ook niet per se goed :-).
Converteren naar een "e" is een goede oplossing, maar met rawurlencode() zou ook kunnen. Dan wordt een spatie %20 en op vergelijkbare manier wordt een é omgevormd. (zoek ik even niet op). De browser weet dat vervolgens weer terug te zetten naar een spatie of een é. MAar het leest voor de mens moeizaam.

Sowieso is dat wel een goed idee op naast jouw conversie naar "e" die rawurlencode() in te zetten, voor het geval jouw lijstje omzettingen niet uitputtend is.
@Ivo P. Ondertussen hebben we geleerd om de indexen die we maken zo simpel mogelijk te houden. Een naam aan Bourdheau'dhui of D'Huyvetter kan met of zonder afkappingsteken zijn. Dus laten we deze er allemaal uit. Ook spaties. Namen zoals Van den Bossche, vanden Bossche, Vandenbossche schrijven we op eenzelfde manier. Voor degene die opzoekt is de regel dan duidelijk zoek met de naam zonder spaties of speciale tekens. De juiste schrijfwijze kan hij dan terug vinden in de scan van het document. Maar wat is juist? Iedereen die zich met familiekunde bezig houdt weet dat familienamen door de eeuwen heen soms veranderen. Ondertussen ben ik anderhalf jaar bezig met onze site. Ik heb al veel geleerd. Leer nog elke dag bij om een index van ondertussen 100 000 namen bij te houden waar ruim 60 000 reeds voorzien zijn van een scan. Dat komt uit 7 verschillende verzamelingen van kringen of particulieren, alleen al het combineren vraagt veel werk. Van het scannen nog niet gesproken.

Reageren